배푸니까

[백준 / JAVA] 10026. 적록색약 본문

백준

[백준 / JAVA] 10026. 적록색약

baefrica 2023. 8. 18. 03:39
반응형

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

 

10026번: 적록색약

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

www.acmicpc.net

 


💻 풀이 결과

💯 최종 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Node {
	int r, c;

	Node(int r, int c) {
		this.r = r;
		this.c = c;
	}
}

public class Main {
	static int N;
	static char[][] grid;

	public static int BFS() {
		// 4방 탐색 도구
		int[] dr = { 0, 0, -1, 1 };
		int[] dc = { -1, 1, 0, 0 };

		Queue<Node> queue = new LinkedList<>();
		boolean[][] visited = new boolean[N][N];
		int cnt = 0;

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (!visited[i][j]) {
					queue.add(new Node(i, j));
					visited[i][j] = true;
					cnt++;

					while (!queue.isEmpty()) {
						Node curr = queue.poll();

						for (int d = 0; d < 4; d++) {
							int nr = curr.r + dr[d];
							int nc = curr.c + dc[d];

							if (nr < 0 || nc < 0 || nr >= N || nc >= N) {
								continue;
							}
							if (visited[nr][nc]) {
								continue;
							}

							if (grid[curr.r][curr.c] == grid[nr][nc]) {
								queue.add(new Node(nr, nc));
								visited[nr][nc] = true;
							}
						}
					}
				}
			}
		}

		return cnt;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		N = sc.nextInt();
		grid = new char[N][N];

		for (int i = 0; i < N; i++) {
			String str = sc.next();
			for (int j = 0; j < N; j++) {
				grid[i][j] = str.charAt(j);
			}
		}

		// 적녹색약이 아닌 사람이 봤을 때
		int normalCnt = BFS();

		// 적녹색약인 사람이 봤을 때
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (grid[i][j] == 'G') {
					grid[i][j] = 'R';
				}
			}
		}

		int colorBlindCnt = BFS();

		// 출력
		System.out.print(normalCnt + " " + colorBlindCnt);
	}
}

💬 풀이 과정

  • 처음에 적록색약인 사람과 아닌 사람이 봤을 경우를 나눠서 BFS를 두 번 구현했었다.
  • BFS를 메서드로 구현하면서 코드의 길이를 줄였다.
  • 적록색약인 사람이 봤을 경우의 BFS를 돌리기 전에 그리드를 변화시켜 주었다.

💡 깨달은 점

1. BFS 메서드로 구현

  • BFS 구현 과정을 한 번만 써서 코드의 길이를 줄일 수 있었다.
반응형

'백준' 카테고리의 다른 글

[백준 / JAVA] 6593. 상범 빌딩  (0) 2023.08.22
[백준 / JAVA] 7569. 토마토  (0) 2023.08.19
[백준 / JAVA] 2468. 안전 영역  (0) 2023.08.17
[백준 / JAVA] 5014. 스타트링크  (0) 2023.08.16
[백준 / JAVA] 2667. 단지번호붙이기  (0) 2023.08.15