윈도 매니저
시간 제한2초메모리 제한256 MB
겹치지 않는 창을 열고 닫고 크기를 바꾸며 미는 힘으로 연쇄 이동시키는 휴대폰 창 관리자를 시뮬레이션하고 오류를 출력합니다.
문제
터치 화면이 널리 쓰이면서 컴퓨터를 다루는 방식이 달라졌다. 터치 인터페이스에서 자주 쓰는 착상 하나는 화면 위의 물체가 물리 법칙을 따르는 것처럼 움직이게 만드는 것이다. 이 문제에서 그 예를 구현한다.
휴대폰 윈도 매니저 시뮬레이터를 만들어야 한다. 화면은 직사각형이고 직사각형 윈도를 0개 이상 완전히 담는다. 어떤 윈도도 화면 경계를 넘지 않고, 두 윈도가 서로 겹치지도 않는다. 시뮬레이터는 명령 네 가지를 지원한다.
OPEN x y w h: 왼쪽 위 모서리가 이고 너비가 픽셀, 높이가 픽셀인 윈도를 새로 연다.CLOSE x y: 픽셀 를 포함하는 윈도를 닫는다. 사용자는 윈도의 아무 곳이나 두드려서 닫을 수 있다.RESIZE x y w h: 픽셀 를 포함하는 윈도의 크기를 너비 , 높이 로 바꾼다. 왼쪽 위 모서리는 움직이지 않는다.MOVE x y dx dy: 픽셀 를 포함하는 윈도를 가로로 픽셀 또는 세로로 픽셀 옮긴다. 와 중 0이 아닌 값은 많아야 하나다.
OPEN과 RESIZE는 결과로 생기는 윈도가 다른 윈도와 겹치지 않고 화면 안에 그대로 들어갈 때만 성공한다. MOVE는 요청한 픽셀 수만큼 최대한 옮긴다. 가 30인데 오른쪽으로 15픽셀만 갈 수 있다면 15픽셀만 간다.
옮기는 윈도가 다른 윈도에 부딪히면 그 윈도를 같은 방향으로 필요한 만큼 밀어낸다. 실제 물체가 부딪히는 것과 같다. 밀린 윈도가 또 다른 윈도를 만나면 그 윈도도 함께 밀린다. 그림 1은 윈도가 세 개 있는 상황에서 윈도 A를 오른쪽으로 옮겨 나머지 둘을 함께 미는 모습이다.

그림 1: 윈도를 두 개 미는 MOVE
입력
첫째 줄에 화면의 가로 크기 와 세로 크기 가 픽셀 단위 양의 정수로 주어진다. 둘 다 이하다. 화면의 왼쪽 위 픽셀 좌표는 이다.
다음 줄부터 위에서 설명한 명령이 한 줄에 하나씩 주어진다. 명령 이름과 인자는 공백 하나 이상으로 구분한다. 인자는 모두 정수이고 , , , 을 만족한다. 명령은 많아야 256개다.
출력
명령을 입력에 나온 순서대로 시뮬레이션한다. 명령 번호는 1부터 센다. 명령을 시뮬레이션하다가 오류가 생기면 명령 번호와 명령 이름, 그리고 아래 목록에서 처음으로 들어맞는 메시지를 한 줄에 출력하고, MOVE의 예외를 빼면 그 명령의 결과는 반영하지 않는다. 형식은 다음과 같다.
Command N: NAME - message
no window at given position:CLOSE,RESIZE,MOVE에서 주어진 위치를 포함하는 윈도가 없을 때.window does not fit:OPEN,RESIZE에서 결과로 생기는 윈도가 다른 윈도와 겹치거나 화면 경계를 넘을 때.moved d' instead of d:MOVE에서 윈도를 픽셀 옮기라고 했지만, 어떤 윈도가 화면 경계를 넘어야 하는 상황이 되기 전까지 픽셀만 옮길 수 있었을 때. 와 은 각각 요청한 거리와 실제로 옮긴 거리의 절댓값이다. 이때도 윈도는 더 짧은 거리만큼 실제로 움직인다.
명령을 모두 시뮬레이션하고 오류 메시지를 모두 출력한 뒤, 아직 열려 있는 윈도의 개수 를 다음 형식으로 출력한다.
k window(s):
그 다음 열린 순서대로 윈도마다 한 줄씩, 왼쪽 위 모서리의 좌표 와 , 너비, 높이를 공백 하나로 구분해 출력한다.