function solution(keyinput, board) {
let ans = [0, 0];
const xConstraint = Math.floor(board[0] / 2);
const yConstraint = Math.floor(board[1] / 2);
keyinput.forEach((item) => {
if(item === "right"){
ans[0] += 1;
}
if(item === "left"){
ans[0] -= 1;
}
if(item === "up"){
ans[1] += 1;
}
if(item === "down"){
ans[1] -= 1;
}
if(Math.abs(ans[0]) > xConstraint){
if(ans[0] < 0){
ans[0] += 1;
}
if(ans[0] > 0){
ans[0] -= 1;
}
}
if(Math.abs(ans[1]) > yConstraint){
if(ans[1] < 0){
ans[1] += 1;
}
if(ans[1] > 0){
ans[1] -= 1;
}
}
})
return ans;
}
이 문제는 많은 분들이 케이스 8을 통과하지 못해 애를 먹으셨으리라 생각된다.
필자도 그랬다...ㅋ..이거 레벨 0 맞나..?
정말 간단한 문제였다.
가장 바깥쪽으로 갔을 때, 다시 안쪽으로 들어가는 연산이 들어온다면
그 연산을 처리해줘야하는데...
가장 바깥쪽까지 가면 모든 연산을 막아버리는 식으로 코드를 짜면 통과를 못한다.
예를들어, 이런 것이다.
질문글에 있던 예시를 가져와봤다.
["left","left","left","right"], [3,3]
[0,0]
을 기준으로 위아래, 양 옆으로 1칸씩만 갈 수 있는 board
가 있다.
따라서, left
가 한번 들어오면 더이상 left
연산을 처리하면 안된다.
그런데, 그러다가 right
가 들어온다? 그러면 다시 [0,0]
으로 돌아가야하는데...
이 연산을 막아버리면 안된다는 것이다.
응~ 최대 범위 도달했으니까 모든 연산 다 안돼~
이러면 안된다구!!!
최대 범위 밖으로 가는 연산은 막아야하지만, 다시 안으로 들어오는 연산은 허용해야한다.
필자는 이 것을 최대치에 도달한 값에 대해서 다시 값을 복구시키는 방법으로 진행했다.
맨 왼쪽에 있는 상태에서 left
가 입력되면, 입력을 막는게 아니라
그냥 연산하고, 다시 연산을 초기화하는 연산을 추가해버린 것이다.
연산이 왔다갔다 두 번 하기 때문에 효율적인 방법은 아니다.
function solution(keyinput, board) {
let ans = [0, 0];
const xConstraint = Math.floor(board[0] / 2);
const yConstraint = Math.floor(board[1] / 2);
keyinput.forEach((item) => {
if (item === "right" && ans[0] < xConstraint) {
ans[0] += 1;
}
if (item === "left" && ans[0] > -xConstraint) {
ans[0] -= 1;
}
if (item === "up" && ans[1] < yConstraint) {
ans[1] += 1;
}
if (item === "down" && ans[1] > -yConstraint) {
ans[1] -= 1;
}
});
return ans;
}
코드를 좀 더 깔끔하게 하기위해, 별도로 처리했던 최대치 부분을
&&
를 사용하여 하나의 조건문에 이어주었다.
하나의 문제에 대한 연산이 반복되는 것이 아니라서, 이해가 훨씬 잘되는 것 같다.