728x90
문제
https://www.acmicpc.net/problem/14891
풀이
문제는 시뮬레이션 구현 문제이다.
문제 풀이는 돌아가는 톱니바퀴의 좌/우에 있는 톱니바퀴들의 회전후 동작을 구현하는데 중점을 두었다.
회전 동작을 담당하는 함수에서 좌/우에 있는 톱니바퀴들을 회전할 수 있는지 확인하며 회전시키는데, 이때 톱니바퀴는 서로 반대 방향으로 회전하므로 다음 톱니바퀴가 어느 방향으로 회전했는지를 변수에 기록해 그 다음 톱니바퀴가 회전할 방향을 계산할 수 있도록 프로그래밍 했다.
이 문제에서 가장 어려웠던 부분은 로직 구현이 아니였다......
오타 때문에 30분 이상 사용한거같다.....
length
배열의 길이를 측정할 때 length가 아닌 lenght라 작성한 것이다... 오타를 조심하자.........
코드
const input = require('fs')
.readFileSync(process.platform === 'linux' ? '/dev/stdin' : __dirname + '/example.txt')
.toString().trim().split('\n')
let arr = input.slice(0, 4).map(e => e.split('').map(Number));
const N = input[4];
const command = input.slice(5).map(e => e.split(' ').map(Number));
const rotateL = (pos, dir) => {
let result = [];
let posBolt = arr[pos - 1];
let leftList = arr.slice(0, pos - 1);
for (let i = leftList.length - 1; i >= 0; i--) {
let leftBolt = leftList[i];
let nextCur;
if (posBolt[6] !== leftBolt[2]) {
if (dir === 1) {
nextCur = [...leftBolt.slice(1), leftBolt[0]];
posBolt = leftBolt;
dir = -1;
result.push([i, nextCur]);
}
else {
nextCur = [leftBolt.at(-1), ...leftBolt.slice(0, 7)];
posBolt = leftBolt;
dir = 1;
result.push([i, nextCur]);
}
} else {
break;
}
}
return result;
};
const rotateR = (pos, dir) => {
let result = [];
let posBolt = arr[pos - 1];
let rightList = arr.slice(pos);
for (let i = 0; i < rightList.length; i++) {
let rightBolt = rightList[i];
let nextCur;
if (posBolt[2] !== rightBolt[6]) {
if (dir === 1) {
nextCur = [...rightBolt.slice(1), rightBolt[0]];
posBolt = rightBolt;
dir = -1;
result.push([i, nextCur]);
}
else {
nextCur = [rightBolt.at(-1), ...rightBolt.slice(0, 7)];
posBolt = rightBolt;
dir = 1;
result.push([i, nextCur]);
}
} else {
break;
}
}
return result;
};
for (let i = 0; i < N; i++) {
const [pos, dir] = command[i];
const right = rotateR(pos, dir);
const left = rotateL(pos, dir);
if (right.length > 0) {
right.forEach(e => {
const [idx, a] = e;
arr[pos + idx] = a;
});
}
if (left.length > 0) {
left.forEach(e => {
const [idx, a] = e;
arr[idx] = a;
});
}
if (dir === 1) {
arr[pos - 1] = [arr[pos - 1].at(-1), ...arr[pos - 1].slice(0,7)];
}
else {
arr[pos - 1] = [...arr[pos - 1].slice(1, 8), arr[pos - 1][0]];
}
}
console.log(`${arr.reduce((acc, cur, idx) => acc + (cur[0] === 1 ? 2 ** idx : 0), 0)}`)
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[Node.js] 16235_나무 재테크 (0) | 2024.05.16 |
---|---|
[Node.js] 16236_아기 상어 (0) | 2024.05.15 |
[Node.js] 3190_뱀 (0) | 2024.05.15 |
[Node.js] 16234_인구 이동 (0) | 2024.05.10 |
[Node.js] 14502_연구소 (0) | 2024.05.09 |