728x90

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

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net


풀이 방법

1. 2차원 배열을 한칸씩 돌면서, DFS로 구역 개수를 구함 -> 여기서 구한 개수는 적록색약 아닌 사람이 보는 구역 

2. 적록색약은 빨강과 초록을 같은 색으로 본다고 했으므로 원래 2차원 배열에서 빨강인 부분을 초록으로 만들어주고,

다시 DFS 로 구역 개수를 구함-> 적록색약인 사람이 보는 구역

 

JAVA 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_10026_적록색약 {
	static StringTokenizer st;
	static boolean[][] visited;
	static char[][] map;
	static int[][] dir= {{0,1},{0,-1},{1,0},{-1,0}};
	static int N;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N= Integer.parseInt(br.readLine());
		map=new char[N][N];
		for (int i = 0; i < N; i++) {
			String str=br.readLine();
			for (int j = 0; j < N; j++) {
				map[i][j]=str.charAt(j);
			}
		}
		visited=new boolean[N][N];
		int sum=0; // 적록색약 x
		for (int i=0; i<N; i++) {
			for (int j = 0; j <N; j++) {
				char value=map[i][j];
				if(dfs(i,j,value)) {
					sum++;
				}
			}
		}
		// R==G이기 때문에 R->G로 바꿔줌
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (map[i][j]=='R') map[i][j]='G';
			}
		}
		int redblue=0; // 적록색약
		visited=new boolean[N][N];
		for (int i=0; i<N; i++) {
			for (int j = 0; j <N; j++) {
				char value=map[i][j];
				if(dfs(i,j,value)) {
					redblue++;
				}
			}
		}

		System.out.println(sum+" "+redblue);

	}
	private static boolean dfs(int x, int y, char value) {
		if(!visited[x][y]) {
			visited[x][y]=true;
			for(int i=0; i<4; i++) {
				int nx=x+dir[i][0];
				int ny=y+dir[i][1];
				if(isOkay(nx,ny)&&map[nx][ny]==value&&!visited[nx][ny]) {
					dfs(nx,ny,value);
				}
			}
			return true;
		}else {
			return false;
		}
	}
	private static boolean isOkay(int x, int y) {
		return x>=0 && y>=0 && x<N && y<N;
	}

}

조금 더 효율적으로 풀수는 없을지 고민해봐야겠다. 

728x90

'알고리즘 > 백준 BOJ' 카테고리의 다른 글

[JAVA] 백준 13300 방배정  (0) 2021.08.28
[JAVA] 백준 16236 아기상어  (0) 2021.08.25
[JAVA] 백준 1260 DFS와 BFS  (0) 2021.08.23
[JAVA] 백준 1074 Z 풀이  (0) 2021.08.22
[JAVA] 백준 1987 알파벳 풀이  (0) 2021.08.20
복사했습니다!