플레이어는 GameJam에 참가했다. GameJam은 현장에서 즉석으로 팀을 꾸려 게임의 규칙을 만든 뒤, 생각한 규칙을 코드로 옮겨서 게임을 만들어내는 대회이다.
플레이어가 속한 팀은 보드로 즐길 수 있는 간단한 보드게임을 만들었다. 게임의 진행 방법과 규칙은 다음과 같다.
<command>에 해당하는 방향으로 <count>칸만큼 한 칸씩 이동하라는 지시가 적혀있다.플레이어는 GameJam의 최종 발표 때 게임을 시연해 보기 위해, 구름이와 미리 연습 게임을 진행해 보려고 한다. 플레이어와 구름이가 각각의 게임에서 처음에 말을 올려둔 칸이 주어졌을 때, 두 사람 중 누가 더 높은 점수를 획득했는지를 구해보자. 단 플레이어와 구름이는 별개의 게임이다.
첫째 줄에 격자 보드의 크기 N이 주어진다.
둘째 줄에는 구름이가 말을 올려둔 칸의 좌표 Rₐ.Cₐ가 공백을 두고 주어진다. 보드의 번째 행, Rₐ번째 Cₐ번째 열에 말을 올려두었다는 뜻이다.
셋째 줄에는 플레이어가 말을 올려둔 칸의 좌표 Rₑ.Cₑ가 공백을 두고 주어진다. 보드의 Rₑ번째 행, Rₑ번째 열에 말을 올려두었다는 뜻이다.
다음 N개의 줄에는 보드의 각 칸에 적혀있는 지시 사항이 주어진다. 각 줄마다 N개의 지시 사항이 <count><command>형식으로 공백을 두고 주어지고
i번째 줄에서 j번째로 주어지는 지시 사항은 보드의 r번째 행, c번째 열의 정보를 의미한다.<count>는 이동 횟수,<command>는 이동 방향을 말한다.
<count>는 1이상 N이하의 정수이다. <command>는 U, D, R, L 중 하나이다. 각각 위쪽, 아래쪽, 오른쪽, 왼쪽을 의미한다. 이 문제에서 위쪽은 행 번호가 감소하는 방향이다. 구름이가 게임에서 승리하면 goorm과 구름이가 얻은 점수를 공백을 두고 출력하고, 플레이어가 승리하면 player와 플레이어가 얻은 점수를 공백을 두고 출력한다. 두 사람이 비기는 테스트 케이스는 주어지지 않는다.
입력
3
1 1
3 3
1L 2L 1D
2U 3R 1D
2R 2R 1U
출력
goorm 4
입력
4
4 2
2 4
1L 3D 3L 1U
2D 2L 4U 1U
2D 2L 4U 3L
4D 4D 1R 4R
출력
player 6
문제를 잘 못 이해했다.
4번째 줄부터 주어지는 값이 goorm, player에게 다 적용되는 건 줄 알았는데
그 위치에 갔을 때 적용되는 값이었다.
아래 첫번째 풀이처럼 풀었다가 다시 풀었다.
다시 풀어보려고 했는데 생각보다 어려웠고 참고하면서 풀어서 거의 제공해준 답안이랑 같아졌다...
따로 기재하지는 않는 것으로,,,
const readline = require('readline');
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let N;
let input = [];
rl.on('line', line => {
input.push(line);
N = Number(input[0]);
if (input.length === N + 3) {
rl.close();
}
});
rl.on('close', () => {
const goorm = input[1].split(' ').map(Number);
const player = input[2].split(' ').map(Number);
let goormArr = [];
let playerArr = [];
const moveFunc = (x, y, count, command) => {
count = Number(count);
switch (command) {
case 'U':
if (x - count > 0) {
x = N - (x - count);
} else {
x = x - count;
}
break;
case 'D':
if (x + count > N) {
x = x - count - N;
} else {
x = x + count;
}
break;
case 'R':
if (y + count > N) {
y = y - count - N;
} else {
y = y + count;
}
break;
case 'L':
if (y - count > 0) {
y = N - (y - count);
} else {
y = y - count;
}
break;
}
return x, y;
};
for (let i = 3; i < 6; i++) {
const d = input[i].split(' ');
for (j of d) {
const [count, command] = j.split('');
console.log(moveFunc(goorm[0], goorm[1], count, command));
}
}
});
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const directions = {
"U": [-1, 0],
"D": [1, 0],
"L": [0, -1],
"R": [0, 1],
};
let N;
let goormPos, playerPos;
let goormVisited, playerVisited;
let board = [];
function set_Pos(a) {
if (a === -1) return N-1;
if (a === N) return 0;
return a;
}
function move(pos, visited, score, board) {
let [x, y] = pos;
visited[x][y] = true;
let flag = true;
while (flag) {
let command = board[x][y];
let distance = parseInt(command.slice(0, -1));
let direction = command.slice(-1);
for (let i = 0 ; i < distance; i++){
x += directions[direction][0];
y += directions[direction][1];
x = set_Pos(x);
y = set_Pos(y);
if (!visited[x][y]){
visited[x][y] = true;
score += 1;
}
else{
flag = false;
break;
}
}
}
return score;
}
let input = []
rl.on('line', (line) => {
input.push(line);
N = Number(input[0]);
if (input.length === N + 3){
rl.close();
}
})
rl.on('close', () => {
goormPos = input[1].split(' ').map(num => Number(num) - 1);
goormVisited = Array.from(Array(N), () => new Array(N).fill(false));
playerPos = input[2].split(' ').map(num => Number(num) - 1);
playerVisited = Array.from(Array(N), () => new Array(N).fill(false));
for (let i = 3 ; i < N + 3 ; i++){
board.push(input[i].split(' '));
}
let goormScore = move(goormPos, goormVisited, 1, board);
let playerScore = move(playerPos, playerVisited, 1, board);
if (goormScore > playerScore) {
console.log("goorm " + goormScore );
} else if (goormScore < playerScore) {
console.log("player " + playerScore);
}
process.exit();
});
});
제공된 답안을 참고해서 혼자 풀어보는 과정에서
let command = board[x][y];
let distance = parseInt(command.slice(0, -1));
let direction = command.slice(-1);
위 부분을 아래와 같이 풀었는데 런타임 에러가 났다.
let [count, command] = board[x][y].split('');
count = Number(count);
결과 값은 같은 것이라고 생각되는데 테스트 케이스는 문제가 없어서
예측하기가 힘들다 아마 너무 많은 값이 입력되었을 때 에러가 나는 것이 아닐까 추측된다.