알고리즘/백준
10026_적록색약
베리영young
2023. 12. 18. 17:19
사용 알고리즘: bfs
사용 언어: java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;
public class Main {
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
static char[][] pic; // 입력받을 배열
static boolean[][] visited; // 방문처리
static int n; // 그림의 크기
static int normal, noRG; // 일반인과 적록색약인이 보는 갯수
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
pic = new char[n][n]; // 배열 초기화
visited = new boolean[n][n]; // 방문처리 초기화
for (int i = 0; i < n; i++) {
String color = br.readLine();
for (int j = 0; j < n; j++) {
pic[i][j] = color.charAt(j);
}
} // 그림 정보 입력 받음
// 일반인이 보는 색상 돌기
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!visited[i][j]) {
normal++;
bfs(i,j);
}
}
} // 일반인이 보는 색상 돌기 끝
// fill 함수는 1차원에서만 쓸 수 있음
for(boolean a[]: visited)
Arrays.fill(a, false);
//색약인이 보는 그림 (G는 다 R로 바꾸기)
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(pic[i][j] == 'G') pic[i][j] = 'R';
}
}
// 색약인이 보는 색상 돌기
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!visited[i][j]) {
noRG++;
bfs(i,j);
}
}
} // 색약인이 보는 색상 돌기 끝
System.out.println(normal+" "+noRG);
}
private static void bfs(int i, int j) {
Queue<int[]> q = new ArrayDeque<>();
q.offer(new int[] {i, j});
visited[i][j] = true;
while( !(q.isEmpty()) ) {
int[] cur = q.poll();
for(int d=0; d<4; d++) { //4방향 탐색
int nx = cur[0] + dx[d];
int ny = cur[1] + dy[d];
if(nx>=0 && nx<n && ny>=0 && ny<n) { //범위 안에 있으면
if( !visited[nx][ny] && pic[i][j]==pic[nx][ny]) { //방문 안 했고, 색이 같으면
visited[nx][ny] = true; //방문 처리 하고
q.offer(new int[] {nx,ny});
}
}
}
}//와일 끝
}
}
알고리즘 사용 이유:
구역 별로 나누기 문제
중요:
맵을 따로따로 만드는 게 아니라, 하나의 맵을 활용 = 일반인이 보는 구역을 나누고, 그 맵 그대로 활용하여 문제를 풀어서 메모리 사용량 줄일 수 있음
인사이트:
fill은 1차원 배열에서만 사용 가능하기 때문에 , 2차원 배열에서는 for문 팔요