TFS 문제 풀이

[백준] 32402 TFS

문제

조건 요약

  • WASD 키 입력 시 주인공과 카메라는 함께 이동하는데, 카메라가 바라보는 방향을 기준으로 W는 앞, A는 왼쪽, S는 뒤, D는 오른쪽으로 이동한다.

  • 2차원 좌표계에서 주인공(0,0)과 카메라(0,-1)가 시작 위치에 있다.
  • 카메라는 항상 주인공을 중심으로 반지름 1인 원 위에 위치하며 주인공을 바라본다.
  • 마우스 이동 시(MR/ML) 카메라만 주인공을 중심으로 90도 회전한다(MR: 시계방향, ML: 반시계방향).
  • N개의 입력에 대해 각 입력 후 주인공과 카메라의 좌표를 출력해야 한다.

풀이 방식

구현문제로 여러가지 상황에 따른 동작을 구현해야 하는 문제였다. 기본적으로 2차원 좌표계를 사용하지만 일반 배열을 사용하는 방식과 다르게 x, y 순서로 출력해야 하는 문제였다. 그래서 처음에 방향을 구현할때 헷갈리는 부분들이 있었다.

Move
카메라와 사람의 움직임을 구현하는 함수이다.

  • d: 카메라 방향 (0: ⬆ 1: ➡ 2: ⬇ 3: ⬅)
  • cmd: 움직임 커맨드 (W: 0, A: 1, S: 2, D:3)
  • cur: 현재 위치

각각의 파라미터를 배열에 순서대로 적용시키면 x, y에 대한 가중치 값을 구할 수 있다. 이를 적용시켰다.

CalculateCameraPosition
카메라의 위치를 계산하는 함수이다. 기본적으로 사람과 반지름이 1인 원위에 위치하기 때문에 다음 카메라 방향과 플레이어의 위치에 따라 다르게 계산 할 수 있었다.

  • d: 카메라 방향 (0: ⬆ 1: ➡ 2: ⬇ 3: ⬅)
  • playerPos: 사람의 위치

사람의 위치에서 카메라가 바라보고 있는 방향의 반대에서 1칸 떨어져있기 때문에 그걸 적용해서 풀이 할 수 있다.

NextCameraPosition
카메라의 다음 방향을 계산하는 함수

  • curDirection: 카메라 방향 (0: ⬆ 1: ➡ 2: ⬇ 3: ⬅)
  • rotateCmd: 마우스 움직임 커맨드 (MR: 0, ML: 1)

마우스의 움직임 커맨드가 주어졌을때 현재 카메라 방향에서 시계, 반시계로 움직이기 때문에 쉽게 찾을 수 있다.
시계의 경우에는 +1, 반시계의 경우에는 -1이지만 음수를 고려해서 +4를 적용한 +3으로 적용했다.

어려웠던 점

기본적으로 조합의 경우의 수가 많아서 배열로 적용시키기가 햇갈렸다. -1, 0, 1로만 이루어져있어서 중간에 틀린 부분들도 꽤나왔다. 그리고 처음에는 카메라의 움직임을 구현할때 사람을 기준으로 생각하지 않고 카메라만 시계, 반시계로 돌리는 방식을 생각했다. 물론 그러한 방식으로도 풀이가 가능했겠지만 여기서 오류를 범하기에 너무 쉬운 환경이였다. 그것보다는 사람을 기준으로 방향만을 통해서 카메라를 이동시키는 것이 더 쉬운 풀이방식이었다. 이를 빠르게 알아차리지 못한게 아쉽다.

답안

참고자료

백준 문제 링크백준 TFS 풀러가기


댓글남기기