Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 브루트포스
- 수학
- ListIterator
- 문자열
- 요세푸스 문제
- toUpperCase()
- toLowerCase()
- ifnull
- 정수론
- 그래프 이론
- 분할 정복
- 정렬
- 시간 복잡도
- 백트래킹
- 연결 리스트
- IS NOT NULL
- 거듭제곱
- 큐
- 너비 우선 탐색
- 그래프 탐색
- 그리디 알고리즘
- 소수 판정
- 공간 복잡도
- 스택
- 배열
- 구현
- 자료 구조
- BFS
- MySQL
- 빅오 표기법
Archives
- Today
- Total
배푸니까
[백준 / JAVA] 10026. 적록색약 본문
반응형
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 |