개발자 톡

연습문제 톡 GINI야 도와줘

JS

등록일
2024-11-15 23:31:26
조회수
109
작성자
vavoya6324

비 오고 사람이 움직여야 4번 통과되고


5, 7번 틀리던 거는 조건문 손봤더니, 왜 갑자기 맞았는지는 모르겠는데 맞았습니다.


const fs = require('fs');
const input = fs.readFileSync('input.txt', 'utf8').trim().split(/\n+/);


const [R, C] = input[0].split(/\s+/).map(Number);
let position = []
let rainPosition = []


const canMove = 0b1
const moved = 0b10
const rained = 0b100
const river = 0b1000
const home = 0b10000


// 1 -> 이동 가능
// 10 -> 지나감
// 100 -> 비
// 1000 -> 강
// 10000 -> 집




const map = input.slice(1).map((line, x) => line
    .trim()
    .split('')
    .map((v, y) => {
        // 비
        if (v === '*') {
            rainPosition.push([x, y]);
            return rained
        }
        // 강
        if (v === 'X') {
            return river
        }
        // 세차장
        if (v === 'W') {
            position.push([x, y])
            return moved
        }
        // 집
        if (v === 'H') {
            return home
        }
        if (v === '.') {
            return canMove
        }
    }))


/**
 *
 * @returns {number} 0 -> 진출 불가, 1 -> 진출 함, 2 -> 집 도착
 */
function bfs1() {
    const newPosition = []
    while (position.length > 0) {
        const [x, y] = position.pop()


        if (map[x]) {
            if (map[x][y+1] === home) {
                return 2
            }
            else if (map[x][y+1] === canMove) {
                map[x][y+1] = moved
                newPosition.push([x, y+1])
            }
            if (map[x][y-1] === home) {
                return 2
            }
            else if (map[x][y-1] === canMove) {
                map[x][y+1] = moved
                newPosition.push([x, y-1])
            }
        }
        if (map[x+1]) {
            if (map[x+1][y] === home) {
                return 2
            }
            else if (map[x+1][y] === canMove) {
                map[x+1][y] = moved
                newPosition.push([x+1, y])
            }
        }
        if (map[x-1]) {
            if (map[x-1][y] === home) {
                return 2
            }
            else if (map[x-1][y] === canMove) {
                map[x-1][y] = moved
                newPosition.push([x-1, y])
            }
        }
    }
    if (newPosition.length > 0) {
        position = newPosition
        return 1
    }
    else {
        return 0
    }
}
function bfs2() {
    const newPosition = []
    while (rainPosition.length > 0) {
        const [x, y] = rainPosition.pop()


        if (map[x] && ((map[x][y+1] & (canMove | moved)) > 0)) {
            map[x][y+1] = rained
            newPosition.push([x, y+1])
        }
        if (map[x] && ((map[x][y-1] & (canMove | moved)) > 0)) {
            map[x][y-1] = rained
            newPosition.push([x, y-1])
        }
        if (map[x+1] && ((map[x+1][y] & (canMove | moved)) > 0)) {
            map[x+1][y] = rained
            newPosition.push([x+1, y])
        }
        if (map[x-1] && ((map[x-1][y] & (canMove | moved)) > 0)) {
            map[x-1][y] = rained
            newPosition.push([x-1, y])
        }
    }
    rainPosition = newPosition
}
let time = 1
while (true) {
    // 비 이동
    bfs2()
    // 사람 이동
    const result = bfs1();
    if (result === 0) {
        console.log('FAIL')
        break
    }
    else if (result === 2) {
        console.log(time)
        break
    }
    time++
}
#GINI야_도와줘
#js

이 카테고리의 톡 더보기