Programers 2장 - Lv.0 캐릭터의 좌표
포스트
취소

Programers 2장 - Lv.0 캐릭터의 좌표

캐릭터의 좌표

문제

  • 머쓱이는 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만 주어집니다.

입출력 예시

keyinputboardresult
[“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의 최댓값을 음수로 만들어 좌표가 된다.
  • 좌표를 출력한다.
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];
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.