[프로그래머스 0레벨] 캐릭터의 좌표

이민선(Jasmine)·2022년 12월 20일
1
post-thumbnail

맨 처음 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

profile
기록에 진심인 개발자 🌿

0개의 댓글