문제 번호 : 3190번
문제 바로가기 ☞ https://www.acmicpc.net/problem/3190
<<< 문제 내용 >>>
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const boardLen = Number(input.shift());
// 뱀 = S , 길 = 0 , 사과 = A
let board = Array.from(Array(boardLen), () => new Array(boardLen).fill(0));
const appleLen = Number(input.shift());
for (let i = 0; i < appleLen; i++) {
let temp = input[0].split(" ").map(Number);
input.shift();
board[temp[0] - 1][temp[1] - 1] = "A";
}
const operLen = Number(input.shift());
let operArr = [];
for (let i = 0; i < operLen; i++) {
let temp = input[0].split(" ");
input.shift();
operArr.push([Number(temp[0]), temp[1]]);
}
board[0][0] = "S";
const dy = [-1, 1, 0, 0];
const dx = [0, 0, -1, 1];
let snakeDir = 3; //0~3 상하좌우
let [cy, cx] = [0, 0];
let cnt = 0;
let sLocation = [[0, 0]];
const dirConvert = (curDir, turnWhere) => {
switch (curDir) {
case 0:
if (turnWhere === "D") return 3;
else return 2;
case 1:
if (turnWhere === "D") return 2;
else return 3;
case 2:
if (turnWhere === "D") return 0;
else return 1;
case 3:
if (turnWhere === "D") return 1;
else return 0;
}
};
while (true) {
// 이동 1, 벽이나 자기 몸이면 종료
// 사과인지 아닌지 판단, 사과면 꼬리는 삭제 x
// 사과가 아니면 꼬리 삭제 o
// 방향 변화있는지 확인하고 바꿔주기
cnt++;
const ny = cy + dy[snakeDir];
const nx = cx + dx[snakeDir];
if (
ny < 0 ||
ny >= boardLen ||
nx < 0 ||
nx >= boardLen ||
board[ny][nx] === "S"
)
break;
if (board[ny][nx] === 0) {
board[ny][nx] = "S";
[cy, cx] = sLocation.shift();
board[cy][cx] = 0;
} else if (board[ny][nx] === "A") {
board[ny][nx] = "S";
}
// 뱀 바뀐 위치 추가
sLocation.push([ny, nx]);
// 방향 전환
if (operArr.length && cnt === operArr[0][0]) {
let oper = operArr.shift();
snakeDir = dirConvert(snakeDir, oper[1]);
}
cy = ny;
cx = nx;
}
console.log(cnt);
* 구현 문제이고, 주어진 조건을 차례차례 구현하다보니 코드가 다소 길어지긴 했으나,
속도는 준수하고, 데이터 양도 똑같긴하다. 대부분의 사람들의 코드보다 살짝 짧거나 비슷한데,
방향 전환을 나머지를 이용해서 간결하게 구현하거나, 각 조건들을 if else 등을 간략화해서 정답을 도출해낸 사람도 더러 있었다.
이런 분들은 구현에 통달 한 것인가.. 아니면 작성 후 코드를 리팩토링을 한 것인가..
아무튼 구현자체는 주어진 조건을 차례차례 구현하면 큰 문제 없는 문제였다.
도움이 되셨다면 공감 부탁드립니다.