미술관람 대회(FloodFill)

exsoul·2022년 6월 15일
0

문제 설명


해마다 열리는 꿀꿀이 올림피아드에는 여러 종목들이 있는데, 요즘에는 꿀꿀이들의 교양을 겨루는 ‘미술관람 대회’가 인기를 끌고 있다. 이 대회는 사회자가 빨강, 초록, 파랑으로 이루어진 N × N 픽셀의 그림을 보여주면 그 그림에 포함된 영역의 수를 빠르고 정확하게 맞추는 것이 목표이다. 동일한 색깔이 네 방향(상, 하, 좌, 우) 중 한 곳이라도 연결되어 있으면 하나의 영역으로 간주한다.

예를 들어, 아래 그림은 각각 2, 1, 1개의 빨간색, 초록색, 파란색 영역이 있어 총 4개의 영역이 있다.

한편, 꿀꿀이들의 절반 정도는 선천적인 유전자 때문에 적록색맹이라서 빨간색과 초록색을 구별하지 못한다. 따라서 사회자는 일반 대회와 적록색맹용 대회를 따로 만들어서 대회를 진행하려고 한다. 사회자를 도와 영역의 수를 구하는 프로그램을 작성하여라.

입력 설명


첫 번째 줄에는 그림의 크기 N이 주어진다. (1 ≤ N ≤ 100)
두 번째 줄부터 N개의 줄에는 각 픽셀의 색깔이 'R'(빨강), 'G'(초록), 'B'(파랑) 중 하나로 주어진다.

출력 설명


일반 꿀꿀이와 적록색맹 꿀꿀이가 보는 영역의 수를 출력한다.

입력 예시


5
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

출력 예시


4 3

#include <stdio.h>
#include <string.h>
#define MAXN (100)
int N;//그림크기(정사각형)
char map[MAXN+10][MAXN+10];
int sol1, sol2;
 
int visited[MAXN+10][MAXN+10];
int dh[] = {-1, 1, 0, 0};
int dw[] = {0, 0, -1, 1};
void FloodFill(int h, int w, char color){
    if (map[h][w] != color) return;//다른 색임
    if (visited[h][w]) return;
  
    visited[h][w]=1;
  
    for (int i=0; i<4; i++){
        FloodFill(h+dh[i], w+dw[i], color);
    }
}
int Count(void){
    //1.visited 초기화
    memset(visited, 0, sizeof(visited));
    //2.영역 개수 구하기
    int cnt = 0;
    for (int h=1; h<=N; h++){
        for (int w=1; w<=N; w++){
            if (visited[h][w]) continue;//다른 영역 포함된 영역
            cnt++;//새로운 영역이므로
            FloodFill(h, w, map[h][w]);
        }
    }
    return cnt;
}
void Solve(void){
    //1.일반대회 답 구하기
    sol1 = Count();
    //2.적록색맹 대회용 으로 그림 변경
    for (int h=1; h<=N; h++){
        for (int w=1; w<=N; w++){
            if (map[h][w] == 'G'){
                map[h][w] = 'R';
            }
        }
    }
    sol2 = Count();
}
 
void InputData(void){
    scanf("%d", &N);
    for (int h=1; h<=N; h++){
        scanf("%s", &map[h][1]);
    }
}
 
int main(void){
    InputData();// 입력받는 부분
 
    Solve();// 여기서부터 작성
 
    printf("%d %d\n", sol1, sol2);// 출력하는 부분
    return 0;
}
profile
ocho

0개의 댓글