2564 경비원 / c++ / Silver1 / 54분
문제 및 코드

풀이 과정
구현
- 동근이의 위치 X로부터 각 상점까지의 최단 거리의 합을 구하는 문제
- 단, 블록을 가로질러 갈 수 는 없고 각 면을 타고 가야한다.
- 여기서 나올 수 있는 분기는 총 3가지이다.
- 같은 측면에 있는 상점
- 인접한 옆 측면에 있는 상점
- 맞은편 측면에 있는 상점
- 거리를 구하기 위해 측면의 번호와, 상점의 위치 측정 기준이 불편해서 재가공했다. (정보의 재가공)
- 우선 측면 번호의 경우, 기존엔 북 1, 남 2, 서 3, 동 4 였다. 하지만 이러면 시계방향 진행인지, 맞은 편인지를 측정하기가 불편했다.
- 그래서 바꾼게, 북 0, 동 1, 남 2, 서 3 으로 바꿨다. 이러면 시계방향은 1증가, 반시계 방향은 1감소, 맞은편은 절대값으로 2차이로 파악할 수 있기 때문에 훨씬 편하다.
- 마찬가지로 상점 위치의 기준점도, 기존에는 남, 북은 왼쪽 기준, 동, 서는 위쪽 기준으로 위치를 측정했다.
- 이를 북과 동은 기존대로 두고, 남은 오른쪽 기준, 서는 아랫쪽 기준으로 위치를 재가공 했다. (시계방향으로 진행했을 때의 원점 기준)
- 위와 같이 정보의 재가공을 하고 나면 아래와 같이 식으로 길이를 계산할 수 있다.
- 측면의 차이 = (StartSide - TargetSide + 4) % 4
- 0 은 같은 측면
- 1 은 시계 방향
- 2 는 맞은 편
- 3 은 반 시계 방향
- 해당 상점까지의 길이는 다음과 같이 구할 수 있다.
- 같은 측면 = 절대값(시작 위치와 상점 위치의 차이)
- 시계 방향 = (시작 측면의 길이 - 시작 위치) + 상점의 위치
- 반 시계 방향 = 시작 위치 + (상점 측면의 길이 - 상점의 위치)
- 맞은 편 = 작은값(시계 방향, 반시계 방향) + 인접한 면의 길이
(여기서 시계 방향으로 지나가든, 반 시계 방향으로 지나가든 인접한 면은 무조건 한 번 지나가야 함)
- 위와 같은 공식으로 최소 길이를 구한 뒤, 그 값들을 모두 더해서 출력
- 해결
다시 생각해 볼 점
- 바로 어제 풀어던 문제(봄버맨)에서 정보의 재가공의 중요성을 크게 깨닫고, 여기서 충분히 활용할 수 있는 문제였다.
- 있는 그대로의 정보로는 시계방향, 반시계 방향을 구할 때 분기가 너무 많아지게 된다. (시작위치가 어느 측면이냐에 따라서)
- 하지만 위와 같이 계산하기 편한 값으로 미리 설정해두고 나니 계산이 일목요연해졌고, 편하게 결과값을 구할 수 있었다.
- 문제 분석부터 정보의 재가공까지 시간이 좀 걸렸지만, 결국 한번의 시도로 바로 정답을 맞힐 수 있어서 뿌듯했다. 이렇게 분석에 충분한 시간을 두는 습관을 들여야겠다.