백준 8911 거북이

걍걍규·2023년 7월 27일
0
post-thumbnail

문제 파악

  • F와 B는 이동 명령이고 L과 R은 방향 전환 명령이라는 점을 파악했다
  • 좌표를 직접 그려보며 어떤 형식으로 출력이 나오는지 파악했다
  • 거북이가 지나간 x좌표의 선과 y좌표의 선이 각각 직사각형의 한 변이라고 이해했다

  • 처음엔 그저 x의 max값과 y의 max값을 곱해주면 될 것이라 생각했지만 오류가 있었다
  • x와 y의 최소값은 언제나 0이 아니라는 점
  • 처음부터 B명령을 실행하거나 보다 복잡한 입력이 있을때 음수가 나올 것을 감안하지 못했다

  • 그렇게 정리 한 그림이고 switch문을 써도 간편할 것 같았지만 손에 익은 if문으로 구현하기로 했다
  • 방향은 cur_dir이라는 변수가 가지고 있고 초기값은 0 ( 상 ) 을 바라보고 있다
  • R과 L에는 각각 지금 바라보는 방향에 따라 어느 방향으로 바꾸어 주어야 할지를 정해주었다
  • F일땐 지금 거북이가 있는 자리에서 현재 바라보고 있는 방향으로 x, y를 더해준다
  • B일땐 F와 같지만 다른 점은 빼준다
const { default: cluster } = require('cluster')
const fs = require('fs')
const input = fs.readFileSync('example.txt', 'utf-8').toString().split('\n')
// const input = fs.readFileSync('dev/stdin', 'utf-8').toString().trim().split('\n')

const T = input.shift()


const moves = input.join(' ').split(' ')

const dir = [[1,0], [-1,0], [0,-1],[0,1]]
//행이 상으로 이동, 행이 하로 이동, 열이 좌로 이동, 열이 우로 이동


const solution = (n) => {
  let cur_dir = 0
  let tutle = [0 , 0]
  let max_x = 0
  let max_y = 0
  let min_x = 0
  let min_y = 0

  for(let i=0; i<moves[n].length; i++){
    if(moves[n][i]=='F'){
      tutle[0] = tutle[0] + dir[cur_dir][0]
      tutle[1] = tutle[1] + dir[cur_dir][1]
    }
    else if(moves[n][i]=='B'){
      tutle[0] = tutle[0] - dir[cur_dir][0]
      tutle[1] = tutle[1] - dir[cur_dir][1]
    }
    else if(moves[n][i]=='L'){
    if(cur_dir === 0){
      cur_dir = 2
      //상 >> 좌
    }else if(cur_dir === 1){
      cur_dir = 3
      //하 >> 우
    }else if(cur_dir === 2){
      cur_dir = 1
      //좌 >> 하
    }else{
      cur_dir = 0
      //우 >> 상
    }
    }
    else if(moves[n][i] =='R'){
      if(cur_dir === 0){
        cur_dir = 3
        //상 >> 우
      }else if(cur_dir === 1){
        cur_dir = 2
        //하 >> 좌
      }else if(cur_dir === 2){
        cur_dir = 0
        //좌 >> 상
      }else{
        cur_dir = 1
        //우 >> 하
      }
    }

    tutle[0] > max_x ? max_x = tutle[0] : max_x = max_x
    tutle[0] < min_x ? min_x = tutle[0] : min_x = min_x
    tutle[1] > max_y ? max_y = tutle[1] : max_y = max_y
    tutle[1] < min_y ? min_y = tutle[1] : min_y = min_y
    /*
    한번의 명령어를 실행 후 최소값인지 최소값인지 판별 하고 각각 min,max 변수에 할당
    */
  }
  return (max_x - min_x)*(max_y - min_y)
   /*
   반복문이 종료 됐다는건 하나의 테스트케이스를 모두 돌았다는 의미이므로 계산식에 대입 후 반환
   */
}

for(let i=0; i<moves.length; i++){
  console.log(solution(i))
}

좌표 조정에 대해 더 확실히 짚고 갈 수 있었고 내가 떠오르고 이해하기 쉬운 방향으로 만드는 방법도 배웠다!
좌표킹강경규

profile
안녕하시오?

1개의 댓글

comment-user-thumbnail
2023년 7월 27일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

답글 달기