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 |