(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

+ Recent posts