만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

가짜 금화 찾기

시간 제한0.5초메모리 제한512 MB

요약
N개의 금화 중 가벼운 위조 동전을 두 접시 저울로 최대 5번 비교해 찾는 대화형 문제입니다.
난이도

보통10점 중 5점

유형
수학, 구현
정답자
아직 제출이 없습니다

문제

준혁이는 번호가 11부터 NN까지 적힌 금화 NN개를 가지고 있다. 금화에 적힌 번호가 그 금화의 번호이다. 가지고 있는 금화 중 하나는 가짜 금화이다. 진짜 금화들의 무게는 모두 같고, 가짜 금화는 진짜 금화보다 가볍다. 준혁이는 가짜 금화를 찾기 위해 양팔 저울을 빌렸다. 양팔 저울로는 두 금화 묶음의 무게를 비교할 수 있다. 금화 묶음은 서로 다른 금화를 여러 개 모아놓은 것이며, 묶음의 크기는 00 이상 NN 이하여야 한다. 준혁이는 양팔 저울을 최대 55회만 사용하려고 한다. 양팔 저울을 적절히 활용하여 가짜 금화의 번호를 찾아내자.

입력

첫째 줄에 금화의 수 NN이 주어진다. (1≤N≤128)(1 \le N \le 128)

출력

NN을 입력받은 뒤로는 프로그램과 채점 시스템이 상호작용하며 실행된다. 프로그램은 채점 시스템에 최대 55번까지 질문할 수 있다. 질문은 ? A 0 B 0 형식으로 출력한다. A는 첫 번째 금화 묶음, B는 두 번째 금화 묶음이다. 각 묶음은 금화 번호를 아무 순서로 공백으로 구분하여 출력하고, 묶음의 금화를 모두 출력했음을 뜻하는 0을 출력한다. 금화 번호는 11과 NN 사이의 정수이다. 한 묶음에 같은 금화를 두 번 넣을 수 없고, 금화 하나를 두 묶음에 모두 넣을 수 없다. 채점 시스템은 다음 중 하나로 답한다. <는 금화 묶음 A가 더 가볍다는 뜻이다. >는 금화 묶음 B가 더 가볍다는 뜻이다. =는 두 묶음의 무게가 같다는 뜻이다. 답을 알아내면 ! x를 출력한다. 여기서 xx는 가짜 금화의 번호이다. 답을 출력한 뒤에는 프로그램을 종료한다. 모든 출력 후에는 버퍼를 flush 해야 한다. C는 fflush(stdout), C++는 std::cout << std::flush, Java는 System.out.flush(), Python은 sys.stdout.flush()를 사용한다.

힌트

채점 시스템은 대화를 시작하기 전에 가짜 금화를 정해 두고, 그 금화에 따라 답한다. 대화 도중에 가짜 금화를 바꾸지 않는다.

예제1

  1. 예제 1

    입력
    4
    
    >
    
    <
    
    >
    
    >
    
    
    예상 출력
    
    ? 1 2 0 3 4 0
    
    ? 1 3 0 2 4 0
    
    ? 2 4 0 1 3 0
    
    ? 1 4 0 2 3 0
    
    ! 3