반응형
문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/64061
나의 코드
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
for(int move : moves){
for(int i = 0; i < board[0].length; i++){
int num = board[i][move - 1];
if(num > 0){
board[i][move - 1] = 0;
if(stack.isEmpty()){
stack.push(num);
}else{
if(num == stack.peek()){
stack.pop();
answer += 2;
}else{
stack.push(num);
}
}
break;
}
}
}
return answer;
}
}
개선 코드(각 열에 대한 스택을 생성)
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
// 1. 각 열을 스택으로 변환
List<Stack<Integer>> columns = new ArrayList<>();
for (int j = 0; j < board[0].length; j++) {
Stack<Integer> columnStack = new Stack<>();
for (int i = board.length - 1; i >= 0; i--) {
if (board[i][j] > 0) {
columnStack.push(board[i][j]);
}
}
columns.add(columnStack);
}
// 2. moves 처리
for (int move : moves) {
Stack<Integer> column = columns.get(move - 1);
if (!column.isEmpty()) {
int num = column.pop();
if (!stack.isEmpty() && stack.peek() == num) {
stack.pop();
answer += 2;
} else {
stack.push(num);
}
}
}
return answer;
}
}
각 열에 대한 스택을 생성하여 탐색 시간을 줄인 방식입니다.
알게 된 점
Stack 배열 초기화
Stack 배열을 선언한 후, 각 배열 요소에 Stack 객체를 초기화해야 사용 가능합니다. 초기화하지 않고 접근하려고 하면 NullPointerException이 발생합니다.
예제
// 1. Stack 배열 선언
Stack<Integer>[] stacks = new Stack[5];
// 2. 초기화하지 않고 값을 추가
stacks[0].push(1); // NullPointerException 발생!
해결 방법
// 1. Stack 배열 선언
Stack<Integer>[] stacks = new Stack[5];
// 2. 배열의 각 인덱스를 초기화
for (int i = 0; i < stacks.length; i++) {
stacks[i] = new Stack<>(); // Stack 객체 생성
}
// 3. 값 추가
stacks[0].push(1); // 정상 동작
반응형
'알고리즘 > Java' 카테고리의 다른 글
[프로그래머스] 같은 숫자는 싫어 - 12906 (Java) (0) | 2024.12.17 |
---|---|
[프로그래머스] 표 편집 - 81303 (Java) (0) | 2024.12.13 |
[프로그래머스] 주식가격 - 42584(Java) (0) | 2024.11.29 |
[프로그래머스] 괄호 회전하기 - 76502(Java) (0) | 2024.11.26 |
[프로그래머스] 짝지어 제거하기 - 12973 (Java) (0) | 2024.11.26 |