You You See What?
면접 대비시간 제한10초메모리 제한1024 MB
UUCP 뱅 경로에서 반복되는 장비 홉을 제거하여 같은 수신자에게 더 짧은 경로를 출력합니다.
문제
약 40여 년 전, 이메일은 UUCP(UNIX-to-UNIX Copy Program)라는 프로토콜로 전송되었다. 보내는 사람은 수신자에 이르는 경로의 모든 기계 이름을 알고 있어야 했고, 그 기계 이름(홉)을 수신자의 UUCP 메일 주소에 직접 적어야 했다. 이런 옛날 주소를 bang path라고 불렀다. bang path는 느낌표로 구분된 기계 이름의 목록이며, 마지막에 마지막 기계의 수신자 계정 이름이 붙는다. 예를 들면 다음과 같다:
texasam!rice!baylor!csdept!bresearch!bpoucher
이 주소는 보내는 쪽 시스템에 "texasam" 기계로 메일을 보내라고 알려준다. texasam은 메일을 "rice"로, rice는 "baylor"로, baylor는 "csdept"로, csdept는 "bresearch"로 보낸다. 마지막 기계인 bresearch에 도착하면 그 기계의 "bpoucher" 사용자에게 전달된다. 도중에 오류(알 수 없는 기계, 기계 다운 등)가 생기면 문제를 설명하는 메일이 보낸 사람에게 되돌아가야 했다. 기계가 여덟 대나 열 대인 bang path도 흔했다. 경로 지정의 책임은 보내는 사람에게 있었다. 수신자의 기계까지 필요한 만큼 홉을 거쳐 가는 방법을 보내는 사람이 알아야 했다. 아직 인터넷이 없었기 때문에 기계들은 다이얼업 모뎀으로 하루에 한두 번 메일을 주고받았고, 그래서 메일이 수신자에게 도착하기까지 며칠이 걸리기도 했다.
UUCP 네트워크에는 같은 이름을 가진 기계가 여러 대 있을 수 있었지만, 이름이 같은 두 기계가 공통의 기계와 통신하는 것은 허용되지 않았다. 위 예에서 baylor는 서로 다른 두 기계 csdept와 직접 통신할 수 없었다.
경험이 부족한 사용자들은 bang path에 루프를 넣기도 했다.
texasam!rice!baylor!csdept!baylor!rice!dev!bresearch!bpoucher
이 경로도 동작은 하지만 비효율적이며 메일을 늦게 만든다. rice는 baylor로, baylor는 csdept로 보내고, csdept는 다시 baylor로, baylor는 rice로 되돌려 보내며, 마지막으로 rice가 dev로 보낸다. csdept!baylor!rice 단계를 빼도 결과는 같고 메일은 더 빨리 도착한다. 기계가 메일을 자기 자신에게 전달할 수도 있다.
texasam!Rice!rice!rice!rice!rice!bpoucher
이 경우 rice 홉은 하나만 남기고 모두 뺄 수 있으므로 결과는 texasam!Rice!bpoucher가 된다.
이 문제에서는 bang path를 읽고 불필요한 홉을 제거한 뒤, 더 짧아졌을 수도 있는 새 bang path를 출력한다.
입력
입력은 유효한 bang path가 담긴 한 줄이다. 문자열의 길이는 1 이상 256 이하이다. 끝의 사용자 이름을 포함한 bang path의 각 구성 요소는 1자 이상 10자 이하의 영숫자이다. 구성 요소는 하나의 느낌표(!)로 구분된다. 기계 이름과 사용자 이름은 대소문자를 구분하지 않지만, 표기는 그대로 유지된다. 느낌표가 하나도 없으면 그 구성 요소 하나가 보내는 쪽 기계의 사용자 이름이다.
출력
불필요한 홉을 제거하고, 더 짧아졌을 수도 있는 bang path를 한 줄로 출력한다. 기계 이름은 대소문자를 구분하지 않고 비교하지만, 출력에서는 각 이름의 원래 표기를 유지한다. 같은 기계가 여러 표기로 나타나면 그중 어느 것을 남겨도 된다.