[백준/JavaScript] 수리공 한승

알고리즘 풀이

Posted by Sub DevLog on November 3, 2020

문제 설명

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.

크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)

예를 들어, 그림이 아래와 같은 경우에

  • Image Alt 텍스트

적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)

그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오. 입력 ——- 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)

둘째 줄부터 N개 줄에는 그림이 주어진다.

출력

적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.

  • Image Alt 텍스트

풀이과정

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
function solution(input){
    let count=0;
   
    input= input.map(element=>{
        let tmp= element.split("");
        tmp= tmp.map(element => {
            return [element,0]
        });
       return tmp;
    });

    
    let temp= JSON.parse(JSON.stringify(input));

    for(let i=0;i<length;i++){
        for(let j=0;j<length;j++){
            if(input[i][j][1]==0){
                count++;
                loop(i,j,input[i][j][0],count);
            }
        }
    }

    let fcount= JSON.parse(JSON.stringify(count));
    input =temp;
    
    count=0;
    
    input.forEach(element => {
        element.forEach(element=>{
            if(element[0]=="G")element[0]="R"
        })
    });

    for(let i=0;i<length;i++){
        for(let j=0;j<length;j++){
            if(input[i][j][1]==0){
                count++;
                loop(i,j,input[i][j][0],count);
            }
        }
    }
    
    console.log(fcount+" "+count);
}

function loop(x,y,key,value){   
    input[x][y][1]=value;
    if(x+1<length){
        if(input[x+1][y][0]==key&&input[x+1][y][1]==0){
            loop(x+1,y,key,value);
        }
    }

    if(y+1<length){
        if(input[x][y+1][0]==key&&input[x][y+1][1]==0){
            loop(x,y+1,key,value);
        }
    }

    if(y-1>=0){
        if(input[x][y-1][0]==key&&input[x][y-1][1]==0){
            loop(x,y-1,key,value);
        }
    }
    if(x-1>=0){
        if(input[x-1][y][0]==key&&input[x-1][y][1]==0){
            loop(x-1,y,key,value);
        }
    }
}

출처

https://www.acmicpc.net/problem/10026