Algorithm problem-Implementation

EBinY·2022년 1월 24일
0

AP - Algorithm Problem

목록 보기
35/55
  1. 문제
  • N x N의 보드판이 주어지고, [0,0]에서 출발
  • 문자열로 이루어진 이동명령이 주어짐(ex.'RRDLU')
  • 보드판을 벗어날 경우 'OUT'리턴 후 종료
  • 보드판의 각 위치에는 0 또는 1로 점수가 주어져있음
  • 문자열에 주어진 순서대로 이동하고 난 최종 점수를 리턴
  1. 시도
  • 주어진 명령에서 문자열을 하나씩 떼어내어 좌표를 이동한다
  • 이동한 좌표가 범위 내인지 체크, 범위 밖이면 바로 'OUT' 리턴 후 종료
  • 범위 내라면, 좌표의 점수를 카운터에 갱신
  • 문자열을 다 빼서 썼으면 반복문 종료 후 현재 카운터 리턴
  1. 수도코드
function boardGame(board, operation) {
  // 획득한 점수를 세어줄 카운터를 선언
  let cnt = 0;
  // 보드의 범위를 변수로 선언
  let N = board.length;
  // 현재 위치를 저장해 둘 변수 선언
  let cur = [0,0];
  // 오퍼레이터의 앞부분을 잘라 포인터로 사용하고
  // 모든 오퍼레이터를 다 쓴 후에는 카운터를 리턴해주자
  while (operation.length) {
    let pointer = operation[0];
    operation = operation.slice(1);
    // 포인터에 따라 이동 방향을 정해주고 이동한 위치가 범위 내인지 체크
    // 범위 내부라면 그 값을 카운터에 갱신
    if (pointer === 'U') {
      cur[0] = cur[0] - 1;
    }
    if (pointer === 'D') {
      cur[0] = cur[0] + 1;
    }
    if (pointer === 'L') {
      cur[1] = cur[1] - 1;
    }
    if (pointer === 'R') {
      cur[1] = cur[1] + 1;
    }
    // 범위 밖이라면 out 리턴해주고 종료
    else if (cur[0] < 0 || cur[1] < 0 || cur[0] >= N || cur[1] >= N) {
      return 'OUT';
    }
    // 범위 안이라면 위치 값을 카운터에 더해준다
    cnt = cnt + board[cur[0]][cur[1]];
  }
  return cnt;
};
  1. 레퍼런스
// LOOK UP TABLE을 사용한다면 조건문을 추상화시킬 수 있습니다.
function boardGame(board, operation) {
  const DIR = {
    'U': [-1, 0],
    'D': [1, 0],
    'L': [0, -1],
    'R': [0, 1]
  }
  const LEN = board.length;
  const isValid = (y, x) => 0 <= y && y < LEN && 0 <= x && x < LEN;

  let Y = 0;
  let X = 0;
  let score = 0;
  for (let i = 0; i < operation.length; i++) {
    const [dY, dX] = DIR[operation[i]];
    Y += dY;
    X += dX;
    if (isValid(Y, X) === false) return 'OUT';
    score += board[Y][X];
  }
  return score;
};

0개의 댓글

관련 채용 정보