728x90
문제
https://www.acmicpc.net/problem/17837
풀이
이 문제는 조금 난이도 있는 구현인거 같다.
우선 각 칸마다 색상과 쌓여있는 말들을 저장할 방법에 대해 고민했다. 서칭을 하던 중 칸 하나의 요소에 객체로 color와 stack을 넣어줘 관리하는 방법을 찾았다.
이 문제를 풀며 어려운 점이 있었는데, 파란칸(2)과 보드의 영역을 나가는 동작의 경우 반대 방향으로 움직이는 동작의 구현이였다. 마지막까지 반대 방향으로 움직이는 로직에서 실수를 하며 시간을 소비했다....
코드
const input = require('fs')
.readFileSync(process.platform === 'linux' ? '/dev/stdin' : __dirname + '/example.txt')
.toString().trim().split('\n').map(e => e.split(' ').map(Number));
const [n, k] = input.shift();
const map = input.splice(0, n).map(e => e.map(el => { return { color: el, stack: [] } })); // 이렇게 사용할 수 있구만
const cars = input.map(([y, x, d], idx) => {
map[y - 1][x - 1].stack.push(idx);
return [y - 1, x - 1, d - 1];
});
const dir = [[0, 1], [0, -1], [-1, 0], [1, 0]];
const revDir = [1,0,3,2];
let answer = 1;
let flag = false;
while (answer <= 1000) {
for (let i = 0; i < cars.length; i++){
let [y, x, d] = cars[i];
let nY = y + dir[d][0];
let nX = x + dir[d][1];
if (nY >= n || nY < 0 || nX >= n || nX < 0 || (nY >= 0 && nY < n && nX >= 0 && nX < n && map[nY][nX].color === 2)) {
cars[i] = [y, x, revDir[d]];
const bY = y + dir[revDir[d]][0];
const bX = x + dir[revDir[d]][1];
if (bY >= 0 && bY < n && bX >= 0 && bX < n && map[bY][bX].color !== 2) {
i--;
}
}
else if (map[nY][nX].color === 0) {
const curPlace = map[y][x].stack.indexOf(i);
const tower = map[y][x].stack.splice(curPlace);
map[nY][nX].stack.push(...tower);
tower.forEach(e => {
cars[e][0] = nY;
cars[e][1] = nX;
});
if (map[nY][nX].stack.length >= 4) {
flag = true;
}
}
else if (map[nY][nX].color === 1) {
const curPlace = map[y][x].stack.indexOf(i);
const tower = map[y][x].stack.splice(curPlace);
const reverseTower = tower.reverse();
map[nY][nX].stack.push(...reverseTower);
tower.forEach(e => {
cars[e][0] = nY;
cars[e][1] = nX;
});
if (map[nY][nX].stack.length >= 4) {
flag = true;
}
}
if (flag) break;
}
if (flag) break;
answer += 1;
}
console.log(answer > 1000 ? -1 : answer);
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[Node.js] 19236_청소년 상어 (1) | 2024.07.01 |
---|---|
[Node.js] 17822_원판돌리기 (0) | 2024.06.27 |
[Node.js] 17143_낚시왕 (0) | 2024.06.18 |
[Node.js] 17779_게리맨더링 2 (0) | 2024.06.10 |
[Node.js] 17142_연구소3 (0) | 2024.06.05 |