| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 1.5 초 | 1024 MB | 27 | 17 | 9 | 52.941% |
가희의 오빠는 노래를 듣고 즉석에서 반주를 하는 능력이 있습니다. 이번에도 가희는 새로운 노래를 듣고 가희만의 방식으로 반주를 하려고 합니다. 문제에서 등장하는 음의 이름은 12개가 있습니다.
C
C
C# 또는 D$
C# 또는 D$
D
D
D# 또는 E$
D# 또는 E$
E
E
F
F
F# 또는 G$
F# 또는 G$
G
G
G# 또는 A$
G# 또는 A$
A
A
A# 또는 B$
A# 또는 B$
B
B
[표 1] 문제에 등장하는 12개의 음의 이름
음의 이름은 같지만, 높이가 다를 수 있습니다. 이는 {octave}로 결정됩니다.
음에 대한 정보는 아래 두 형식 중 하나로 주어집니다.
character}{octave}
octave} 옥타브에 있는 음의 이름이 {character}인 음입니다.character}{octave}{additional_character}
octave}옥타브에 있는 음의 이름이 {character}{additional_character}인 음입니다.additional_character}는 # 또는 $ 중 하나입니다.즉, 음에 대한 정보는 {octave} 와 음의 이름으로 이루어져 있습니다. 아래 [그림 1]은 피아노 건반을 나타내며, 오른쪽으로 갈수록 음높이가 높아집니다.
[그림 1] 0 옥타브에 있는 음들과 대응되는 피아노 건반
두 음이 인접한다면 아래 조건 중 하나를 만족합니다.
n1인 것의 순번 s1과 음의 이름이 n2인 것의 순번 s2의 차이가 1일 때, 두 음은 인접합니다.n1인 것의 순번은 [표 1]에 있습니다.octave 옥타브이고 음의 이름이 B인 음과 ocvate+1 옥타브이고 음의 이름이 C인 두 음은 인접합니다.예를 들어, 0 옥타브 C와 0 옥타브 C#은 1번 조건을, 0 옥타브 B와 1 옥타브 C는 2번 조건을 만족시킵니다. 따라서, 1 옥타브 C와 1 옥타브 C#, 0 옥타브 B와 1 옥타브 C는 인접합니다. 아래 [그림 2]에서 빨간 화살표는 인접한 두 음을 보여줍니다.
[그림 2] 인접한 두 음의 예시
인접한 두 음 사이의 거리는 반음입니다. 음 note1과 음 note2의 반음 거리가 n이라는 의미는 아래 둘 중 하나를 의미합니다.
note1보다 3개의 반음만큼 음높이가 높아진 음은 note2입니다.note1보다 3개의 반음만큼 음높이가 낮아진 음은 note2입니다.아래 [표 3]은 문제에 자주 등장하는 용어들을 나타낸 것입니다.
[표 2] 문제에 자주 나오는 용어들과 대응되는 반음 거리
[그림 3] 0 옥타브 도 C0로부터 단 3도 위, 장 3도 위에 있는 음
[그림 1]에서 각 화살표들은 반음 1개의 거리를 나타냅니다. 음 C0으로부터 단 3도 위에 있는 음은 D0#이고 음의 이름은 D#입니다. C0에서 출발하여 빨간색 화살표 따라 이동하면 도착하는 음이기 때문입니다. 음 C0으로부터 장 3도 위에 있는 음은 E0이고, 음의 이름은 E입니다. C0에서 출발하여, 빨간색 화살표와 보라색 화살표를 따라 이동하면 도착하는 음이기 때문입니다.
이제 코드에 대해 설명하겠습니다. 코드에서 근음(1음)이란 뿌리가 되는 음을 의미합니다. 그 위에 장 3도, 또 그 위에 단 3도를 쌓아 올려서 만든 코드를 Major 코드라고 합니다. 몇 개의 Major 코드의 예시가 [표 3]에 있습니다.
C Major
C
E
G
CM
F Major
F
A
C
FM
[표 3] Major 코드 예시
다음에 minor 코드를 알아보겠습니다. Major 코드에서 3음을 반음 내린 것을 minor 코드라고 합니다. 몇 가지 minor 코드의 예제가 [표 4]에 있습니다.
C minor
C
E$
G
Cm
F minor
F
A$
C
Fm
[표 4] minor 코드 예시
다음에 aug 코드를 알아보겠습니다. Major 코드에서의 5음을 반음 올린 것을 aug 코드라고 합니다. 몇 가지 aug 코드의 예제가 [표 5]에 있습니다.
C aug
C
E
G#
Caug
F aug
F
A
C#
Faug
[표 5] aug 코드 예시
다음에 dim 코드를 알아보겠습니다. Major 코드에서의 3음, 5음을 반음 내린 것을 dim 코드라고 합니다. 몇 가지 dim 코드의 예제가 [표 6]에 있습니다.
C dim
C
E$
G$
Cdim
F dim
F
A$
B
Fdim
[표 6] dim 코드 예시
가희는 아래와 같은 알고리즘으로 반주를 하려고 합니다.
p개의 마디에서 k번 이상 쓰였던 코드들은 제외합니다. 이 작업을 수행한 후 남은 코드의 개수가 r이라면
r이 0인 경우, 가장 오랫동안 사용하지 않은 코드를 선택합니다.
r이 0보다 큰 경우
m번째 마디에 총 몇 번 나왔는지를 계산합니다. 이 수치가 가장 높은 코드를 선택합니다.이 알고리즘에 따라, p와 k가 1이고 마디 수가 1인 음악에 대해 반주해 보겠습니다.
F2E2D2E2F2
[표 7] 예제 1의 곡
먼저 첫 번째 마디에 F2, E2, D2, E2, F2, 순서대로 나옵니다. 즉, 음의 이름이 D(레)인 것이 1번, E(미)인 것이 2번, F(파)인 것이 2번 나옵니다. C Major 코드를 이루는 음의 이름이 1번째 마디에서 몇 번 나왔는지 세 보겠습니다.
C
-
E
2
G
-
[표 8] C, E, G가 1번째 마디에 나온 횟수
C Major를 이루는 음의 이름이 C, E, G인 것이 나온 횟수를 모두 합하면 2가 됩니다. 이런 식으로 모든 코드에 대해, 코드를 이루는 음의 이름이 1번째 마디에 총 몇 번 나왔는지 계산합니다. 그 결과는 [표 9]에 있습니다.
A#M
3
Bdim
3
Ddim
3
Dm
3
CM
2
[표 9] 코드를 이루는 음의 이름이 1번째 마디에 나온 횟수
이 중, 아스키코드 사전 순으로 가장 앞선 것은 A#M이 됩니다.
이제 p가 2, k가 1이고 마디 수가 3인 음악에 대해 반주해 보겠습니다.
F2F3F2F3F2F3F2F3
F0F1F0F1F0F1F0F1
F2F2F3F2F3F2F3F2
[표 10] 예제 2의 곡
먼저 첫 번째 마디에 F2, F3, F2, F3, F2, F3, F2, F3 순서대로 나옵니다. 즉 음의 이름이 F(파)인 것이 8번 나옵니다.
C#M
8
FM
8
A#M
8
Dm
8
Fm
8
A#m
8
C#aug
8
Faug
8
Aaug
8
Ddim
8
Fdim
8
Bdim
8
[표 11] 각 코드가 이루는 음의 이름이 1번째 마디에 나온 횟수
코드를 이루는 음의 이름이 총 몇 번 나왔는지 셉니다. 가장 많이 나온 코드는 8회였고, 이를 만족하는 코드는 총 12개입니다. r이 0보다 크므로, 12개의 코드 중 아스키코드 사전 순으로 가장 앞선 A#M을선택합니다.
2번째 마디를 반주해 보겠습니다. 두 번째 마디에는 F0, F1, F0, F1, F0, F1, F0, F1 순서대로 나옵니다. 1번째 마디와 같이 음의 이름이 F(파)인 것이 8번 나옵니다. 이전 2개의 마디에서 1번 이상 쓰인 A#M을 제외한 나머지 코드들에 대해, 각 코드가 이루는 음의 이름이 총 몇 번 나왔는지 셉니다.
C#M
8
FM
8
Dm
8
Fm
8
A#m
8
Aaug
8
C#aug
8
Faug
8
Ddim
8
Fdim
8
Bdim
8
A#M를 제외한 나머지
0
[표 12] 각 코드가 이루는 음의 이름이 2번째 마디에 나온 횟수
코드를 이루는 음의 이름이 총 몇 번 나왔는지 셉니다. 가장 많이 나온 횟수는 8번이었고, 이를 만족하는 코드는 11개입니다. r이 0보다 크므로, 11개의 코드 중 아스키코드 사전 순으로 가장 앞선 A#m를 선택합니다.
3번째 마디를 반주해 보겠습니다. 세 번째 마디에는 F2, F2, F3, F2, F3, F2, F3, F2 순서대로 나옵니다. 1, 2번째 마디와 같이 음의 이름이 F(파)인 것만 8번 나옵니다. 이전 2개의 마디에서 1번 이상 쓰인 A#M, A#m을 제외한 나머지 코드들에 대해, 각 코드가 이루는 음의 이름이 총 몇 번 나왔는지 셉니다.
C#M
8
FM
8
Dm
8
Fm
8
Aaug
8
C#aug
8
Faug
8
Ddim
8
Fdim
8
Bdim
8
A#M과 A#m을 제외한 나머지
0
[표 13] 각 코드 이루는 음의 이름이 3번째 마디에 나온 횟수
가장 많이 나온 횟수는 8번이었고, 이를 만족하는 코드는 10개입니다. r이 0보다 크므로, 10개의 코드 중 아스키코드 사전 순으로 가장 앞선 Aaug를 선택합니다.
첫 줄에 마디 수 m과 문제에서 설명한 p, k가 공백으로 구분되어 주어집니다.
다음 m개의 줄에 마디에 나오는 음의 정보들이 주어집니다. 이때 음은 아래와 같은 형식으로 주어집니다.
{character}{octave}{addtional_character}
character}
A, B, C, D, E, F, G 중 하나로 주어집니다. 한국식 음의 이름은 각각 라, 시, 도, 레, 미, 파, 솔을 의미합니다.octave}
addtional_character} (optional)
character}{octave}보다 반음 높은 경우 #으로, 반음 낮은 경우 $으로 주어집니다.예를 들어 한 마디에 0 옥타브 레, -1 옥타브 시, 0 옥타브 레#, 0 옥타브 레♭이 있다고 했을 때, 아래와 같이 입력이 주어집니다.
D0B-1D0#D0$
또한 한 마디에 0 옥타브 레#, 0 옥타브 레, 0 옥타브 레#, 0 옥타브 레#이 있다고 했을 때, 아래와 같이 입력이 주어집니다.
D0#D0D0#D0#
단, 아래의 입력은 주어지지 않습니다.
character
additional_character
B
#
C
$
E
#
F
$
[표 14] 주어지지 않는 입력
m개의 줄에 답을 출력해 주세요. 이때
{character}{additional_character}{type}
형식으로 출력해 주세요.
character}
A, B, C, D, E, F, G 중 하나입니다. 한국식 음의 이름은 각각 라, 시, 도, 레, 미, 파, 솔을 의미합니다.addtional_character} (optional)
character}보다 반음 위에 있는 경우 #으로 출력합니다.
character}가 B이거나 E인 경우 뒤에 #을 붙이지 않습니다.type}
M, m, aug, dim중 하나입니다.예를 들어, D#M의 경우, E$M으로도 표시될 수 있습니다. 이는 같은 옥타브에 있는 음의 이름이 D#인 것과, E$인 것이 같은 음(딴이름 한소리)이기 때문입니다. 이로 인해 발생하는 혼동을 방지하기 위해 출력 형식 제한이 있다는 것을 유의해 주세요.
1 ≤ m ≤ 5×1041 ≤ p ≤ m1 ≤ k ≤ p1 1 1 F2E2D2E2F2
A#M
3 2 1 F2F3F2F3F2F3F2F3 F0F1F0F1F0F1F0F1 F2F2F3F2F3F2F3F2
A#M A#m Aaug
#은 a보다, 대문자는 소문자보다 아스키 사전순으로 앞섭니다.
1 1 1 C1E1G1C2
CM
2 1 1 F2C3F2C3F2C3 C3
FM Adim
5 1 1 C1E2G2 C1E2G2 C1E2G2 F1A2C1 F1A2C1
CM Am CM FM Aaug
먼저 C, E, G로 이루어진 코드는 C Major 코드입니다. 따라서, 1번째 줄에 CM을 출력합니다.
다음에, p가 1이고 k가 1이므로 이전 1마디에서 1번 이상 사용되지 않은 코드들 중에서 코드를 이루는 음의 이름이 2번째 마디에 몇 회 나왔는지 셉니다. 따라서 CM은 제외됩니다. CM은 C, E, G가 나오는 유일한 코드이므로 2번째 마디에서 코드를 이루는 음의 이름이 2회 이상 나온 코드들을 고릅니다. 이 중, 사전순으로 가장 앞선 것은 Am입니다. 따라서 2번째 줄에 Am을 출력합니다. Caug도 2회 나오지만 Am보다 사전순으로 뒤에 있음에 유의하세요. 다음에, 2번째 마디에서 CM은 사용되지 않았으므로, C, E, G가 나오는 유일한 코드인 CM을 선택합니다. 따라서 3번째 줄에 CM을 출력합니다.
다음에 F, A, C로 이루어진 코드는 F Major 코드입니다. 따라서 4번째 줄에 FM을 출력합니다.
다음에, p가 1이고 k가 1이므로 이전 1마디에서 1번 이상 사용되지 않은 코드들 중에서 코드를 이루는 음의 이름이 5번째 마디에 몇 회 나왔는지 셉니다. 따라서 FM은 제외됩니다. FM은 F, A, C가 나오는 유일한 코드이므로 2번째 마디에서 코드를 이루는 음의 이름이 2회 이상 나온 코드들을 고릅니다. 이 중, 사전순으로 가장 앞선 것은 Aaug입니다. 따라서 5번째 줄에 Aaug을 출력합니다.
5 2 2 C1E2G2 C1E2G2 C1E2G2 F1A2C1 F1A2C1
CM CM Am FM FM
먼저 C, E, G로 이루어진 코드는 C Major 코드입니다. 따라서, 1번째 줄에 CM을 출력합니다. 그리고 2번째 줄에도 CM을 출력합니다. 이전 2개의 마디 중에 CM이 2번 이상 쓰이지 않았기 때문입니다.
다음에, 이전 2마디에서 2번 이상 사용되지 않은 코드들 중에서 코드를 이루는 음들이 몇 회 나왔는지 셉니다. 따라서 1번째 마디와 2번째 마디에 이용된 코드인 CM은 제외됩니다. CM은 C, E, G가 나오는 유일한 코드이므로 3번째 마디에서 코드를 이루는 음의 이름이 2회 이상 나온 코드들을 고릅니다. 이 중, 사전순으로 가장 앞선 것은 Am입니다. 따라서 3번째 줄에 Am을 출력합니다.
다음에 F, A, C로 이루어진 코드는 F Major 코드입니다. 따라서 4번째 줄에 FM을 출력합니다. 그리고 5번째 줄에도 FM을 출력합니다. 이전 2개의 마디 중에 FM이 2번 이상 쓰이지 않았기 때문입니다.
2 1 1 C1A1C2B1$A1 C2G1G1
Adim CM
3 1 1 E-2E-2$E-2E-2$E-2 F0E0F0E0F0 F2#F2F2#F2F2#
A#dim A#M A#aug
#이나 $는 해당 음에서만 적용됩니다. 임시표의 ♭, #과 정의가 다름에 유의하세요.
2 2 2 C1D1E1F1G1A1B1C2 C2B1A1G1F1E1D1C1
Am Am
49 48 1 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0
Adim Am CM Caug Cdim Cm Eaug F#dim FM Fm G#M G#aug A#M A#aug A#dim A#m AM Aaug BM Baug Bdim Bm C#M C#aug C#dim C#m D#M D#aug D#dim D#m DM Daug Ddim Dm EM Edim Em F#M F#aug F#m Faug Fdim G#dim G#m GM Gaug Gdim Gm Adim
모든 마디는 음의 이름이 C인 것이 8번 나옵니다. 음의 이름이 C인 음으로 이루어진 코드는 총 12개가 있는데, 이 중 Adim이 사전순으로 제일 앞섭니다. 따라서 1번째 줄에 Adim을 출력합니다. 다음에 k가 48이고 p가 1입니다. 이는 이전 48개의 마디 중에 1번 이상 쓰지 않은 코드를 제외한다는 것입니다. 49번째 마디를 연주할 때에는 모든 코드가 이전 48개의 마디 중에 최소 1번 이상 쓰였으므로, r이 0이 됩니다. 각 코드가 마지막으로 사용된 마디는 [표 15]에 있습니다.
Adim
1
Am
2
CM
3
[표 15] 각 코드가 마지막으로 사용된 마디
Adim이 가장 오랫동안 사용되지 않았으므로, 49번째 줄에는 Adim을 출력합니다.
오빠. 숨어서 듣지 말고 대놓고 듣자.
Contest > BOJ User Contest > 가희와 함께 하는 코딩 테스트 > 가희와 함께 하는 5회 코딩테스트 H번