<algorithm> 2. 10026번 RGB
by BFine반응형
RGB
RRR
GGG -> 답:3 2(색명은 R-G 하나로 보면 된다)
BBB
주어지면 그 해당 영역을 구하는 문제.
DFS를 통해 모든 경로를 탐색하고 영역수를 증가시키면 된다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 Public class RGB {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubBufferedReader 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 stubthis.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 stubthis.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