오늘도 내일 토익스피킹 시험 때문에

토익스피킹 준비 위주로 학습을 진행했고 3차원의 bfs 문제를 풀었다.

 

(1).백준 7569번 토마토는 어제 푼 토마토와 유사하지만 층이 있다는 차이가 있다.

처음으로 3차원 탐색을 시작하는 문제였는데
생각보다 3차원이지만 별거 없었고 
그냥 하나의 축이 더 생겼다고 가정하고 그 축의 증가 또는 감소만 고려하면 되는 문제였는데
4, 5차원의 문제라고 하더라도 고려해야할 방향이 하나씩 추가되기 때문에
체크해야할 내용은 추가된 방향의 증가 또는 감소 2번일 뿐이었다.

주어진 입력값을 3차원 배열로 만든 다음
날짜 체크에 활용할 stack을 let으로 선언했는데
const가 아닌 이유는 날짜가 변할 때 마다 새로운 값을 할당할 예정이기 때문이다.

그 뒤에 일반적인 BFS처럼 추가된 stack에서 각각의 경로를 탐색하고
탐색 후 추가할 경로는 newStack에 임시로 담아둔 다음
모든 stack의 탐색이 끝난 후 newStack의 길이(추가된 내용이 있는지)를 체크한 다음
변경점이 없으면 while문 자체를 종료해버리고
newStack의 길이가 0이 아닐 경우 stack에 구조분해할당을 통해 재할당했다.

막힌 경우에는 진행되지 않기 때문에
0이 남아있을 경우를 확인하기 위해 전체적인 배열 탐색을 진행한 다음
만약 0이 있을 경우 day를 -1로 재할당하고 출력했다.

const input = `5 3 2
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0`.split('\n').map(el => el.split(' ').map(Number))

const [xLength, yLength, zLength] = input[0]
const map = []
let day = 0

for(let i = 1 ; i < input.length ; i+=yLength){
    const arrForPush = []
    for(let j = i ; j < i+yLength ; j++){
        arrForPush.push(...[input[j]])
    }
    map.push(arrForPush)
}

let stack = []

for(let i = 0 ; i < zLength ; i++){
    for(let j = 0 ; j < yLength ; j++){
        for(let k = 0 ; k < xLength ; k++)
        if(map[i][j][k] > 0){
            stack.push([i,j,k])
        }
    }
}

while(true){
    const newStack = []
    while(stack.length){
        const [z, y, x] = stack.pop()
        if(map[z+1] && map[z+1][y] && map[z+1][y][x] === 0){
            map[z+1][y][x] = 1
            newStack.push([z+1,y,x])
        }
        if(map[z-1] && map[z-1][y] && map[z-1][y][x] === 0){
            map[z-1][y][x] = 1
            newStack.push([z-1,y,x])
        }
        if(map[z][y+1] && map[z][y+1][x] === 0){
            map[z][y+1][x] = 1
            newStack.push([z,y+1,x])
        }
        if(map[z][y-1] && map[z][y-1][x] === 0){
            map[z][y-1][x] = 1
            newStack.push([z,y-1,x])
        }
        if(map[z][y][x+1] === 0){
            map[z][y][x+1] = 1
            newStack.push([z,y,x+1])
        }
        if(map[z][y][x-1] === 0){
            map[z][y][x-1] = 1
            newStack.push([z,y,x-1])
        }
    }
    if(newStack.length){
        day++
        stack = [...newStack]
    }
    else{
        break
    } 
}

for(let i = 0 ; i < zLength ; i++){
    for(let j = 0 ; j < yLength ; j++){
        if(map[i][j].filter(el => el === 0).length){
            day = -1
        }
    }
}

console.log(day)

'회고' 카테고리의 다른 글

[취업준비일지] - 144  (0) 2023.03.13
[취업준비일지] - 143  (0) 2023.03.12
[취업준비일지] - 141  (0) 2023.03.10
[취업준비일지] - 140  (0) 2023.03.09
[취업준비일지] - 139  (0) 2023.03.08

+ Recent posts