테헤란 중앙 교통 관제소는 감시 카메라 사진에서 번호판을 읽어 자동으로 과태료 고지서를 발부하는 시스템을 운영한다. 그런데 데이터베이스 서버의 저장 장치가 하드웨어 고장을 일으켜 데이터가 전부 사라졌다. 남은 자료는 애플리케이션 서버의 로그 파일뿐이다. 다행히 모든 데이터 입력이 서비스 계층을 거치면서 로그로 남기 때문에 로그만으로 잃어버린 정보를 되살릴 수 있다. 로그 파일을 읽어 과태료 고지서를 발부하는 프로그램을 작성하라.
모든 도로는 다음 세 구역 중 하나에 속한다.
일반 승용차는 다음 시간대에 CTRZ에 진입할 수 없다.
등록번호가 짝수로 끝나는 일반 승용차는 다음 시간대에 EORZ에 진입할 수 없다.
등록번호가 홀수로 끝나는 일반 승용차는 토요일, 월요일, 수요일 06:30부터 19:00까지 EORZ에 진입할 수 없다.
이란의 공식 휴일은 금요일이므로 금요일에는 어떤 구역 제한도 적용되지 않는다. 제한 시간대의 시작과 끝 경계도 제한 시간에 포함된다. 예를 들어 월요일 06:30:00에 사진이 찍힌 차량도 과태료를 물어야 한다.
대중교통과 긴급 차량을 비롯한 일부 차량은 시간에 상관없이 CTRZ와 EORZ에 진입할 수 있다. 일반 승용차도 하루짜리 통행 허가를 사면 진입할 수 있지만, 이 문제에서 허가 구매는 고려하지 않는다. 차량이 CTRZ나 EORZ에 불법으로 진입하면 과태료를 물린다. 구역 위반 과태료는 한 차량에 하루 최대 한 건만 발부한다. 같은 날 CTRZ 위반과 EORZ 위반이 함께 일어나면 과태료가 더 비싼 CTRZ 위반으로 발부한다.
모든 도로는 처음에 UZ이고, 처음에는 구역 규정을 면제받는 차량이 없다. 공지가 이 상태를 바꾸며, 공지한 다음 날부터 새 규칙을 적용한다. 면제 대상을 추가하거나 해제하는 변경도 같은 방식으로 다음 날부터 적용한다.
애플리케이션 서버가 제공하는 서비스는 아래와 같다. 서비스마다 로그 메시지가 하나씩 대응하고, 서비스 이름 다음에 매개변수를 이어 한 줄로 적는다. 매개변수는 서비스 정의에 나온 순서대로 기록한다. 서비스 종류와 상관없이 모든 로그의 매개변수 목록은 타임스탬프라고 부르는 day와 time 쌍으로 시작한다. 타임스탬프는 그 서비스 요청이 일어난 정확한 시각이다. day는 시스템을 배치한 날(0일)부터 며칠이 지났는지 나타내는 0 이상의 정수다. time은 그날의 요청 시각을 HH:mm:ss 형식으로 나타낸다(00≤HH≤23, 00≤mm,ss≤59).
setRoadZone(day, time, zone, roads)
zone은 UZ, CTRZ, EORZ 중 하나다. roads는 비어 있지 않은 도로 이름 목록이고, 같은 이름이 여러 번 나올 수 있다. 다음 날부터 이 도로들은 원래 구역 상태를 덮어쓰고 주어진 zone에 속한다. 로그는 다음과 같은 모양으로 남는다.
setRoadZone 2 "09:12:53" "CTRZ" "Enghelab" "Sa'di" "Ferdowsi" "Ferdowsi"
setRoadZone 5 "14:32:01" "EORZ" "Resalat"
setRoadZone 12 "00:00:59" "UZ" "Persian_Gulf"
addZoneException(day, time, vehicles), removeZoneException(day, time, vehicles)
vehicles는 비어 있지 않은 차량 등록번호 목록이고, 같은 번호가 여러 번 나올 수 있다. addZoneException은 다음 날부터 이 차량들이 금지 시간에 CTRZ나 EORZ에 진입해도 과태료를 물지 않게 하고, removeZoneException은 다시 과태료를 물게 한다. 두 명령은 목록에 적힌 차량의 이전 상태를 덮어쓴다. 상태가 그대로인 경우에도 덮어쓴다. 로그는 다음과 같은 모양으로 남는다.
addZoneException 1 "09:00:13" "1234567" "9876543"
removeZoneException 3 "15:33:02" "1234567" "9876345"
addPhotoInfo(day, time, photoId, road, vehicles)
이 서비스는 사용자 인터페이스 계층이 아니라 감시 카메라 사진을 분석하는 외부 영상 처리 서버가 호출한다. 사진을 찍어 분석할 때마다 한 번 호출된다. photoId는 분석한 사진의 식별자인 양의 정수다. road는 사진을 찍은 도로의 이름이다. 영상 처리 서버는 사진에서 차량을 찾아 번호판에서 등록번호를 읽고, vehicles에 그 등록번호 목록을 담는다. 사진에 차량이 없을 수도 있어서 이 목록은 비어 있을 수 있다. 여기서 타임스탬프는 사진을 찍은 순간을 뜻한다. 로그는 다음과 같은 모양으로 남는다.
addPhotoInfo 18 "03:18:43" 3324249 "Pastor" "6256256" "8888310"
addPhotoInfo 4 "20:47:31" 54 "Mokhberoddoleh,_sar-e_Sa'di"
addPhotoInfo 27 "06:39:14" 112385612 "17-e_shahrivar" "1006016"
다음 조건을 가정해도 된다.
과태료는 사진 분석 결과를 바탕으로 물린다. 구역 진입 과태료 고지서는 한 차량에 하루 최대 한 건만 발부하고, 그날 그 위반에 해당하는 사진을 모두 고지서에 첨부한다. 첨부 사진은 찍은 시각이 이른 것부터 정렬한다. 한 차량에 CTRZ 진입과 EORZ 진입이 같이 일어나면 두 위반의 사진을 모두 첨부하되 고지서는 CTRZ 과태료로 발부한다. 고지서를 출력하는 순서도 중요하다. 먼저 차량 등록번호를 사전순으로 정렬하고, 같은 차량의 고지서는 위반 날짜가 이른 것부터 정렬한다.
입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 로그 파일에 담긴 줄의 총 개수 N이 주어진다(1≤N≤1000). 둘째 줄에는 문자열 W와 양의 정수 CTP, EOP가 주어진다. W는 Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday 중 하나이고, 시스템을 배치한 날(0일)의 요일을 뜻한다. CTP와 EOP는 각각 CTRZ 불법 진입과 EORZ 불법 진입의 과태료이며 EOP<CTP이다. 다음 N개의 줄에는 앞에서 설명한 형식의 서비스 로그가 한 줄에 하나씩 주어진다. 이 로그는 여러 로그 파일을 이어 붙인 결과라서 특별한 순서로 정렬되어 있지 않다. 각 줄은 1000글자를 넘지 않는다. 입력에 나오는 모든 정수는 109보다 작다. 입력의 끝에는 0만 적힌 줄이 주어진다.
각 테스트 케이스마다 앞에서 정한 순서로 과태료 고지서를 출력한다. 고지서는 본문 하나와 첨부 사진 하나 이상으로 이루어진다. 본문을 다음 형식으로 한 줄에 먼저 출력한다.
vehicle: "NUMBER", day: DAY, offence: "OFFENCE", penalty: PENALTY
각 자리의 뜻은 다음과 같다.
Outlawed entrance to CTRZ, Outlawed entrance to EORZ, Outlawed entrance to CTRZ & EORZ 중 하나다.첨부 사진은 앞에서 정한 순서로 한 줄에 하나씩 다음 형식으로 출력한다.
photo: PHOTO-ID, time: "TIME", road: "ROAD"
각 자리의 뜻은 다음과 같다.
매개변수 순서, 공백, 문장 부호, 따옴표까지 정해진 형식을 정확히 지켜야 한다. 이웃한 두 테스트 케이스 사이에는 ###만 적힌 줄을 출력한다.