인프런 커뮤니티 질문&답변

현상혁님의 프로필 이미지
현상혁

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

3. 크레인 인형뽑기

테스트 케이스 한 개 통과하지 못하는 문제

해결된 질문

작성

·

238

0

solution 코드를 아래와 같이 작성했습니다.

public static int solution(int n, int[][] board, int m, int[] moves) {
        int answer = 0;

        // stack 만들기
        List<Stack<Integer>> stacks = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            Stack<Integer> tmp = new Stack<>();
            for (int j = n - 1; j >= 0; j--) {
                if (board[j][i] == 0) break;
                tmp.push(board[j][i]);
            }
            stacks.add(tmp);
        }

        Stack<Integer> bucket = new Stack<>();
        for (int i : moves) {
            if (!stacks.get(i-1).isEmpty()){
                int newItem = stacks.get(i-1).pop();
                if (!bucket.isEmpty() && bucket.peek() == newItem) {
                    bucket.pop();
                    answer += 2;
                } else bucket.push(newItem);
            }
        }
        return answer;
}

board의 상단 인형에 접근하는 방법으로 저는 Stack의 List를 만들어 사용했고, 강사님은 직접 배열에 접근했다는 것이 차이점인 것 같습니다.

위 코드로 채점을 해보면 4번 test case까지는 통과하지만 마지막 5번 test case를 통과하지 못합니다. (리턴 : 22, 답 : 16)

코드의 효율성 문제를 떠나서 위 코드도 제대로 동작해야 될 것 같은데 마지막 케이스만 통과하지 못하는 이유를 도저히 못 찾겠네요ㅜㅜ

혹시 이유를 아시는 분이 계실까요..?ㅜ

답변 1

0

5번 문항 테스트 케이스를 잘 보시면 N번 째 줄의 인형을 쌓을 때 0 0 0 1 2 3 이런 식으로 쌓이는 경우 뿐 아니라 0 1 0 2 3 같은 경우도 있습니다.

if (board[j][i] == 0) break;
처럼 N번 째 줄에 대한 스택을 그만 쌓도록 하면 리턴값이 22 나올 겁니다.

현상혁님의 프로필 이미지
현상혁

작성한 질문수

질문하기