-
[Baekjoon Online Judge] 10026번: 적록색약문제 풀이/Baekjoon Online Judge 2021. 2. 25. 16:01
요구사항
- 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.
- 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다.
- 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)
입력
- 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)
- 둘째 줄부터 N개 줄에는 그림이 주어진다.
출력
- 적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.
적록색약인 사람과 아닌사람을 구별하기 위해 두 개의 map을 선언하였다. 적록색약인 사람은 G 색을 R로 바꿔주어 map을 채웠다.
for (int i = 0; i < n; i++) { String input = bufferedReader.readLine(); for (int j = 0; j < n; j++) { char color = input.charAt(j); map1[i][j] = color; if (color == 'G') map2[i][j] = 'R'; else map2[i][j] = color; } }
적록색약이 아닌 사람 부터 map을 bfs로 탐색하며 구역의 count를 쌓아서 출력하였다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.LinkedList; import java.util.Queue; public class Baekjoon10026 { static int n; static char[][] map, map1, map2; static boolean[][] visited; static int[] xMove = {-1, 1, 0, 0}; static int[] yMove = {0, 0, -1, 1}; static class Location { int x, y; public Location(int x, int y) { this.x = x; this.y = y; } } private static void bfs(int startX, int startY) { Queue<Location> queue = new LinkedList<>(); queue.add(new Location(startX, startY)); char color = map[startX][startY]; visited[startX][startY] = true; while (!queue.isEmpty()) { Location location = queue.poll(); int pollX = location.x; int pollY = location.y; for (int i = 0; i < 4; i++) { int x = pollX + xMove[i]; int y = pollY + yMove[i]; if (isLocation(x, y) && map[x][y] == color) { queue.add(new Location(x, y)); visited[x][y] = true; } } } } private static boolean isLocation(int x, int y) { if (x >= 0 && y >= 0 && x < n && y < n && !visited[x][y]) return true; return false; } public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out)); n = Integer.parseInt(bufferedReader.readLine()); map1 = new char[n][n]; // 적록색약이 아닌사람 map2 = new char[n][n]; // 적록색약인 사람 visited = new boolean[n][n]; // 방문 기록 for (int i = 0; i < n; i++) { String input = bufferedReader.readLine(); for (int j = 0; j < n; j++) { char color = input.charAt(j); map1[i][j] = color; if (color == 'G') map2[i][j] = 'R'; else map2[i][j] = color; } } map = map1; int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!visited[i][j]) { bfs(i, j); ++count; } } } bufferedWriter.write(count + " "); map = map2; visited = new boolean[n][n]; count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!visited[i][j]) { bfs(i, j); ++count; } } } bufferedWriter.write(String.valueOf(count)); bufferedWriter.flush(); bufferedReader.close(); bufferedWriter.close(); } }
'문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon Online Judge] 1920번: 수 찾기 (0) 2021.02.25 [Baekjoon Online Judge] 7562번: 나이트의 이동 (0) 2021.02.25 [Baekjoon Online Judge] 7569번: 토마토 (0) 2021.02.22 [Baekjoon Online Judge] 2583번: 영역 구하기 (0) 2021.02.22 [Baekjoon Online Judge] 1357번: 뒤집힌 덧셈 (0) 2021.02.21