인프런 카카오 크레인

박은빈·2022년 11월 20일

코딩

목록 보기
16/19

문제알아서 찾아보시고 내가 생각한 풀이과정을 나열하겠다
카카오 인턴 코테라 그래서 무서웠는데 1번문제인건가 완전쉽다
하지만 아주 살짝 복잡하고 어이없는 부분에서 시간을 날렸기때문에 여기에 글을 작성한다

풀이과정

먼저 인형이 나열되어있는 이차원 배열을 입력받는다
그리고 인형을 뽑을 자리를 정하는 move배열을 입력받는다

누가봐도 스택을 이용하라는 듯한 문제이기때문에 스택을 이용해 문제를 해결했다

  1. move배열을 기준으로 그 칸에 해당하는 제일 위쪽 숫자를 집어와야된다
  2. 이때 위에 빈공간은 0이므로 0이 나오면 무시한다
  3. 0이 아닌 숫자가 나올경우 변수에 담은다음 그 숫자에 해당하는 배열을 0으로 바꾼 후 break를 한다
  4. 만약 끝까지 다 0이라면 변수에 0을 넣는다
  5. 꺼내온 숫자를 스택에 넣어야하는데 꺼내온 숫자가 0이라면 continue를 한다
  6. 또한 스택이 비어있다면 무조건 스택을 push를 시킨다(맞는 숫자가 없기때문)
  7. 그게 아니라면 제일 위쪽에 있는 숫자를 peek으로 불러와서 변수에 저장하고 스택 위쪽에 있는 숫자와 꺼내온 숫자를 비교해 숫자가 같다면 pop으로 제거하고 제거한 숫자2만큼 카운트를 증가시킨다
  8. 만약 숫자가 같이 않다면 push를 한다

코드

public class CraneDoll {
    public int solution(int[][] arr, int[] basketArr) {
        int result = 0;
        Stack<Integer> stack = new Stack<>();

        for(int i=0; i<basketArr.length; i++) {
            int catchNum = 0;
            int bNum = basketArr[i]-1;
            crane:for(int j=0; j<arr.length; j++) {
                if(arr[j][bNum]!=0) {
                    catchNum = arr[j][bNum];
                    arr[j][bNum] = 0;
                    break crane;
                }
            }

            System.out.println(catchNum);

            if(catchNum == 0) continue;
            else {
                if(stack.empty()) {
                    stack.push(catchNum);
                } else{
                    int lastNum = stack.peek();

                    if(lastNum == catchNum){
                        stack.pop();
                        result+=2;
                    } else {
                        stack.push(catchNum);
                    }
                }
            }
        }

        return result;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        CraneDoll main = new CraneDoll();

        int arrNum = sc.nextInt();
        int[][] arr = new int[arrNum][arrNum];

        for(int i=0; i<arr.length; i++) {
            for(int j=0; j<arr[0].length; j++) {
                arr[i][j] = sc.nextInt();
            }
        }

        int basketNum = sc.nextInt();
        int[] basketArr = new int[basketNum];

        for(int i=0; i<basketArr.length; i++) {
            basketArr[i] = sc.nextInt();
        }

        int result = main.solution(arr,basketArr);

        System.out.println(result);
    }
}

Keep

문제를 조그만 문제들로 쪼개서 풀어보는 방법

Problem

문제를 정확히 안읽는다
위에서 말한 시간낭비는 문제에서 "터진 인형들의 합"이라고 말했는데
나는 "터진 인형들의 쌍의 합"이라고 생각을해버려서 답이 계속 절반만 나와 거기서 시간을 낭비했다

Try

문제를 풀기위해서는 문제를 정확히 이해하는게 아주 중요하다
그러므로 문제를 정확히 이해하고 문제를 풀자

profile
안녕하세요

0개의 댓글