직각 사슬 풀기
시간 제한0.5초메모리 제한512 MB
각 변의 회전 방향이 주어질 때, 진행 방향으로 현재 경계 상자를 1만큼 넓히는 규칙으로 사슬을 다시 만들고 각 변의 길이를 출력한다.
문제
직각 사슬(rectilinear chain)은 수평 선분과 수직 선분이 번갈아 이어지는 순서열이다. 첫 선분은 원점 에서 시작해 오른쪽으로 향한다. 선분이 개인 직각 사슬은 개의 순서쌍 로 기술한다. 는 번째 선분 의 길이이고, 는 에서 로 꺾는 방향이다. 에서 왼쪽으로 꺾으면 , 오른쪽으로 꺾으면 이다. 일 때는 이 마지막 선분임을 뜻하도록 으로 둔다. 예를 들어 그림 (a)의 사슬은 (4, 1), (5, -1), (2, -1), (2, -1), (4, 1), (5, 0)으로 기술된다.

그림. (a) 단순하지 않은 사슬. (b) 풀어낸 단순 사슬.
사슬이 단순하다는 것은 이웃한 두 선분이 공유하는 끝점을 빼면 어떤 두 선분도 점을 공유하지 않는다는 뜻이다. 그림 (a)의 사슬은 단순하지 않다. 꺾는 방향을 모두 그대로 두고 각 선분의 길이만 바꾸면 사슬을 풀어 단순하게 만들 수 있다. 풀어낸 사슬에서 각 선분의 길이는 이상 이하여야 한다. 그림 (b)는 (a)를 풀어낸 한 가지 결과이고, (4, 1), (5, -1), (2, -1), (2, -1), (1, 1), (2, 0)으로 기술된다.
푸는 방법은 보통 여러 가지다. 답을 하나로 정하려고 출력에서 설명하는 규칙으로 만든 사슬만 정답으로 인정한다.
입력
첫 줄에 사슬의 선분 개수 ()이 주어진다. 이어지는 개 줄 중 번째 줄에는 의 길이 ()와 꺾는 방향 가 공백 하나를 사이에 두고 주어진다. 에서 는 왼쪽으로 꺾으면 , 오른쪽으로 꺾으면 이고, 이다.
출력
아래 규칙으로 만든 사슬의 선분 길이 개를 입력 순서대로 한 줄에 공백 하나로 구분해 출력한다. 꺾는 방향은 입력과 같으므로 출력하지 않는다.
원점 에서 시작하고, 처음에 방문한 점은 원점뿐이다. 부터 까지 차례로 의 끝점을 다음과 같이 정한다. 여기서 방문한 점은 원점과 부터 까지의 끝점을 말한다.
- 가 오른쪽으로 가면 끝점의 x좌표는 방문한 점의 x좌표 중 최댓값보다 크다.
- 가 왼쪽으로 가면 끝점의 x좌표는 방문한 점의 x좌표 중 최솟값보다 작다.
- 가 위로 가면 끝점의 y좌표는 방문한 점의 y좌표 중 최댓값보다 크다.
- 가 아래로 가면 끝점의 y좌표는 방문한 점의 y좌표 중 최솟값보다 작다.
의 길이는 시작점과 끝점 사이의 거리다. 이렇게 만든 사슬은 항상 단순하고 모든 길이가 이상 이하다. 입력으로 주어지는 길이 는 이 규칙에 쓰이지 않는다.