백준 알고리즘 10026번 - 적록색약
2019. 5. 30. 14:50ㆍ프로그래밍/백준 알고리즘
dfs를 통해 풀어 볼 수 있는 문제.
처음에는 비정상인을 카운팅할때 로직을 하나 더 짜야하나 고민했지만,, 생각해보니 적록색약은 녹색과 빨간색을 구별하지 못한다.
따라서 모든 빨간색을 녹색으로 바꾸어놓고 풀거나, 모든 녹색을 빨간색으로 바꾸어 놓고 풀어도 정답은 동일하다.
그렇게 바꿔놓은 다음 dfs를 돌리자.
#include <iostream>
using namespace std;
int num,count=0;
char map[101][101];
bool visited[101][101];
//앞,뒤,위,아래로 이동가능
int dx[5]={0,-1,0,0,1};
int dy[5]={0,0,1,-1,0};
//이전에 방문한 것과 색깔이 동일하다면 그곳으로 이동한다.
void dfs(int startX,int startY)
{
visited[startY][startX]=true;
for(int i=1;i<=4;i++){
int nowX=startX+dx[i];
int nowY=startY+dy[i];
if(nowX>0 && nowX<=num && nowY>0 && nowY<=num){
if(map[nowY][nowX]==map[startY][startX]){
if(!visited[nowY][nowX]){
dfs(nowX,nowY);
}
}
}
}
}
//정상인 다 확인하고 비정상인 카운팅 하기전에 초기화
void init()
{
count=0;
for(int i=1;i<=num;i++){
for(int j=1;j<=num;j++){
visited[i][j]=false;
if(map[i][j]=='G') map[i][j]='R';
}
}
}
int main()
{
cin>>num;
for(int i=1;i<=num;i++){
for(int j=1;j<=num;j++){
cin>>map[i][j];
}
}
//정상인의 시각에서 카운팅
for(int i=1;i<=num;i++){
for(int j=1;j<=num;j++){
if(!visited[i][j]) {
count++;
dfs(j,i);
}
}
}
cout<<count<<" ";
//초기화한다.
init();
//비정상의 시각에서 카운팅한다
for(int i=1;i<=num;i++){
for(int j=1;j<=num;j++){
if(!visited[i][j]) {
count++;
dfs(j,i);
}
}
}
cout<<count;
}
'프로그래밍 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 1744번 - 수 묶기 (0) | 2019.06.11 |
---|---|
백준 알고리즘 1449번 - 수리공 항승 (0) | 2019.05.31 |
백준 알고리즘 2331번 - 반복수열 (0) | 2019.05.27 |
백준 알고리즘 14502번 - 연구소 (0) | 2019.05.23 |
백준 알고리즘 1431번 - 시리얼 번호 (0) | 2019.05.21 |