[프로그래머스 | Javascript] 코딩테스트 입문 - 캐릭터의 좌표

박기영·2022년 11월 15일
0

프로그래머스

목록 보기
92/159
post-custom-banner

solution

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가 입력되면, 입력을 막는게 아니라
그냥 연산하고, 다시 연산을 초기화하는 연산을 추가해버린 것이다.
연산이 왔다갔다 두 번 하기 때문에 효율적인 방법은 아니다.

다듬은 solution

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;
}

코드를 좀 더 깔끔하게 하기위해, 별도로 처리했던 최대치 부분을
&&를 사용하여 하나의 조건문에 이어주었다.
하나의 문제에 대한 연산이 반복되는 것이 아니라서, 이해가 훨씬 잘되는 것 같다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글