문제 설명
적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.
크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)
예를 들어, 그림이 아래와 같은 경우에
적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)
그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오. 입력 ——- 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)
둘째 줄부터 N개 줄에는 그림이 주어진다.
출력
적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.
풀이과정
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