ICPC 2015 World Finals M번- 윈도우 관리자 > 문제은행 : 정보올림피아드&알고리즘




3551 : 윈도우 관리자

제한시간
2000 ms   
메모리제한
256 MB   
해결횟수
6 회   
시도횟수
60 회   

문제

최근 몇 년간 유저 인터페이스 기술은 엄청나게 발전했다. 키보드와 마우스는 오랫동안 컴퓨터를 사용하기 위한 도구의 자리를 지켜 왔다. 하지만 스마트폰과 타블렛이 등장한 뒤, 사람들은 화면을 두드리거나 드래그하는 등의 방식으로 컴퓨터를 사용하기 시작했다. 이것은 유저 인터페이스 디자인의 새로운 패러다임이 되었다. 중요한 원칙 중 하나는 화면에 보이는 물체들이 물리 법칙을 따르도록 해야 한다는 것이다. 이 문제에서, 여러분은 이런 UI 디자인의 예시 하나를 보게 될 것이다.

 

당신은 Advanced Cellular Manufacturers(ACM)에서 개발할 새로운 스마트폰의 윈도우 매니저 시뮬레이터를 개발하여야 한다. 이 스마트폰은 사각형 모양의 화면을 가지고 있고, 0개 이상의 직사각형 윈도우들을 가지고 있다. 여기서 윈도우는 화면을 벗어나거나, 다른 윈도우와 겹칠 수 없다. 시뮬레이터는 다음 명령을 할 수 있어야 한다.

 

  1. OPEN x y w h - 왼쪽 위 꼭지점 좌표가 (x, y)고, 너비가 w, 높이가 h인 새로운 윈도우를 만든다.
  2. CLOSE x y - (x, y)를 포함하는 윈도우를 닫는다. 이것은 윈도우의 어디를 눌러도 끌 수 있도록 디자인되었다.
  3. RESIZE x y w h - (x, y)를 포함하는 윈도우를 너비 w, 높이 h가 되도록 크기를 바꾼다. 이 때, 왼쪽 위 꼭지점은 위치가 변하지 않는다.
  4. MOVE x y dx dy - (x, y)를 포함하는 윈도우를 수평으로 dx, 수직으로 dy만큼 이동한다. dx와 dy 중 최대 하나만 0이 아니다.

 

OPEN과 RESIZE 명령은, 명령을 수행했을 때 다른 윈도우와 겹치지 않고 화면을 벗어나지 않을 때만 수행된다. MOVE 명령은 윈도우를 최대한 많이 옮기는 방식으로 수행된다. 예를 들어, dx가 30이지만 15픽셀만큼만 오른쪽으로 이동할 수 있다면, 15픽셀만큼 이동하게 된다.

 

ACM은 MOVE 명령을 자랑스럽게 여기고 있다. 윈도우를 옮기면 다른 윈도우에 부딪힐 수 있다. 이 경우, 첫 번째 윈도우는 두 번째 윈도우를 같은 방향으로 이동할 수 있는 만큼 최대한 많이 밀어내게 된다. 이것은 마치 물리적인 법칙을 따르는 것과 같다. 이 법칙은 연속적으로 일어날 수 있는데, 이동 거리가 남아있다면 몇 개의 윈도우를 만나도 밀어낼 수 있는 만큼 모두 밀어낸다. 아래 그림은 윈도우 A가 오른쪽으로 움직이면서 윈도우 B, C를 오른쪽으로 밀어내는 모습을 보여준다.​ 

 


입력형식

첫 번째 줄에는 화면의 크기를 나타내는 xmax, ymax가 주어진다. 각 숫자는 109를 넘을 수 없다. 

왼쪽 위 픽셀의 좌표는 (0, 0)이다. 그 후, 각 명령이 한 줄에 하나씩, 위에 설명된 것과 동일한 형태로 주어진다. 

명령 이름과 숫자 사이에는 하나 혹은 그 이상의 공백이 있다. 

명령에 주어지는 숫자는 다음과 같은 조건을 만족한다: 0 ≤ x < xmax, 0 ≤ y < ymax, 1 ≤ w, h ≤ 109, and |dx|, |dy| ≤ 109

명령은 최대 256개이다.


출력형식

출력은 아래 설명되어 있는 것과 완벽하게 같아야 한다.

입력으로 주어진 순서대로 명령을 실행해야 한다. 만약 명령을 수행하는 동안 에러가 발생한 경우, 명령 번호와, 명령 이름, 그리고 아래 제시된 에러 메세지 중 가장 적합한 메세지를 출력하고, 그 명령을 수행하지 않아야 한다.

  1. no window at given position - CLOSE, RESIZE, MOVE 명령에 대하여, (x, y)를 포함하는 윈도우가 없는 경우에 출력한다.
  2. window does not fit - OPEN, RESIZE 명령에 대하여, 명령을 수행했을 때 다른 윈도우와 겹치거나 화면을 벗어나는 경우 출력한다.
  3. move d’ instead of d - MOVE 명령에 대하여, 명령에서 d 픽셀만큼 이동하라고 했지만 하나 이상의 윈도우가 화면 가장자리에 부딪혀 d’ 픽셀만큼만 이동할 수 있을 때 출력한다. d와 d’은 픽셀의 절댓값을 출력하여야 한다. 명령의 결과물은 d’만큼 이동한 상태여야 한다.

모든 명령을 수행하고, 모든 에러 메세지들을 출력한 뒤, 화면의 상태를 출력한다. 화면의 상태는 첫 번째 줄에 열려있는 윈도우 수를 출력한 뒤, 윈도우가 열린 시간이 빠른 것부터 순서대로 왼쪽 위 좌표와 너비, 높이를 나타내는 수 4개를 출력한다. 자세한 내용은 예제 출력을 참고하여라.​ ​

 


입력 예

320 200
OPEN 50 50 10 10
OPEN 70 55 10 10
OPEN 90 50 10 10
RESIZE 55 55 40 40
RESIZE 55 55 15 15
MOVE 55 55 40 0
CLOSE 55 55
CLOSE 110 60
MOVE 95 55 0 -100

출력 예

Command 4: RESIZE - window does not fit
Command 7: CLOSE - no window at given position
Command 9: MOVE - moved 50 instead of 100
2 window(s):
90 0 15 15
115 50 10 10


경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호

TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com

Copyrightⓒ 2010 jungol. All right reserved.

TOP