문제 링크 / level: Gold V
https://www.acmicpc.net/problem/10026
내가 생각한 풀이
슬슬 BFS 문제들이 (특히 flood fill 문제) 비슷하다고 느껴져서 내 생애 최초 백준 골드 문제에 도전해보기로 했다. 사실 풀고 보니 기존의 Silver I 문제들과 크게 다르지는 않지만 그래도 자기만족 측면에서는 기분이가 참 좋다 ^_^❤️
문제의 핵심은 이렇다. 어떤 그림이 주어졌을 때 (R,G,B로 색상을 표시) 적록색약이 아닌 사람과 적록색약인 사람이 보는 그림의 구역 수를 각각 출력하는 것이다. 얼핏 보면 간단하네?! 싶기도 한데 막상 코드로 짜려고하면 몇 가지 생각해야할 부분이 있어 패드에 정리를 해봤다.
이렇게 정리해봤다.
1. 적록색약이 아닌 사람
2. 적록색약인 사람
이렇게 두 가지 케이스를 나눠서 생각해봤다.🙄
#1. 적록색약이 아닌 사람
먼저 처음부터 R과 G를 하나로 통일해서 받으면 좀 편하지 않을까 싶었는데, 생각해보니 그렇게 하면 적록색약이 아닌 사람의 결과를 구할 수가 없었다. 그래서 우선은 주어지는 input을 그대로 배열로 받고 적록색약이 아닌 사람의 결과값을 구하기로 했다. 여기까지는 기본적인 BFS 탐색을 하면 해결할 수 있었다. 대신 이번 문제에서는 int 배열이 아니라 char 배열을 사용했기 때문에 bfs로 보내줄 때의 배열 원소값을 check라는 임시 char type 변수에 저장해두고 활용했다. (bfs로 보낼 때 check를 인자로 같이 보내주는 방식으로)
#2. 적록색약인 사람
그리고 이후에 적록색약인 사람이 보는 구역의 수를 구하기 위해서 기존에 저장해뒀던 print 배열에 있는 R을 전부 다 G로 바꿔줬다. 이러면 더이상 신경쓸 필요 없이 기존의 bfs 메소드를 그대로 활용할 수가 있기 때문에 아주 효율적이며 편리하다. (패드에도 '그 다음 로직은 똑같이 활용할 수 있을 듯'이라고 적었다.)
// 핵심 코드
Ans1 = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(visited[i][j] == 0) {
check = print[i][j];
bfs(i,j,++Ans1,check);
}
}
}
for(int[] v : visited) {
Arrays.fill(v, 0);
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(print[i][j] == 'R') {print[i][j] = 'G';}
}
}
Ans2 = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(visited[i][j] == 0) {
check = print[i][j];
bfs(i,j,++Ans2,check);
}
}
}
System.out.println(Ans1 + " " + Ans2);
Ans1는 적록색약이 아닌 사람이 보는 구역의 개수, Ans2는 적록색약인 사람이 보는 구역의 개수.
visited 배열을 재활용하기 위해서 첫 번째 bfs가 모두 끝나면 배열의 모든 원소를 0으로 초기화해주는 작업을 해줬다. (여기서 이차원 배열을 Arrays.fill 메소드를 이용해서 초기화 해주는 방법을 공부함📚) 그리고 배열의 원소 중 R인 것을 전부 G로 바꿔준 뒤에 다시 bfs를 해줬다.
배열을 돌면서 방문하지 않은 곳이 있으면 bfs를 태워보내는데, 그때의 원소값을 인자로 같이 보내준다.
나의 첫 골드 문제는 이렇게 가볍게, 그리고 한 번에 테스트를 통과했다! ㅇ ㅑ호~~~🤗🎈
▼아래 더보기를 누르면 코드 전체를 볼 수 있습니다.
[코드 보기]
'🥇Problem Solving (psS2mj) > BOJ' 카테고리의 다른 글
[BOJ] 14681. 사분면 고르기 (Java) (0) | 2020.05.23 |
---|---|
[BOJ] 1205. 등수 구하기 (Java) (0) | 2020.05.22 |
[BOJ] 4963. 섬의 개수 (Java) (0) | 2020.04.20 |
[BOJ] 1743. 음식물 피하기 (Java) (0) | 2020.04.19 |
[BOJ] 2193. 이친수 (Java) (0) | 2020.04.19 |
댓글