-
[Programmers] JavaScript 알고리즘 | Lv.0 캐릭터의 좌표► JS Algorithm/Programmers 2024. 9. 8. 11:01반응형
🔒 문제 설명
머쓱이는 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 함수를 완성해주세요.
- [0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.
🔒 제한사항
- 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합니다.
🔐 solution of mine
Math.floor()
switch
function solution(keyinput, board) { const [x, y] = board; let [a, b] = [0, 0]; const halfX = Math.floor(x / 2); const halfY = Math.floor(y / 2); const chkMaxX = [-halfX, halfX]; const chkMaxY = [-halfY, halfY]; for (let i = 0; i < keyinput.length; i++) { switch (keyinput[i]) { case "left": chkMaxX[0] < a && a <= chkMaxX[1] && a--; break; case "right": chkMaxX[0] <= a && a < chkMaxX[1] && a++; break; case "up": chkMaxY[0] <= b && b < chkMaxY[1] && b++; break; case "down": chkMaxY[0] < b && b <= chkMaxY[1] && b--; break; } } return console.log([a, b]); } solution(["left", "right", "up", "right", "right"], [11, 11]); // expected output: [2, 1] solution(["down", "down", "down", "down", "down"], [7, 9]); // expected output: [0, -4] solution(["right", "right", "right", "right", "right", "left"], [9, 5]); // expected output: [3, 0]
🔐 GPT's solution
Math.floor()
Math.max()
Math.min()
function solution(keyinput, board) { let position = [0, 0]; // 현재 좌표를 [0, 0]으로 시작 // 보드의 가로, 세로 최대 이동 가능한 범위 계산 const xLimit = Math.floor(board[0] / 2); const yLimit = Math.floor(board[1] / 2); // 방향에 따른 이동값 정의 const move = { up: [0, 1], down: [0, -1], left: [-1, 0], right: [1, 0], }; // keyinput 배열에 따라 이동 keyinput.forEach((key) => { position[0] += move[key][0]; position[1] += move[key][1]; // 맵의 범위를 벗어나지 않도록 제한 position[0] = Math.max(-xLimit, Math.min(xLimit, position[0])); position[1] = Math.max(-yLimit, Math.min(yLimit, position[1])); }); return console.log(position); } solution(["left", "right", "up", "right", "right"], [11, 11]); // expected output: [2, 1] solution(["down", "down", "down", "down", "down"], [7, 9]); // expected output: [0, -4] solution(["right", "right", "right", "right", "right", "left"], [9, 5]); // expected output: [3, 0]
🔐 solution of others
switch
function solution(keyinput, board) { let res = [0, 0]; for (let p of keyinput) { switch (p) { case "left": if (-res[0] < board[0] / 2 - 1) res[0]--; break; case "right": if (res[0] < board[0] / 2 - 1) res[0]++; break; case "up": if (res[1] < board[1] / 2 - 1) res[1]++; break; case "down": if (-res[1] < board[1] / 2 - 1) res[1]--; } } return console.log(res); } solution(["left", "right", "up", "right", "right"], [11, 11]); // expected output: [2, 1] solution(["down", "down", "down", "down", "down"], [7, 9]); // expected output: [0, -4] solution(["right", "right", "right", "right", "right", "left"], [9, 5]); // expected output: [3, 0]
🔐 solution of others
Array.prototype.map()
Array.prototype.reduce()
Math.abs()
function solution(keyinput, board) { let key = { right: [1, 0], left: [-1, 0], up: [0, 1], down: [0, -1] }; let rslt = keyinput .map((v) => key[v]) .reduce( (a, b) => { if ( Math.abs(a[0] + b[0]) > board[0] / 2 || Math.abs(a[1] + b[1]) > board[1] / 2 ) { return [a[0], a[1]]; } return [a[0] + b[0], a[1] + b[1]]; }, [0, 0] ); return console.log(rslt); } solution(["left", "right", "up", "right", "right"], [11, 11]); // expected output: [2, 1] solution(["down", "down", "down", "down", "down"], [7, 9]); // expected output: [0, -4] solution(["right", "right", "right", "right", "right", "left"], [9, 5]); // expected output: [3, 0]
🔐 solution of others
Array.prototype.reduce()
const CONTROL = { up: [0, 1], down: [0, -1], left: [-1, 0], right: [1, 0], }; function solution(key, [n, m]) { const [x1, x2] = [-(n - 1) / 2, (n - 1) / 2]; const [y1, y2] = [-(m - 1) / 2, (m - 1) / 2]; return console.log( key.reduce( ([x, y], k) => { const [nx, ny] = [x + CONTROL[k][0], y + CONTROL[k][1]]; if (x1 <= nx && nx <= x2 && y1 <= ny && ny <= y2) return [nx, ny]; return [x, y]; }, [0, 0] ) ); } solution(["left", "right", "up", "right", "right"], [11, 11]); // expected output: [2, 1] solution(["down", "down", "down", "down", "down"], [7, 9]); // expected output: [0, -4] solution(["right", "right", "right", "right", "right", "left"], [9, 5]); // expected output: [3, 0]
반응형'► JS Algorithm > Programmers' 카테고리의 다른 글
[Programmers] JavaScript 알고리즘 | Lv.0 로그인 성공? (0) 2024.09.09 [Programmers] JavaScript 알고리즘 | Lv.0 종이 자르기 (0) 2024.09.09 [Programmers] JavaScript 알고리즘 | Lv.0 대소문자 바꿔서 출력하기 (0) 2024.08.20 [Programmers] JavaScript 알고리즘 | Lv.0 이진수 더하기 (0) 2024.08.20 [Programmers] JavaScript 알고리즘 | Lv.0 그림 확대 (0) 2024.08.19