You will be fine

<algorithm> 2. 10026번 RGB

by BFine
반응형

RGB


RRR

GGG -> 답:3 2(색명은 R-G 하나로 보면 된다)

BBB


주어지면 그 해당 영역을 구하는 문제.

DFS를 통해 모든 경로를 탐색하고 영역수를 증가시키면 된다.


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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
Public class RGB {
 
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
 
        BufferedReader in=new BufferedReader
                (new InputStreamReader(System.in));
 
        StringTokenizer token=new StringTokenizer(in.readLine());
 
 
        int N=Integer.parseInt(token.nextToken());
        //System.out.println(N);
        char[][] graph=new char[N][N];
 
        for(int i=0;i<N;i++){
            token=new StringTokenizer(in.readLine());
            String a=token.nextToken();
            for(int j=0;j<N;j++){
                graph[i][j]=a.charAt(j);
            }
        }
 
 
        System.out.println(new Area(graph).getCount()+" "+new Area2(graph).getCount());
    }
 
}
class Area{
 
    char[][] graph;
    boolean[][] visited;
    char start;
    int count=0;
 
    public Area(char[][] graph) {
        // TODO Auto-generated constructor stub
        this.graph=graph;
        visited=new boolean[graph.length][graph.length];
 
 
        for(int i=0;i<graph.length;i++){
            for(int j=0;j<graph.length;j++){
                if(!visited[i][j]){
                    if(graph[i][j]=='R'){
                        r(i,j);
                        count++;
                    }else if(graph[i][j]=='G'){
                        g(i,j);
                        count++;
                    }else{
                        b(i,j);
                        count++;
                    }
                }
            }
        }
    }
 
 
    public void r(int i,int j){
        visited[i][j]=true;
        if((i+1)<graph.length&&!visited[i+1][j]&&graph[i+1][j]=='R'){
            r(i+1,j);
        }if((i-1)>=0&&!visited[i-1][j]&&graph[i-1][j]=='R'){
            r(i-1,j);
        }if((j+1)<graph.length&&!visited[i][j+1]&&graph[i][j+1]=='R'){
            r(i,j+1);
        }if((j-1)>=0&&!visited[i][j-1]&&graph[i][j-1]=='R'){
            r(i,j-1);
        }
 
    }
    public void g(int i,int j){
        visited[i][j]=true;
        if((i+1)<graph.length&&!visited[i+1][j]&&graph[i+1][j]=='G'){
            g(i+1,j);
        }if((i-1)>=0&&!visited[i-1][j]&&graph[i-1][j]=='G'){
            g(i-1,j);
        }if((j+1)<graph.length&&!visited[i][j+1]&&graph[i][j+1]=='G'){
            g(i,j+1);
        }if((j-1)>=0&&!visited[i][j-1]&&graph[i][j-1]=='G'){
            g(i,j-1);
        }
    }
    public void b(int i,int j){
        visited[i][j]=true;
        if((i+1)<graph.length&&!visited[i+1][j]&&graph[i+1][j]=='B'){
            b(i+1,j);
        }if((i-1)>=0&&!visited[i-1][j]&&graph[i-1][j]=='B'){
            b(i-1,j);
        }if((j+1)<graph.length&&!visited[i][j+1]&&graph[i][j+1]=='B'){
            b(i,j+1);
        }if((j-1)>=0&&!visited[i][j-1]&&graph[i][j-1]=='B'){
            b(i,j-1);
        }
    }
    public int getCount(){
        return count;
    }
 
}
 
class Area2{
 
    char[][] graph;
    boolean[][] visited;
    char start;
    int count=0;
 
    public Area2(char[][] graph) {
        // TODO Auto-generated constructor stub
        this.graph=graph;
        visited=new boolean[graph.length][graph.length];
 
 
        for(int i=0;i<graph.length;i++){
            for(int j=0;j<graph.length;j++){
                if(!visited[i][j]){
                    if(graph[i][j]=='R'||graph[i][j]=='G'){
                        rg(i,j);
                        count++;
                    }else{
                        b(i,j);
                        count++;
                    }
 
                }
            }
        }
 
    }
 
    public void rg(int i,int j){
        visited[i][j]=true;
        if((i+1)<graph.length&&!visited[i+1][j]&&(graph[i+1][j]=='R'||graph[i+1][j]=='G')){
            rg(i+1,j);
        }if((i-1)>=0&&!visited[i-1][j]&&(graph[i-1][j]=='R'||graph[i-1][j]=='G')){
            rg(i-1,j);
        }if((j+1)<graph.length&&!visited[i][j+1]&&(graph[i][j+1]=='R'||graph[i][j+1]=='G')){
            rg(i,j+1);
        }if((j-1)>=0&&!visited[i][j-1]&&(graph[i][j-1]=='R'||graph[i][j-1]=='G')){
            rg(i,j-1);
        }
 
    }
    public void b(int i,int j){
        visited[i][j]=true;
        if((i+1)<graph.length&&!visited[i+1][j]&&graph[i+1][j]=='B'){
            b(i+1,j);
        }if((i-1)>=0&&!visited[i-1][j]&&graph[i-1][j]=='B'){
            b(i-1,j);
        }if((j+1)<graph.length&&!visited[i][j+1]&&graph[i][j+1]=='B'){
            b(i,j+1);
        }if((j-1)>=0&&!visited[i][j-1]&&graph[i][j-1]=='B'){
            b(i,j-1);
        }
    }
    public int getCount(){
        return count;
    }
 
}
cs





링크  https://www.acmicpc.net/problem/10026


DFS 기본문제로 DFS 원리만 이해한다면 쉽게 풀 수 있다.






반응형

'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글

<Algorithm> 6. 2023번 신기한 소수  (0) 2018.04.11
<Algorithm> 5. 에라토스테네스의 체  (0) 2018.04.11
<Algorithm> 4. BFS  (0) 2018.04.11
<algorithm> 3. DFS  (0) 2018.03.30
<algorithm> 1. Queue  (0) 2018.02.22

블로그의 정보

57개월 BackEnd

BFine

활동하기