문제
가로와 세로의 길이가 같은 평지에서 벌목을 한다. 그 지형은 0과 1로 나타나 있다. 1은 아직 잘려지지 않은 나무를 나타내고 0은 아무 것도 없음을 나타낸다. 다음 지형을 보자.
1
2
3
4
5B 0 0 1 1 B 0 0 0 0 B 0 0 0 0 1 1 0 0 0 E E E 0 0
위의 지형에서 길이 3인 통나무 BBB를 밀거나 회전시켜 EEE의 위치로 옮기는 작업을 하는 문제를 생각해 보자. BBB와 EEE의 위치는 임의로 주어진다. 단 문제에서 통나무의 길이는 항상 3이며 B의 개수와 E의 개수는 같다. 통나무를 움직이는 방법은 아래와 같이 상하좌우(Up, Down, Left, Right)와 회전(Turn)이 있다.
코드 의미 U
통나무를 위로 한 칸 옮긴다. D
통나무를 아래로 한 칸 옮긴다. L
통나무를 왼쪽으로 한 칸 옮긴다. R
통나무를 오른쪽으로 한 칸 옮긴다. T
중심점을 중심으로 90도 회전시킨다. 문제는 통나무를 5개의 기본동작(
U
,D
,L
,R
,T
)만을 사용하여 처음위치(BBB)에서 최종위치(EEE)로 옮기는 프로그램을 작성하는 것이다. 단, 최소 횟수의 단위 동작을 사용해야 한다.
제한사항
이외의 제한사항은 없다.
첫번째 생각
통나무의 좌표를 저장하려고 X1,X2,X3,Y1,Y2,Y3를 저장해야 된다고 생각했지만,
항상 통나무의 중심좌표를 기준으로 움직인다고 생각하고 통나무의 상태를 기록하면 중심좌표만 기록하면 된다.
- 통나무의 중심 좌표 구하는법
B B B의 모든 X , Y 좌표를 더한뒤 3으로 나눈다. 그러면 중심좌표를 구할 수 있다.
통나무를 구석에서 옮긴다면 어떻게 될 것인가에 대한 의문이 있는 문제였다.
통나무를 구석에서 옮기는 상황은 고려하지 않고 코드를 작성했지만 통과하는데 문제는 없었다.
Code
1 |
|