코딩테스트 캐릭터의 좌표
문제 설명
출력 예시
up,down,left,right 키를 누를 때마다 캐릭터가 이동합니다. 기본 좌표는 [0, 0]입니다!
예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다.
맵의 크기는 board값에 배열로 주어집니다.
맵의 크기가 x축이 11이면 범위는 -5 ~ 5 입니다. 그 미만, 초과로는 이동할 수 없습니다.
이동하여 현재 좌표를 출력하면 되는 문제입니다~
const keyinput = ["left", "right", "up", "right", "right"];
const board = [11, 11];
var answer = [0,0];
let max = [];
max.push(Math.round(board[0] / 2 - 1));
max.push(Math.round(board[1] / 2 - 1));
[...keyinput].forEach(e => {
if(e == "left" && Math.abs(answer[0]) < max[0]){
answer[0]--
} else if (e == "right" && Math.abs(answer[0]) < max[0]){
answer[0]++
} else if (e == "down" && Math.abs(answer[1]) < max[1]){
answer[1]--
} else if (e == "up" && Math.abs(answer[1]) < max[1]){
answer[1]++
}
})
//[2, 1]
바로 구해봤습니다.
left한번 나온뒤, right3번 이므로 x축 좌표는 2
up한번이니 y축 좌표는 1
출력은 [2, 1]이 됩니다.
맵의 최대 거리를 max 배열에 넣었습니다.
하지만 이 식대로면 맵의 한계점으로 이동할 시 문제가 됩니다.
Math.abs(answer[0]) < max[0] 같은 조건을 걸었으니 한계점에 도달하면 좌표가 움직이지 않게 됩니다.
만약 문제가
["left", "left", "left", "left", "left", "right"], [9, 5]
//[-3, 0]
이렇게 주어진다면 제 출력은 [-4, 0]이 나오게 됩니다.
만약 먼저 left가 5번나오고 right가 한번 마지막에 나오게 되면
맵의 거리상 left는 4번밖에 가지 못하므로 x축 좌표가 -4에서 right 한번으로 3이 되어야 합니다.
하지만 제 코드는 맵 끝까지 가면 조건문에 충족하지 않기 때문에 더이상 이동하지 않아서 -4에 머물게 됩니다.
그러므로 조건문을 더 추가해주겠습니다.
const keyinput = ["left", "right", "up", "right", "right"];
const board = [11, 11];
var answer = [0,0];
let max = [];
max.push(Math.round(board[0] / 2 - 1));
max.push(Math.round(board[1] / 2 - 1));
[...keyinput].forEach(e => {
if(e == "left" && Math.abs(answer[0]) < max[0]){
answer[0]--
} else if (e == "right" && Math.abs(answer[0]) < max[0]){
answer[0]++
} else if (e == "down" && Math.abs(answer[1]) < max[1]){
answer[1]--
} else if (e == "up" && Math.abs(answer[1]) < max[1]){
answer[1]++
} else if (e == "left" && answer[0] > 0 && Math.abs(answer[0]) <= max[0]){
answer[0]--
} else if (e == "right" && answer[0] < 0 && Math.abs(answer[0]) <= max[0] ){
answer[0]++
} else if (e == "down" && answer[1] > 0 && Math.abs(answer[1]) <= max[1]){
answer[1]--
} else if (e == "up" && answer[1] < 0 && Math.abs(answer[1]) <= max[1]){
answer[1]++
}
})
//[2, 1]
코드가 많이 지저분해집니다... 제 한계입니다 ㅜ..
답의 좌표가 한계점에 도달해도 이동할 수 있게 만들었습니다. 하지만 조건이 더 생겼는데,
현재 좌표가 양수인지, 음수인지 구별하여 맵의 최대거리인 max를 뚫지못하게 조건을 걸었습니다.
그러므로 답은 [2, 1]!