레이더 스코프
시간 제한1초메모리 제한128 MB
5초 간격의 레이더 스캔 두 개를 받아 각 항공기가 장비 이상, 신규 진입, 신규 이륙, 영역 이탈, 영역 손실 중 어떤 경고에 해당하는지 거리와 속도 기준으로 판정하고 번호순으로 출력한다.
문제
당신은 새로운 항공 교통 관제 시스템을 만드는 소프트웨어 설계 팀에 합류했습니다. 이 시스템의 기능 중 하나는 감시 대상 항공기의 계기가 제대로 작동하는지 자동으로 검증하고, 위험에 처했거나 방금 이륙했거나 추락했을 가능성이 있는 항공기를 관제사에게 경고하는 것입니다. 여러분은 이 기능의 시제품을 작성해야 합니다.
프로그램은 여러 개의 시나리오를 입력받으며, 각 시나리오는 두 번의 레이더 스윕으로 구성됩니다. 한 번의 스윕은 대에서 대까지의 비행기를 탐지합니다. 스윕이 어떤 비행기를 만날 때마다 데이터 수집 장치는 레이더로부터의 방위각과 거리(마일 단위)를 측정하고, 비행기로부터 스쿼크 번호와 대지 속도(마일/시, 바람 보정이 적용된 대기 속도)를 함께 얻습니다. 두 번의 스윕 정보를 바탕으로, 레이더 영역 안의 각 비행기에 대해 경고가 필요한지 판단해야 합니다.
레이더의 탐지 반경은 마일이고, 두 스윕은 정확히 초 간격으로 순간적으로 이루어진다고 가정합니다. 즉 두 스윕 사이의 시간은 시간입니다.
방위각 와 거리 는 평면 좌표로 바꿀 수 있으며(거리 계산에는 상대 위치만 필요합니다), , 로 둡니다.
레이더와 비행기 정보를 바탕으로 다음과 같은 경고를 판단합니다.
- equipment warning(계기 경고): 두 스윕에 모두 나타난 비행기에 대해, 비행기가 보고한 두 대지 속도의 평균 가 두 스윕의 위치 변화로 계산한 레이더 측정 속도 (= 두 위치 사이의 거리 )의 이내에 들어오지 않으면 경고합니다. 즉 일 때 경고합니다.
- new intrusion(새 침입) / new aloft(새 이륙): 두 번째 스윕에만 나타난(첫 스윕에는 없던) 비행기를 봅시다. 현재 거리가 라면, 이 비행기가 최단 경로로 스코프 안으로 들어오기 위해 이동해야 하는 최소 거리는 마일입니다. 보고 속도에 여유를 더하면 두 스윕 사이에 최대 마일을 이동할 수 있습니다. 이 값이 이상이면 밖에서 날아 들어온 것으로 보고 new intrusion 경고를, 그렇지 않으면 스코프 안에서 방금 이륙한 것으로 보고 new aloft 경고를 냅니다.
- domain exited(영역 이탈) / domain loss(영역 소실): 첫 번째 스윕에만 나타난(두 번째 스윕에는 없는) 비행기를 봅시다. 첫 스윕 거리가 이라면, 스코프 밖으로 나가기 위한 최소 이동 거리는 마일입니다. 이면 스코프를 벗어난 것으로 보고 domain exited 경고를, 그렇지 않으면 관제 영역 안에서 착륙했거나 추락한 것으로 보고 domain loss 경고를 냅니다.
입력
각 시나리오의 첫 줄에는 첫 번째 스윕에서 탐지된 비행기 수를 나타내는 정수 () 이 주어집니다. 이어지는 개의 줄에는 각각 스윕 1에서 탐지된 비행기 하나의 정보가 주어집니다. 각 정보는 스쿼크 번호, 방위각, 거리, 대지 속도 순서로 이루어집니다. 스쿼크 번호는 1자리에서 5자리 사이의 정수이고, 방위각·거리·대지 속도는 모두 XXX.XXX 형식의 실수로, 필요한 만큼 앞뒤에 0을 채워 6자리를 맞춥니다.
- 스쿼크 번호 (): 각 비행기를 식별하는 전역적으로 유일한 정수이며, 스윕 1과 스윕 2의 같은 비행기를 짝짓는 데 사용합니다.
- 방위각 (): 북쪽을 도로 하여 동쪽 방향으로 도는 각도(도 단위)입니다. 따라서 동쪽은 도, 남쪽은 도, 서쪽은 도입니다.
- 거리 (): 레이더에서 비행기까지의 거리(고도로 인한 추가 거리는 레이더 감지 로직이 이미 제거함)입니다.
- 대지 속도 (): 비행기가 레이더 기준으로 (어느 방향으로든) 움직이는 속도입니다.
첫 번째 스윕의 비행기 정보 바로 다음 줄에는 두 번째 스윕에서 탐지된 비행기 수 () 가 주어지고, 이어서 개의 줄에 스윕 2의 비행기 정보가 같은 형식으로 주어집니다.
다음 시나리오가 있다면 그다음 줄에서 부터 다시 시작합니다. 파일의 끝까지 시나리오를 읽어 처리합니다.
출력
각 시나리오마다 먼저 Scenario # X 를 출력합니다. 여기서 는 시나리오 번호로, 첫 시나리오가 이고 이후 씩 증가합니다.
이어서 경고가 필요한 각 비행기에 대해 정확히 한 줄씩 보고를 출력합니다. 보고 줄은 스쿼크 번호 기준 오름차순으로 정렬합니다. 각 줄은 스쿼크 번호를 1~5열에 오른쪽 정렬하여 쓰고, 6열부터 다음 경고 문자열 중 하나를 이어 씁니다(앞의 공백과 대시를 아래 문자열 그대로 출력해야 합니다):
" -- equipment warning"" -- new intrusion"" -- new aloft"" -- domain exited"" -- domain loss"
경고가 필요 없는 비행기에 대해서는 아무것도 출력하지 않습니다.
연속한 두 시나리오 사이는 빈 줄 하나로 구분합니다(마지막 시나리오 뒤에는 여분의 빈 줄을 두지 않습니다).