[백준/Java] 10026 - 적록색약

2025. 9. 15. 22:38·코딩테스트/백준

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

문제


풀이

BFS나 DFS를 활용해서 구역이 같은 부분의 개수를 구하는 문제이다

적록색약이 아닌 사람의 경우를 구할 때는 주어진 배열을 그대로 이용하여 bfs를 돌리면 되고

적록색약인 사람의 경우에는 배열 값이 G가 나왔을 때 R로 바꿔주어 같은 구역으로 만들고 bfs를 돌리면 된다

 

bfs 내에서는 현재 위치의 색깔을 저장하고 상하좌우의 인접한 위치의 색깔과 같으면 큐에 추가하는 방식으로 진행하였다

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

	static int N;
	static char[][] arr;
	static boolean[][] visited;

	static int[] dx = {-1, 1, 0, 0}; // 상하
	static int[] dy = {0, 0, -1, 1}; // 좌우

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();

		N = Integer.parseInt(br.readLine());
		arr = new char[N][N];
		visited = new boolean[N][N];

		for (int i = 0; i < N; i++) {
			arr[i] = br.readLine().toCharArray();
		}

		// 적록색약이 아닌 사람이 봤을 때 구역 수 계산
		int normalCount = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				// 방문하지 않은 요소일때 bfs 탐색
				if (!visited[i][j]) {
					bfs(i, j);
					normalCount++;
				}
			}
		}

		// G를 R로 변경하여 같은 구역으로 만들어줌
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (arr[i][j] == 'G') {
					arr[i][j] = 'R';
				}
			}
		}

		// 방문 처리 배열을 초기화하고 구역 수 계산
		visited = new boolean[N][N];
		int rgCount = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (!visited[i][j]) {
					bfs(i, j);
					rgCount++;
				}
			}
		}

		System.out.println(normalCount + " " + rgCount);

		br.close();
	}

	static void bfs(int x, int y) {
		Queue<int[]> queue = new LinkedList<>();
		queue.add(new int[]{x, y});
		visited[x][y] = true;
		char color = arr[x][y]; // 현재 위치의 색깔을 저장

		while (!queue.isEmpty()) {
			int[] current = queue.poll();

			for (int i = 0; i < 4; i++) {
				// 인접한 위치 탐색
				int nx = current[0] + dx[i];
				int ny = current[1] + dy[i];

				// 배열 범위 안에 있고
				if (nx >= 0 && nx < N && ny >= 0 && ny < N) {
					// 방문하지 않았고 현재 색과 인접한 위치의 색과 같으면 진행
					if (!visited[nx][ny] && arr[nx][ny] == color) {
						visited[nx][ny] = true;
						queue.add(new int[]{nx, ny});
					}
				}
			}
		}
	}
}

결과

'코딩테스트/백준' 카테고리의 다른 글
  • [백준/Java] 7662 - 이중 우선순위 큐
  • [백준/Java] 16928 - 뱀과 사다리 게임
  • [백준/Java] 7569 - 토마토
  • [백준/Java] 5430 - AC
KDH.dev
KDH.dev
  • KDH.dev
    CodingHard
    KDH.dev
  • 전체
    오늘
    어제
    • 전체글 (82)
      • 코딩테스트 (74)
        • 프로그래머스 (13)
        • 백준 (61)
      • CS (4)
        • 네트워크 (4)
      • Spring (1)
      • Java (3)
        • 자료구조 (3)
        • 알고리즘 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로그래머스
    13913
    CS
    부트캠프후기
    16935
    30804
    [LG유플러스] 유레카 백엔드 개발자
    자바
    자료구조
    11660
    코딩테스트
    백준
    21736
    프로그래머스 Lv.0
    멀티캠퍼스it부트캠프
    5525
    14940
    18111
    17626
    네트워크
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
KDH.dev
[백준/Java] 10026 - 적록색약
상단으로

티스토리툴바