함수 오버로딩

시간 제한2초메모리 제한128 MB

문제

프로그래머는 여러 프로그래밍 언어에서 함수를 오버로딩할 수 있다. 함수 오버로딩이란 이름은 같지만 매개변수의 개수나 타입이 다른 함수들을 정의하는 것이다. 그런데 Ada 같은 언어에서는 리턴 타입까지 오버로딩할 수 있다. 즉, 이름과 매개변수가 완전히 같아도 리턴 타입이 다른 함수를 여러 개 선언할 수 있다.

다음은 함수 오버로딩의 예이다.

1: char  f(float x, int   y)
2: char  f(float x, float y)
3: float f(float x, float y)
4: float g(float x, int   y)
5: float g(int   x, float y)

이러한 선언이 있을 때, 아래와 같이 변수 선언과 함수 호출을 포함한 코드를 작성할 수 있다.

1: float a = 1.0, b = 2.0;
2: int   c = 3;
3: float d = g(c, f(a, b));

f의 첫 번째와 두 번째 선언은 이 호출에 사용할 수 없다. 하지만 세 번째 f는 매개변수 타입이 f(float, float)로 일치하고, 리턴 타입 floatg(int, float)가 요구하는 것과 같으므로 사용할 수 있다. 따라서 세 번째 f와 두 번째 g를 사용하면 이 호출을 유일하게 결정할 수 있다.

각 함수 이름별로 선언에 1부터 순서대로 번호(시리얼 넘버)를 붙이면, 위 호출은 다음과 같이 나타낼 수 있다.

d = g2(c, f3(a, b))

반면 같은 선언들로는 c = g(a, f(a, c))를 만족하는 함수 조합이 존재하지 않는다.

마지막으로 다음과 같은 선언이 있다고 하자.

1: float x(float w)
2: int   x(float w)
3: char  y(float v)
4: char  y(int   v)

이 선언에서 char c = y(x(a))(단, float a)라는 호출은, xfloat을 반환하는지 int를 반환하는지에 따라 두 가지로 해석되므로 애매모호(ambiguous)하여 사용할 수 없다.

입력

입력은 여러 개의 함수 선언과 여러 개의 함수 호출로 이루어진다.

함수 선언은 한 줄에 하나씩 주어지며 형식은 다음과 같다.

name num_params param(1) param(2) ... param(num_params) rettype

name은 함수 이름, param(i)i번째 매개변수의 데이터 타입, rettype은 리턴값의 데이터 타입이다(이 문제에 void 함수는 없다). num_params는 1 이상 9 이하이다. 매개변수에는 이름이 없다. 함수 이름은 알파벳 소문자 한 글자, 데이터 타입은 알파벳 대문자 한 글자이다. 같은 이름을 가진 함수 선언들은 연속해서 나타나며, 한 이름당 선언은 최대 500개이다. 두 선언이 이름·매개변수·리턴 타입까지 완전히 똑같은 경우는 없다.

문제에서 설명했듯이, 각 함수 이름별로 선언에 붙이는 번호를 시리얼 넘버라고 한다. 시리얼 넘버는 새로운 함수 이름이 처음 나올 때 1이 되고, 같은 이름의 선언이 나올 때마다 1씩 증가한다.

함수 선언이 모두 끝나면 한 줄에 #가 주어진다. 그 다음 줄부터 함수 호출이 한 줄에 하나씩 주어진다.

함수 호출의 문법은 다음과 같다.

<function_call> := <data_type> = <right_hand_side>
<right_hand_side> := <fname> <num_params> <param_list>
<param_list> := <param> | <param_list> <param>
<param> := <data_type> | <right_hand_side>
<data_type> := <upper_case_letter>
<num_params> := '1' | '2' | ... | '9'
<fname> := <lower_case_letter>

:=|는 문법 정의에만 쓰이는 기호로 실제 입력에는 나타나지 않는다. 각 함수 호출에 등장하는 함수 이름(호출)의 개수는 500개를 넘지 않는다. 함수 호출이 모두 끝나면 마지막 줄에 #가 하나 주어진다.

출력

각 함수 호출에 대해 다음과 같이 출력한다.

  • 사용한 함수 조합을 유일하게 결정할 수 있으면, 입력의 함수 호출에서 각 함수 이름 뒤에 그 함수의 시리얼 넘버를 붙인 형태로 한 줄에 출력한다.
  • 조건을 만족하는 함수가 없어 호출할 수 없으면 impossible을 출력한다.
  • 해석 방법이 여러 가지여서 애매모호하면 ambiguous와 그 경우의 수를 함께 출력한다. 단, 경우의 수가 1000을 넘으면 수 대신 > 1000을 출력한다(즉, ambiguous > 1000).