[Algorithm] [구현] 보드게임

윤후·2022년 3월 2일
0

Section 3

목록 보기
8/41

문제


N * N의 크기를 가진 보드판 위에서 게임을 하려고 합니다. 게임의 룰은 다음과 같습니다.

좌표 왼쪽 상단(0, 0)에 말을 놓는다.
말은 상, 하, 좌, 우로 이동할 수 있고, 플레이어가 조작할 수 있다.
조작의 기회는 딱 한 번 주어진다.
조작할 때 U, D, L, R은 각각 상, 하, 좌, 우를 의미하며 한 줄에 띄어쓰기 없이 써야 한다.
예시: UDDLLRRDRR, RRRRR
한 번 움직일 때마다 한 칸씩 움직이게 되며, 그 칸 안의 요소인 숫자를 획득할 수 있다.
방문한 곳을 또 방문해도 숫자를 획득할 수 있다.
보드 밖을 나간 말은 OUT 처리가 된다.
칸 안의 숫자는 0 또는 1이다.
단, 좌표 왼쪽 상단(0, 0)은 항상 0이다.
획득한 숫자를 합산하여 숫자가 제일 큰 사람이 이기게 된다.
보드판이 담긴 board와 조작하려고 하는 문자열 operation이 주어질 때, 말이 해당 칸을 지나가면서 획득한 숫자의 합을 구하는 함수를 작성하세요.

입력


인자 1: board
number 타입의 2차원 배열
2 <= board.length <= 1,000
예: [ [0, 0, 1], [1, 0, 1], [1, 1, 1] ]
인자 2: operation
string 타입의 대문자 영어가 쓰여진 문자열

1 <= operation.length <= board.length * 2

U, L, D, R 이외의 문자열은 없습니다.

출력


Number 타입을 반환해야 합니다.
board와 operation이 입력값의 예시 ([ [0, 0, 1], [1, 0, 1], [1, 1, 1] ], DDR)일 때, (0, 0) -> (1, 0) -> (2, 0) -> (2, 1) 순서로 이동하게 되고, 각 0, 1, 1, 1을 얻어 3을 반환합니다.
주의사항
만약, 말이 보드 밖으로 나갔다면 즉시 OUT 을 반환합니다.

입출력 예시


const board1 = [
  [0, 0, 0, 1],
  [1, 1, 1, 0],
  [1, 1, 0, 0],
  [0, 0, 0, 0]
]
const output1 = boardGame(board1, 'RRDLLD');
console.log(output1); // 4


const board2 = [
  [0, 0, 1],
  [1, 1, 1],
  [1, 0, 0]
]
const output2 = boardGame(board2, 'UUUDD');
console.log(output2); // 'OUT'

const board3 = [
  [0, 0, 0, 0, 0],
  [0, 0, 1, 0, 0],
  [0, 0, 0, 0, 0],
  [0, 0, 0, 1, 0],
  [0, 0, 0, 0, 0]
]
const output3 = boardGame(board3, 'DDRRRUDUDUD');
console.log(output3); // 0

코드


function boardGame(board, operation) {
  // 자, 이 문제를 어떻게 해결하면 좋을까..
  // 일단 board로 들어오는건 2차원 배열이고 operation에 들어오는 건 UDRL로 들어오는 문자열이다.
  
  // operation으로 들어오는 문자열을 split으로 떼어놓을 수도 있지만, for문으로 떼어놓을 수도 있다.
  // u는 위로 올라가야하니까, board[a][b]에서 a-1이 되어야 할거고,
  // d는 아래로 내려가야하니 a+1, r은 오른쪽으로 가야하니 b+1, l은 왼쪽으로 가야하니 b-1이 되겠다.
  // 앞서 max와 mini를 변수로 만들어 움직였으니 위아래, 오른쪽 왼쪽으로 움직일때 사용할 변수를 만들어보자.

  let upDown = 0;
  let rightLeft = 0;
  let count = 0;

  for(let i = 0 ; i < operation.length ; i++){
    
    if(operation[i] === "U"){
      upDown--;
    }

    if(operation[i] === "D"){
      upDown++;
    }

    if(operation[i] === "R"){
      rightLeft++;
    }

    if(operation[i] === "L"){
      rightLeft--;
    }

    if(upDown < 0 || rightLeft < 0 || upDown > operation.length || rightLeft > operation.length){
      return "OUT"
    }
    count = count + board[upDown][rightLeft]
  }

  return count
  
};
profile
궁금한걸 찾아보고 공부해 정리해두는 블로그입니다.

0개의 댓글

관련 채용 정보