캐릭터의 좌표
문제
- 머쓱이는 RPG게임을 하고 있습니다.
- 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다.
- 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다.
- 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다.
- 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.
1
function solution(keyinput, board) {}
제한사항
board
은 [가로 크기, 세로 크기] 형태로 주어집니다.board
의 가로 크기와 세로 크기는 홀수입니다.board
의 크기를 벗어난 방향키 입력은 무시합니다.- 0 ≤
keyinput
의 길이 ≤ 50 - 1 ≤
board
[0] ≤ 99 - 1 ≤
board
[1] ≤ 99 keyinput
은 항상up
,down
,left
,right
만 주어집니다.
입출력 예시
keyinput | board | result |
---|---|---|
[“left”, “right”, “up”, “right”, “right”] | [11, 11] | [2, 1] |
[“down”, “down”, “down”, “down”, “down”] | [7, 9] | [0, -4] |
입출력 예 설명
- 입출력 예 설명 #1
- [0, 0]에서 왼쪽으로 한 칸 오른쪽으로 한 칸 위로 한 칸 오른쪽으로 두 칸 이동한 좌표는 [2, 1]입니다.
- 입출력 예 설명 #2
- [0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.
내가 짠 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function solution(keyinput, board) {
let upDown = 0;
let leftRight = 0;
for (let i = 0; i < keyinput.length; i++) {
if (keyinput[i] === "up" && upDown < Math.floor(board[1] / 2)) {
upDown++;
}
if (keyinput[i] === "down" && upDown > Math.floor(board[1] / 2) * -1) {
upDown--;
}
if (keyinput[i] === "left" && leftRight > Math.floor(board[0] / 2) * -1) {
leftRight--;
}
if (keyinput[i] === "right" && leftRight < Math.floor(board[0] / 2)) {
leftRight++;
}
}
return [leftRight, upDown];
}
코드 설명
- 출력될 배열의 값을 미리 선언한다.
- 입력된
keyinput
에 따라 변수에 값을 더하거나 빼준다. - 주어진
board
의 크기를 넘길 수 없기 때문에,board
에 최대 크기에 도달하지 않았을 조건을 걸어준다. - 이를 출력한다.
다른 코드와 풀이
board
의 최댓값을 구한다.keyinput
에 들어오는 값에 따라 좌표를 더하거나 뺀다.- 만약,
board
의 최댓값이 넘은 경우에서 0보다 크거나 작을 때의 경우를 나눈다.- 0보다 크면
board
의 최댓값이 좌표가 된다. - 0보다 작으면
board
의 최댓값을 음수로 만들어 좌표가 된다.
- 0보다 크면
- 좌표를 출력한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function solution(keyinput, board) {
let maxLeftRight = Math.floor(board[0] / 2);
let maxUpDown = Math.floor(boadr[1] / 2);
let x = 0;
let y = 0;
keyinput.map((key) => {
switch (key) {
case "left":
x -= 1;
break;
case "right":
x += 1;
break;
case "up":
y -= 1;
break;
case "down":
y -= 1;
break;
}
if (Math.abs(x) > maxLeftRight) {
x = x > 0 ? maxLeftRight : maxLeftRight * -1;
}
if (Math.abs(y) > maxUpDown) {
y = y > 0 ? maxUpDown : maxUpDown * -1;
}
});
return [x, y];
}