알고리즘 풀이/프로그래머스

[프로그래머스][JAVA] [1차] 프렌즈4블록 (구현)

배게 2022. 4. 2. 04:10
728x90

좌표 설정 (nx = x+dx[k])를 잘못해서

( (ny = x+dy[k])이런 식으로 실수함 )

 

자꾸 IndexOutOfRangeException나고 잘못나옴.. 그냥 빠르게 하는 것보다

확실하게 하면서 속도 늘려야함.. 정확성 100%를 유지하면서 속도를 늘려야함

그게 아니면 속도 의미 없음 그냥 사고나기 딱 좋음

 

IndexOutOfRangeException이 너무 나옴.. shiftBoard에서도 빠다리 너무남 엄청헤맷다..

 

 

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.awt.Point;
import java.util.*;
 
class Solution {
    private static char[][] board;
    private static Stack<Point> st;
    private static int m;
    private static int n;
    private static int answer;
    static int[] dx = { 0101 };
    static int[] dy = { 0011 };
    
    public int solution(int m, int n, String[] boardStr) {
        this.m = m;
        this.n = n;
        board = new char[m][n];
        st = new Stack<>();
        
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                board[i][j] = boardStr[i].charAt(j);
            }
        }
        
        while(true){
            for(int i=0; i<m; i++){
                for(int j=0; j<n; j++){
                    findBoard(i,j);
                }
            }
            // viewBoard();
            
            if(st.isEmpty()){
                break;
            }
            // System.out.println(st.size());
            
            
            deleteBoard();
            shiftBoard();
                
            // viewBoard();
            
        }
        
        return answer;
    }
    
    private void findBoard(int x, int y){   
 
        for(int k=0; k<4; k++){
            int nx = x+dx[k];
            int ny = y+dy[k];
            if(!(0<=nx && nx<&& 0<=ny && ny<&& 
               board[x][y]!=' ' && board[x][y] == board[nx][ny]) ){
                return;
            }
            
        }
        st.push(new Point(x,y));       
 
        
        
    }
    
    
    private void deleteBoard(){
        while(!st.isEmpty()){
            Point p = st.pop();
            for(int k=0; k<4; k++){
                if(board[p.x+dx[k]][p.y+dy[k]]!=' '){
                    board[p.x+dx[k]][p.y+dy[k]] = ' ';
                    answer++;
                }
            }
        }
    }
    
    private void shiftBoard(){
        for(int i=m-2; i>=0; i--){
            for(int j=0; j<n; j++){
                if(board[i][j]!=' ' && board[i+1][j]==' '){
                    int ni = i+1;
                    for( ; ni<m; ni++){
                        if(board[ni][j]!=' '){
                            break;
                        }
                    }
                    ni--;
                    board[ni][j] = board[i][j];
                    board[i][j] = ' ';
                }
            }
        }
    }
    
    
    private void viewBoard(){
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                System.out.print(board[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println();
    }
}
cs