본문 바로가기
공부/Algorithms w.Java

프로그래머스 크레인 인형뽑기 게임; java

by thegreatjy 2021. 9. 25.
728x90

- 이진배열의 length는 행의 개수

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.util.Stack;
 
public class Prog_1 {
    public static int solution(int[][] board, int[]moves) {
        int answer=0;
        //바구니
        Stack<Integer> stk=new Stack<>();
        
        //board에서 처음 인형이 있는 칸(맨 윗칸)을 기억한다. exist 배열에 저장
        int[] exist= new int[board.length];
        for(int i=0;i<board.length;i++) {//board의 c
            exist[i]=-1;    //exist 배열을 -1로 초기화
            for(int j=0;j<board.length;j++) {//board의 r
                if(board[j][i]==0) {//board i열을 위에서 아래까지 탐색
                    continue;        //인형이 없으면(0) 계속 탐색
                }else {                //인형이 있으면 위치(높이)를 저장하고 끝
                    exist[i]=j;
                    break;
                }
            }
        }
        /*
        System.out.print("exist 배열 : ");
        for(int i=0;i<board.length;i++) {
            System.out.print(exist[i]+" ");
        }
        System.out.println("");
        */
        
        //moves만큼 인형을 뽑는다.
        for(int i=0;i<moves.length;i++) {
            int c=moves[i]-1;
            int r=exist[c];
            int pick=-1;
            int prev=-1;
            //해당 열의 board에 인형이 있을 경우에만 인형을 뽑아 바구니에 넣는다.
            if(r>=0 && r<=board.length-1) {
                pick=board[r][c];
                if(!stk.isEmpty() && stk.peek()==pick) {//중복 인형일 경우
                    stk.pop();
                    answer=answer+2;
                }else {
                    stk.push(pick);
                }
                board[r][c]=0;
                exist[c]=exist[c]+1;
            }
            /*
            System.out.print("\n exist 배열 : ");
            for(int m=0;m<board.length;m++) {
                System.out.print(exist[m]+" ");
            }
            System.out.println("");
            */
        }
        
        return answer;
        
    }
    /*
    public static void main(String[] args) {
        int [][] board={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};
        int [] moves={1,5,3,5,1,2,1,4};
        int result=solution(board, moves);
        System.out.println(result);
    }
    */
 
}
cs

위 코드는 이클립스에서 테스트할 때 코드

 

아래 코드는 프로그래머스 제출용 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.Stack;
class Solution {
    public static int solution(int[][] board, int[]moves) {
        int answer=0;
        //바구니
        Stack<Integer> stk=new Stack<>();
        
        //board에서 처음 인형이 있는 칸(맨 윗칸)을 기억한다. exist 배열에 저장
        int[] exist= new int[board.length];
        for(int i=0;i<board.length;i++) {//board의 c
            exist[i]=-1;    //exist 배열을 -1로 초기화
            for(int j=0;j<board.length;j++) {//board의 r
                if(board[j][i]==0) {//board i열을 위에서 아래까지 탐색
                    continue;        //인형이 없으면(0) 계속 탐색
                }else {                //인형이 있으면 위치(높이)를 저장하고 끝
                    exist[i]=j;
                    break;
                }
            }
        }
        
        //moves만큼 인형을 뽑는다.
        for(int i=0;i<moves.length;i++) {
            int c=moves[i]-1;
            int r=exist[c];
            int pick=-1;
            int prev=-1;
            //해당 열의 board에 인형이 있을 경우에만 인형을 뽑아 바구니에 넣는다.
            if(r>=0 && r<=board.length-1) {
                pick=board[r][c];
                if(!stk.isEmpty() && stk.peek()==pick) {//중복 인형일 경우
                    stk.pop();
                    answer=answer+2;
                }else {
                    stk.push(pick);
                }
                board[r][c]=0;
                exist[c]=exist[c]+1;
            }
        }
        return answer;
}
}
cs

처음에 생각했을 때, 이중반복 피하려고 맨 위에 있는 인형을 먼저 찾아서 저장하는 방법을 택했다.

그런데 지금보니까 빅오는 똑같은거 같은데,, 심지어 더 걸리는 것 같다..... 

걍 포문 두번 돌리면서 탐색하는게 빠르네,,,,,,,,,,,,,,,,,,,,,,,

일단 답은 맞았으니까,,,,,,,,,,,,,,

728x90

'공부 > Algorithms w.Java' 카테고리의 다른 글

프로그래머스 67256-키패드 누르기; java  (0) 2021.11.29
백준 10026; java  (0) 2021.10.04
프로그래머스-괄호 변환; java  (0) 2021.09.28
백준-1655; java  (0) 2021.09.24
2020.10.10  (0) 2020.10.10