Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

끄적끄적

2019 카카오 개발자 겨울 인턴십크레인 인형뽑기 게임 본문

알고리즘

2019 카카오 개발자 겨울 인턴십크레인 인형뽑기 게임

yenacathy97 2020. 9. 24. 20:00

나는 ArrayList를 통해 바구니를 구현 하였으나 제출 후에 확인해 보니 대부분 스택으로 푸신 것 같다. 

난 각 라인 별로 배열를 만들고 이를 다시 Arraylist로 저장하였다. 바구니도 Arraylist로 두어 모든 인형을 바구니에 넣은 뒤 해결하였다. 

 

또 처음 풀었을 때 테스트 케이스 1,2번에서 자꾸 틀리곤 했는데 질문을 참고한 결과 바구니에서 연속 같은 값의 인형을 뽑고 뽑은 인형의 위치보다 앞부분의 인형과 뒷부분의 인형이 같아도 사라져야 하기에, 다시 위치를 초기화해주어야 했다. 

[[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 2, 1, 0, 0], [0, 2, 1, 0, 0], [0, 2, 1, 0, 0]]
[1, 2, 3, 3, 2, 3, 1]
4

위의 테스트 케이스를 이용하라고 질문에 올라와 있어서 수정 후 맞출 수 있었다.  

올려둔 코드는 테스트를 위해 입력 받는 것까지 구현해 두었다. 

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;

public class App {

    public static void  main(String args[]){

        Scanner scanner= new Scanner(System.in);
        int n= scanner.nextInt();// 라인의 개수
        int m=scanner.nextInt(); // 한 라인의 들어갈 인형의 개수
        int board[][]=new int[n][m]; // 인형이 들어있는 판
        int mv=scanner.nextInt(); // 뽑을 라인의 위치
        int moves[]=new int[mv]; // 뽑을 라인의 위치가 들어있는 배열
        for(int i=0;i<mv;i++)
            moves[i]= scanner.nextInt();

        for(int i=0;i< n;i++){
            for(int j=0;j<m;j++)
                board[i][j]= scanner.nextInt();
        }
   //위까지 입력 받는 부분
        ArrayList<Integer[]> line= new ArrayList<Integer[]>();//각 라인당 리스트만듬

        for(int k=0;k<m;k++){
            Integer[] list=new Integer[n]; //한 라인의 인형들을 리스트로 저장하기 위한 변수
            for(int j=0;j<n;j++) {
                list[j]=board[j][k];
            }
            line.add(list); // 모든 라인을 받음
        }

       ArrayList<Integer> doll= new ArrayList<>();//바구니에 담긴 인형들
        Integer find=0; //바구니에 넣은 인형
        int k=0; // 바구니에 넣을 인형의 그 라인에서의  위치
       for(int i=0;i< moves.length;i++){
            find=0; //이전 값을 초기화
           while(find==0 && k!=n){ // 0이면 다음 값을 찾고, 줄 끝까지 0이면 아무 인형도 바구니에 넣지않음
               find= line.get(moves[i]-1)[k++]; // 배열의 인덱스는 0부터 시작하므로 1을 뺌
           }
           line.get(moves[i]-1)[k-1]=0; // 바구니에 넣은 인형에 값은 0으로 바꿔줌
           if(find!=0) // 찾은 인형이 존재하면
           doll.add(find); //바구니에 인형을 넣음
           k=0; // 위치 초기화
       }

        int answer=0; // 뽑은 인형의 개수
        for(int j=0;j<doll.size()-1;j++){ // 다음 값과 비교해주기 위해 전체 보다 하나 작은 값까지 j설정

            if(doll.get(j) ==doll.get(j+1)){ //두 인형의 값이 연달아 같으면
                doll.remove(j); // 그 위치의 인형을 뽑음
                doll.remove(j); // 인덱스가 당겨졌으니 다음 인형의 위치도 같다.
                j=-1; //처움 인형부터 다시 비교하기위해 -1로 초기화(j++될것이므로 -1)
                answer+=2; // 뽑은 인형 두개를 더해줌
            }

        }
        System.out.println("answer: "+answer);
    }
}

'알고리즘' 카테고리의 다른 글

백준 1700 멀티탭 스케줄링  (0) 2021.04.06
백준 14719 - 빗물(C++)  (0) 2021.03.31
11060: 점프점프  (0) 2020.08.05
백준 2407번 조합 풀이  (0) 2020.08.04
백준 1021 회전하는 큐  (0) 2020.07.09
Comments