Seung's Learning Record

백준 #10026 적록색약 본문

알고리즘

백준 #10026 적록색약

70_0ewd 2024. 2. 11. 18:19

난이도 : 골드5
소요시간 :  47분
사용한 풀이법 : bfs


풀이 과정

1. color 입력 받는 동시에 배열에 삽입
2. for문 돌면서 미방문한 곳 발견 시 bfs() 호출
3. bfs()함수에서는 호출 된 부분의 색과 동일한 곳만 탐색
4. 탐색이 끝나면 normal++ 후 bfs 재호출
5. color배열 탐색 종료 후, 적록색약 버전 카운트위해 vis[][] 0으로 재초기화
6. color배열의 'G'를 'R'로 대치
7. bfs()호출 및 blind++과정 반복
8. normal과 blind 각각 출력

작성 코드

#include <iostream>
#include <queue>
#include <utility>

using namespace std;

queue<pair<int,int> > Q;
char color[101][101];
int vis[101][101];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int n;

void bfs(int x,int y){
    Q.push(make_pair(x,y));
    while(!Q.empty()){
        pair<int, int> cur = Q.front();
        Q.pop();
        for(int dir=0; dir<4; dir++){
            int nx = cur.first + dx[dir];
            int ny = cur.second + dy[dir];

            if(nx < 0 || nx >=n || ny <0 || ny >=n) continue;
            if(vis[nx][ny]==1 || color[nx][ny]!= color[x][y]) continue;

            vis[nx][ny] =1;
            Q.push(make_pair(nx,ny));
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int normal=0, blind=0;

    cin >> n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin >> color[i][j];
        }
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(vis[i][j]==0){
                normal++;
                bfs(i,j);
            }
        }
    }

    
    for(int i=0;i<n;i++){
        fill(vis[i],vis[i]+n,0);
        for(int j=0;j<n;j++){
            if(color[i][j]=='G') color[i][j]='R';
        }
    }

     for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(vis[i][j]==0){
                blind++;
                bfs(i,j);
            }
        }
    }

    cout << normal << " " << blind;

}

피드백

테스트 케이스는 모두 통과 하였는데 제출 시 자꾸 런타임 에러가 발생함
=> bfs()함수를 void가 아닌 int형으로 선언해서 발생한 문제였다. 

bfs를 함수로 따로 빼두지 않고 코드 작성을 하려니까 머리가 너무 복잡해져서 풀이가 도저히 생각이 안났었다.
앞으로는 주요 기능을 함수로 따로 빼서 코드 작성하는거에 익숙해지도록 하자..

 

'알고리즘' 카테고리의 다른 글

백준 #1260  (0) 2024.03.03
백준 #1182 부분 수열의 합  (1) 2024.02.12
백준 #1012 유기농 배추  (0) 2024.02.11
백준#1697 숨바꼭질  (0) 2024.02.04
재귀 / 백트래킹  (0) 2023.11.13