문제 출처 : https://www.acmicpc.net/problem/5211
언어 : Kotlin
문제 설명 :
현환이는 음악 학원에서 피아노를 배우고 있다. 어느 날 선생님은 현환이에게 조표가 없는 악보를 주었다. 자 이제 어떤 음계가 사용되었는지 알아보려고 한다. 현환이는 피아노를 배운지 얼마 되지 않았기 때문에, 칠 수 있는 음계는 가단조와 다장조밖에 없다.
현대 음악에서 한 옥타브는 12음 {A, A#, B, C, C#, D, D#, E, F, F#, G, G#}으로 이루어진다. 가단조를 구성하는 음의 순서는 (A, B, C, D, E, F, G)이고, 다장조를 구성하는 음의 순서는 (C, D, E, F, G, A, B)이다.
가단조와 다장조를 구성하는 음은 같다. 그럼 차이는 무엇일까?
첫 번째 차이는 중심음의 차이이다. 으뜸음은 음계에서 가장 첫 번째 위치에 있는 음이고, 버금딸림음은 네 번째 위치에 있는 음이다. 마지막으로 딸림음은 다섯 번째 위치에 있는 음이다. 가단조에서 으뜸음, 버금딸림음, 딸림음은 A, D, E이고, 다장조에서는 C, F, G이다. 이 세 음을 중심음이라고 한다.
두 번째 차이는 음정의 차이이다. 가단조에서 세 번째 음(C)은 으뜸음(A)보다 반음 세 개 높고, 다장조에서 세 번째 음(E)은 으뜸음(C)보다 반음 네 개 높다. 이러한 음정의 차이때문에 단조는 슬픈 느낌을, 장조는 기쁜 느낌을 준다.
가단조 또는 다장조의 음악이 주어졌을 때, 어떤 음계인지 알아내는 프로그램을 작성하시오.
각 마디의 첫 음으로 나오는 중심음이 가장 많은 음계가 그 음악의 음계이다. 가단조와 다장조의 중심음 개수가 같은 경우에는 마지막 음으로 음계를 결정한다. 마지막 음은 가단조인 경우 A, D, 또는 E로 주어지며, 다장조인 경우 C, F 또는 G로 주어진다.
예를 들어, 유명한 음악인 Frère Jacques의 악보는 다음과 같다.
CD|EC|CD|EC|EF|G|EF|G|GAGF|EC|GAGF|EC|CG|C|CG|C
|는 각 마디를 나누는 마디선이다. 여기서 각 마디의 첫 번째 음을 적어보면 다음과 같다. (C, E, C, E, E, G, E, G, G, E, G, E, C, C, C, C) 여기서 (C, C, G, G, G, G, C, C, C, C)는 다장조의 중심음이고, (E, E, E, E, E, E)는 가단조의 중심음이다. 따라서, 이 음악은 다장조이다.
입력 :
첫째 줄에 음악이 주어진다. 음악은 {"A", "B", "C", "D", "E", "F", "G", "|"}로 이루어져 있으며, 길이는 5보다 크거나 같고, 100을 넘지 않는다. |가 연속해서 등장하거나, 문자열의 양쪽 끝에 나오는 경우는 없다.
출력 :
다장조라면 C-major, 가단조라면 A-minor를 출력한다. 항상 둘 중 하나로 답이 결정되는 입력만 주어진다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
AEB|C | C-major |
CD|EC|CD|EC|EF|G|EF|G|GAGF|EC|GAGF|EC|CG|C|CG|C | C-major |
풀이 :
문제가 길고 다른 분야라 어렵게 쓰려고 했다. 실제로 여러번 틀렸다...
"|"을 기준으로 쪼개어진 조각들의 첫번째 음 --> 중심음.
이 중심음을 가단조와 다장조의 중심음으로 나눠 카운트한다.
- 가단조 중심음 = A, D, E
- 다장조 중심음 = C, F, G
이 카운트 수가 같다면 마지막 조각의 마지막 음을 판별하여 카운트해주고 결과를 출력하면 된다.
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val count = IntArray(2)
val input = readLine().split("|")
for (i in input.indices) {
when (input[i][0]) {
'A', 'D', 'E' -> count[0]++
'C', 'F', 'G' -> count[1]++
}
}
val last = input.last().last()
if (count[0] == count[1]) {
when (last) {
'A', 'D', 'E' -> count[0]++
'C', 'F', 'G' -> count[1]++
}
}
bw.write(if (count[0] > count[1]) "A-minor" else "C-major")
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
5949번: Adding Commas (0) | 2024.07.23 |
---|---|
26731번: Zagubiona litera (0) | 2024.07.23 |
31746번: SciComLove (2024) (0) | 2024.07.22 |
24196번: Gömda ord (0) | 2024.07.22 |
31458번: !!초콜릿 중독 주의!! (0) | 2024.07.19 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!