Algorithm

[Programmers] 프렌즈4블록

프로그래민 2020. 5. 21. 00:37
반응형

간단한 시뮬레이션 문제이다.

자신을 기준 오른쪽, 대각선아래, 아래를 확인해가며 반복하여 찾는 단순 구현 문제이다. map을 down시키는 과정에 유의하며 구현하면 쉽게 구할수 있는 문제이다.

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
package programmers;
 
public class Solution_2018카카오_프렌즈4블록 {
    public static void main(String[] args) {
//        int m=4;int n=5;
//        String[] board= {"CCBDE", "AAADE", "AAABF", "CCBBF"};
    
        int m=6;int n=6;
        String[] board= {"TTTANT""RRFACC""RRRFCC""TRRRAA""TTMMMF""TMMTTJ"};
 
        System.out.println(solution(m,n,board));
    }
    
    
    static int solution(int m, int n, String[] board) {
        int answer = 0;
        
        char[][] map=new char[m][n];
        for(int i=0;i<m;i++) {
            for(int j=0;j<n;j++)
                map[i][j]=board[i].charAt(j);
        }
        while(true) {
            int[][] visit=new int[m][n];
            
            for(int i=0;i<m-1;i++) {
                for(int j=0;j<n-1;j++) {
                    check(i,j,visit,map);
                }
            }
            int count=0;
            for(int i=0;i<m;i++) {
                for(int j=0;j<n;j++) {
                    if(visit[i][j]==1) {
                        count+=1;
                        map[i][j]='0';
                    }
                }
            }
            if(count==0)
                break;
            
            answer+=count;
            moveDown(map,m,n);
        }
        
        
        return answer;
    }
    
    
    static void check(int i,int j,int[][] visit, char[][] map) {
        char ch1=map[i][j];
        char ch2=map[i][j+1];
        char ch3=map[i+1][j];
        char ch4=map[i+1][j+1];
        
        
        if(ch1!='0' && ch1==ch2 && ch1==ch3 && ch1==ch4) {
            visit[i][j]=1;visit[i][j+1]=1;
            visit[i+1][j]=1;visit[i+1][j+1]=1;
        }
    }
    
    static void moveDown(char[][] map,int m,int n) {
        for(int col=0;col<n;col++) {
            
            for(int zero=m-1;zero>0;zero--) {
                if(map[zero][col]=='0') {
                    for(int alp=zero-1;alp>=0; alp--) {
                        if(map[alp][col]!='0') {
                            char temp=map[alp][col];
                            map[alp][col]=map[zero][col];
                            map[zero][col]=temp;
                            
                            break;
                        }
                    }
                }
            }
        }
        
    }
}
 
                                
반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 11967. 불켜기  (0) 2020.05.21
[Programmers] 뉴스 클러스터링  (0) 2020.05.21
[Programmers] 셔틀버스  (0) 2020.05.17
[BOJ] 2887. 행성 터널  (0) 2020.05.17
[BOJ] 11660. 구간 합 구하기5  (0) 2020.05.16