-
[ 백준 ][ 자바 ][ 10026 ][ 적록색약 ]코딩/알고리즘 2019. 2. 9. 14:04
오늘은 조금 난이도 있는 문제를 풀어볼까 했는데
친구 밥사주는 약속이 있어 간단한 문제를 얼른 찾아서 풀고 가야겠다 싶어서 풀었다.
이 문제는 일반 bfs에서 간단한 분기만 타주면 된다
문제에 출력은 두가지를 요구하는데 일반인과 , 적록색약이 볼수있는 색상 구분수다
적록색약은 빨강과 초록을 같은색으로 인지하는데
그점에 유의하여 R과 G를 같은색상이라고 생각하면 아주 간단하게 풀린다 .
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; /* * 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. * 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. * 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. * (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다) * 예를 들어, 그림이 아래와 같은 경우에 * RRRBB * GGBBB * BBBRR * BBRRR * RRRRR * 적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) * 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1) * 그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오. */ class point{ int y; int x; point(int y, int x){ this.y = y; this.x = x; } } public class Main_10026_적록색약 { static Queue
q = new LinkedList (); static int[] dx = {1, -1, 0, 0}; static int[] dy = {0 ,0 ,1, -1}; static String[][] MAP = new String[101][101]; static boolean[][] visited = new boolean[101][101]; static int N; static int originCount = 0; static int rgCount = 0; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); N = Integer.parseInt( st.nextToken() ); for( int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine(), ""); while(st.hasMoreTokens()) { String[] arr = st.nextToken().split(""); for( int j = 0 ; j < arr.length; j++) { MAP[i][j] = arr[j]; } } } //printMap(); for (int i = 0 ; i < N; i++) { for(int j = 0; j< N; j++) { if(visited[i][j] == false) { originBfs(i, j, MAP[i][j]); originCount++; } } } visited = new boolean[101][101]; for (int i = 0 ; i < N; i++) { for(int j = 0; j< N; j++) { if(visited[i][j] == false) { rgBfs(i, j, MAP[i][j]); rgCount++; } } } System.out.println(originCount+ " " + rgCount); } //일반 public static void originBfs(int y, int x, String color) { visited[y][x] = true; q.add(new point(y,x)); while(!q.isEmpty()) { point p = q.poll(); for( int i = 0; i < 4; i++) { int xx = p.x + dx[i]; int yy = p.y + dy[i]; if( xx >= 0 && xx < N && yy >=0 && yy < N) { //같은 컬러일경우 if( MAP[yy][xx].equals(color) && visited[yy][xx] == false) { visited[yy][xx] = true; q.add( new point( yy, xx )); } } } } } //적록색약 public static void rgBfs(int y, int x, String color) { visited[y][x] = true; q.add(new point(y,x)); while(!q.isEmpty()) { point p = q.poll(); for( int i = 0; i < 4; i++) { int xx = p.x + dx[i]; int yy = p.y + dy[i]; if( xx >= 0 && xx < N && yy >=0 && yy < N) { //적록색약 if( color.equals("R") || color.equals("G") ) { if( ( MAP[yy][xx].equals("R") || MAP[yy][xx].equals("G") ) && visited[yy][xx] == false) { visited[yy][xx] = true; q.add( new point( yy, xx )); } }else { if( MAP[yy][xx].equals(color) && visited[yy][xx] == false) { visited[yy][xx] = true; q.add( new point( yy, xx )); } } } } } } public static void printMap() { for (int i = 0 ; i < N; i++) { for(int j = 0; j< N; j++) { System.out.print(MAP[i][j]+ " "); } System.out.println(); } } } '코딩 > 알고리즘' 카테고리의 다른 글
[2018 윈터코딩][ python ] 스킬트리 (0) 2019.03.02 [ 백준 ][ 자바 ][ 1260 ] DFS와 BFS (0) 2019.03.01 [ 백준 ] [ 2583 ] [ 자바 ] 영역구하기 (0) 2019.02.08 [ 백준 ][ 3184 ][ 양 ] (0) 2019.01.29 [백준][자바][2234 성곽] (0) 2018.10.20