크레인 인형뽑기

https://programmers.co.kr/learn/courses/30/lessons/64061

package programmers.p64061;

import java.util.ArrayList;

public class Solution {

    ArrayList<Integer> MovedDolls = new ArrayList<>();

    public int solution(int[][] board, int[] moves) {
        moveDolls(board, moves);
        return checkDuplicates();
    }

    private void moveDolls(int[][] board, int[] moves) {

        for (int i = 0; i < moves.length; i++) {
            for (int j = 0; j < board.length; j++) {

                int lastIndex = board.length-(j+1); 
                if (board[moves[i] - 1][lastIndex] != 0) {
                    int caughtDoll = board[moves[i] - 1][lastIndex];
                    MovedDolls.add(caughtDoll);
                    board[moves[i] - 1][lastIndex] = 0; 
                    break; 
                }
            }

        }
    }

    private int checkDuplicates() {
        int count = 0;

        for (int i = 0; i < MovedDolls.size(); i++ ) {
            if (i+1 == MovedDolls.size()) {
                break;
            }
            if (MovedDolls.get(i) == MovedDolls.get(i+1) ) {
                count += 2;
                i++;
            }

        }

        return count;
    }
}

어떻게 접근했나?

1. move에 따라 쌓여지는 인형들 적어봄

0은 공백
move 4 -> 2
move 1 -> 0
move 2 -> 3
move 1 -> 0
move 5 -> 3
move 3 -> 1
move 5 -> 1
move 1 -> 0

2. 0을 제외한 숫자를 보자

ArrayList에 0을 제외한 모든 숫자를 차례대로 담는다

같은 인형끼리 터진 인형을 세는 것이기 때문에
for문을 이용해서 같은숫자인지 비교해서 count 한다.
count되었으면 그 다음 비교를 위해서 i를 1 더해준다

문제 풀기 전..

move 4 -> 2
move 1 -> X
move 2 -> 3
move 1 -> X
move 5 -> 3
move 3 -> 1
move 5 -> 1
move 1 -> X

터뜨려서 사라진 인형의 갯수 -> return

첫번째 move한다.
move한 곳의 마지막인덱스의 값이 0인지 아닌지 체크한다
0이면 마지막인덱스-1이 마지막인덱스-1 이 0인지 아닌지 체크한다

마지막인덱스의 값이 0이 아니면 그 숫자를 임시 배열에 저장한다

moves가 다시 올걸 대비해서 저장한 숫자는 없는셈 치게 만들어야한다
그래야 다음에 왔을떄 없는셈 친 숫자 그 다음 숫자를 저장하니까.

boolean으로 앞뒤숫자가같은지 체크 만약에 ture이면
예) index[0], index[1], index[2] 이 모두 같은 값이다
일단 index[0]과 index[1]이 같은지체크한다
0과 1이 같으면 boolean true 같지않으면 false

true이면 int count +2 를 한다.

true이면 index[2]과 index[3]를 비교한다
false이면 index[1]과 index[2]를 비교한다

아니면,

그냥 moves로 집은 모든 숫자들을 담는다.
대신에 0이면 똑같은 배열에서 다시 집는다. 0이아니면 딱한번만 집는다.
집어서 새로운 배열에 넣는다 ArrayList가 좋을듯
중복값 0을 다 제거한다.

00002 0002 000000002 이배열을 체크할떄
2 2 2 이렇게 나올것이다.

그런다음에

boolean으로 앞뒤숫자가같은지 체크
예) ArrayList.get(0), ArrayList.get(1), ArrayList.get(2) 이 모두 같은 값이다
일단 0과 0이 같은지체크한다
0과 1이 같으면 boolean true 같지않으면 false

true이면 int count +2 를 한다.

true이면 index[2]과 index[3]를 비교한다
false이면 index[1]과 index[2]를 비교한다

처음에는 그냥 원래 있던 배열을 가지고 어떻게든 해보려했는데
그냥 팀원말대로 주워담은걸 0으로 바꾸면 되네....

느낀점

처음부터 끝까지 저렇게 상상할 필요가 없었던 거 같다.
코드짤때 모든게 다 바뀌기 때문이다.
정말 간략하게 어떻게 풀지 생각 하는 정도는 괜찮을 같다.
지나치게 생각을 많이한거 같다.
문제를 잘개쪼개서 절차대로 생각해서 쪼금씩 해결해나가다보면 답에 접근하게 되는것 같다.

한 개 주어진 테스트 케이스는 통과했는데 제출실패가 자꾸 떠서 열받는다. 저번에도 그랬는데 그때도 분명히 문제점이 있어서 그랬던거지만...특히 프로그래머스는 뭐가 문제인지 알려주지 않으니까 열받는다 ㅠ..

고려하지 못했던 거

혼자 해결을 못해서 팀원들에게 물어봤다
중간에 인형들이 터지면 위에서 인형이 내려오는건데
배열로 생각하니까 옆으로 쭉 나열되어있어서 그걸 생각치못했다.

좋은 웹페이지 즐겨찾기