문제(출처: 프로그래머스)
머쓱이는 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]까지 이동할 수 있습니다.
▶ 내가 푼 방식
function solution(keyinput, board) {
var answer = [];
const controlXY = {"down": ["y", -1] , "up": ["y", 1], "left": ["x", -1], "right": ["x",1] }
const maxX = (board[0] - 1) / 2;
const maxY = (board[1] - 1) / 2;
let x = 0
let y = 0
for (let i of keyinput){
let [coordinate, value] = controlXY[i];
if (coordinate == "x"){
x += value
if (x > maxX) {x = maxX}
if (x < -maxX) {x = -maxX}
}
else{
y += value
if (y > maxY) {y = maxY}
if (y < -maxY) {y = -maxY}
}
}
return [x, y]
}
▶ 다른 유저가 푼 방식
// 유저 1
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]--; break;
}
}
return res;
}
// 유저 2
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 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]);
}
// 유저 3
▶ 배운 것들
- 배운것 : Array.reduce 에서 accumulator 를 배열로도 가능하다. 함수 안에서 더하기만 하는 것이 아니라 원하는 기능을 구현 할 수도 있다.
- 복습 : Array.reduce
array.recude((accumulator, currentVale) => {
accumulator + currentValue
},
initialValue
);
-
'프로그래밍 > 코딩연습' 카테고리의 다른 글
[ JS 코딩연습 ] 숨어있는 숫자의 덧셈 (0) | 2024.05.18 |
---|---|
[ JS 코딩연습 ] 다항식 더하기 (1) | 2024.05.17 |
[ JS 코딩연습 ] 7의 개수 (0) | 2024.05.15 |
[ JS 코딩연습 ] OX 퀴즈 (0) | 2024.05.13 |
[ JS 코딩연습 ] 문자열 계산하기 (0) | 2024.05.12 |