(1).백준 10026번 적록색약은 이전의 bfs, dfs 탐색으로 다른 종류를 구별하는 것과 유사한 문제였다.
다만 차이점이 있다면 1과 0으로 이동을 파악하는 것이 아니라
R,G,B 세 가지 색의 경계로 경계를 구분하고 있으며
적록색약인 사람은 RG, B 두 가지 색의 경계로 구분하고 있다는 것이었다.
각 색을 0으로 처리해주는 dfs 함수를 하나로 처리하고 싶었기 때문에
각각의 맵을 rgb, rrb의 두개로 구분한 다음
값을 넣어줄 때 "G"도 "R"로 들어가게 처리했다.
그리고 모든 좌표를 돌아가며 0이 들어있지 않은 경우
dfs함수에 현재 좌표값과 현재 좌표에 들어있는 문자열 그리고 처리할 map의 주소값을 넣어줬다.
이런 방식을 통해 R, G, B 또는 R, B로 구성된 map을 탐색하며
인접한 동일 문자열들을 제거해나갔고
dfs가 호출된 숫자만큼 rrbCount, rgbCount가 증가해 그 값을 출력해서 문제를 해결할 수 있었다.
const input = `5
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR`.split('\n')
const range = Number(input[0])
const rgbMap = []
const rrbMap = []
let rgbCount= 0
let rrbCount= 0
for(let i = 1 ; i <= range ; i++){
rgbMap.push(input[i].split(''))
rrbMap.push(input[i].split('').map(el => {
if(el === 'G') return 'R'
return el
}))
}
const dfs = (startX, startY, str, map) => {
const stack = [[startX, startY]]
map[startX][startY] = 0
while(stack.length){
const [x, y] = stack.pop()
if(map[x+1] && map[x+1][y] === str){
map[x+1][y] = 0
stack.push([x+1,y])
}
if(map[x-1] && map[x-1][y] === str){
map[x-1][y] = 0
stack.push([x-1,y])
}
if(map[x][y+1] === str){
map[x][y+1] = 0
stack.push([x,y+1])
}
if(map[x][y-1] === str){
map[x][y-1] = 0
stack.push([x,y-1])
}
}
}
for(let i = 0 ; i < range ; i++){
for(let j = 0 ; j < range ; j++){
if(rgbMap[i][j]){
rgbCount++
dfs(i, j, rgbMap[i][j], rgbMap)
}
if(rrbMap[i][j]){
rrbCount++
dfs(i, j, rrbMap[i][j], rrbMap)
}
}
}
console.log(rgbCount, rrbCount)'회고' 카테고리의 다른 글
| [취업준비일지] - 150 (0) | 2023.03.19 |
|---|---|
| [취업준비일지] - 149 (0) | 2023.03.18 |
| [취업준비일지] - 147 (0) | 2023.03.16 |
| [취업준비일지] - 146 (0) | 2023.03.15 |
| [취업준비일지] - 145 (0) | 2023.03.14 |
