문제
음표 시퀀스에서 마디의 첫 음을 분석하여 A단조인지 C장조인지 판별하라.
입력
파이프(|)로 구분된 음표 시퀀스 문자열이 주어진다.
출력
"A-minor" 또는 "C-major"를 출력한다.
예제
| 입력 | 출력 |
|---|---|
| `A | C |
풀이
각 마디의 첫 음을 확인하여 조성을 판별한다.
- 마디의 첫 음이 A/D/E이면 A-minor 카운트를 증가시킨다
- C/F/G이면 C-major 카운트를 증가시킨다
- 동점이면 마지막 음표로 최종 판별한다
핵심 아이디어: 각 마디의 시작 음표만 확인하여 조성의 특성음 비율로 판별한다.
코드
#include <iostream>
#include <string>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string s;
cin >> s;
int A = 0, C = 0;
for (int i = 0; i < s.size(); ++i)
{
if (i == 0 || s[i - 1] == '|')
{
if (s[i] == 'A' || s[i] == 'D' || s[i] == 'E')
A++;
if (s[i] == 'C' || s[i] == 'F' || s[i] == 'G')
C++;
}
}
if (A == C)
{
A += (s[(int)s.size() - 1] == 'A');
C += (s[(int)s.size() - 1] == 'C');
}
if (A > C)
cout << "A-minor\n";
else
cout << "C-major\n";
return 0;
}복잡도
- 시간: O(N) (N: 문자열 길이)
- 공간: O(N)