ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 백준 ][ 자바 ][ 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();
    		}
    		
    	}
    }
    
    
    
    
    
    
    
    
    
    


    댓글

Designed by Tistory.