Minor Setback
시간 제한3초메모리 제한1024 MB
튜닝된 주파수 N개가 주어질 때 모든 음이 맞는 장조 또는 단조를 하나만 찾아 각 음의 이름을 출력합니다.
문제
음의 높이는 로그 눈금의 주파수로 나타낸다. 주파수 가 음이름 에 해당한다. 어떤 음의 주파수에 를 곱하면 반음 높은 음이 된다. 표 1은 서양 음악에서 쓰는 음과 그 주파수를 보여준다.
표 1: 여러 음의 주파수와 음이름.
어떤 음의 주파수를 2배 하면 같은 음이 한 옥타브 높아진다. Hz와 Hz가 모두 에 해당하는 이유다. 이 규칙은 일반화된다. 에 2의 거듭제곱을 곱하면 또 다른 가 된다. 표에서 보듯 한 음에 이름이 둘 이상 붙는 경우도 있다.
노래 한 곡은 주파수의 수열로 나타낸다. 장조나 단조 같은 조에 속한 노래는 보통 가능한 음 중 일부만 쓴다. 이 노래가 표 2의 일반적인 조 중 하나에 속한다고 가정하라. 먼저 노래의 조를 찾고, 그다음 노래를 음이름의 수열로 바꿔라.
표 2: 몇 가지 조와 사용하는 음.
입력
첫 줄에 노래의 주파수 개수를 나타내는 정수 이 주어진다. 다음 개 줄에는 음 하나의 주파수를 나타내는 실수 이 한 줄에 하나씩 주어진다. 소수점 아래는 최대 8자리다. 악기는 정확하게 조율되어 있었다고 가정해도 된다. 따라서 각 주파수는 어떤 정수 에 대해 에 절댓값 오차 이하로 가까운 값이다.
출력
첫 줄에 노래가 연주된 조의 이름을 출력한다. G major, F# minor처럼 쓴다. 음이름의 형식은 아래와 같다. 노래가 표 2의 어떤 조에도 맞지 않거나 맞는 조가 둘 이상이면 cannot determine key를 출력한다.
조를 정하지 못하면 다른 내용은 출력하지 않는다. 그렇지 않으면 입력 순서대로 음이름을 한 줄에 하나씩 줄 출력한다. 음이름은 A부터 G 중 한 글자이고, 필요하면 두 번째 글자로 #(샤프) 또는 b(플랫)를 붙인다. 음 하나가 여러 이름을 가질 수 있어도, 각 조의 표에 적힌 이름만 쓴다. 예를 들어 단조에서는 Db 대신 C#을 출력한다.