맨 처음 if문을 이용하여 작성한 코드
function solution(keyinput, board) {
const arr = [0,0];
for(let i=0;i<keyinput.length;i++){
if(keyinput[i]==='left'&arr[0]>Math.ceil(board[0]/-2)){
arr[0]--;
} else if(keyinput[i]==='right'&arr[0]<Math.floor(board[0]/2)){
arr[0]++;
} else if(keyinput[i]==='up'&arr[1]<parseInt(board[1]/2)){
arr[1]++;
} else if(keyinput[i]==='down'&arr[1]>parseInt(board[1]/-2)){
arr[1]--;
}
}
return arr;
}
그런데 이 문제처럼 조건이 많은 경우에는 if else보다 switch문을 사용하는 것이 인터럭션 측면에서 더 좋다고 한다.
인터럭션 : CPU가 명령을 수행하기 위해 메모리 상에서 명령어를 읽어오는 과정. 적을 수록 좋다.
if else : if를 만날 때마다 조건문을 만족하는지 확인하는 인터럭션 필요
switch : 처음 입력값을 확인할 때만 인터럭션 필요하고 조건을 확인하는 데에는 인터럭션 필요 X.
그래서 switch문으로 다시 풀어보기로 했다.
function solution(keyinput, board) {
let res = [0, 0];
for (let dir of keyinput) {
switch (dir) {
case "left":
res[0] > Math.ceil((board[0] / 2) * -1)
? (res = [res[0] - 1, res[1]])
: null;
break;
case "right":
res[0] < Math.floor(board[0] / 2) ? (res = [res[0] + 1, res[1]]) : null;
break;
case "up":
res[1] < Math.floor(board[1] / 2) ? (res = [res[0], res[1] + 1]) : null;
break;
case "down":
res[1] > Math.ceil((board[1] / 2) * -1)
? (res = [res[0], res[1] - 1])
: null;
break;
}
}
return res;
}
console.log(solution(["left", "right", "up", "right", "right"], [11, 11]));
다시 풀고나니 각 케이스에서 조건에 부합하지 않을 때 어차피 움직이지 않으므로 삼항연산자보다 if를 쓰는게 더 간결하겠다.
function solution(keyinput, board) {
let res = [0, 0];
for (let dir of keyinput) {
switch (dir) {
case "left":
if (res[0] > Math.ceil((board[0] / 2) * -1)) res = [res[0] - 1, res[1]];
break;
case "right":
if (res[0] < Math.floor(board[0] / 2)) res = [res[0] + 1, res[1]];
break;
case "up":
if (res[1] < Math.floor(board[1] / 2)) res = [res[0], res[1] + 1];
break;
case "down":
if (res[1] > Math.ceil((board[1] / 2) * -1)) res = [res[0], res[1] - 1];
break;
}
}
return res;
}
console.log(solution(["left", "right", "up", "right", "right"], [11, 11]));
참고:
https://floz.tistory.com/entry/4-Javascript-%EC%A1%B0%EA%B1%B4%EB%AC%B8-switch