fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 4732 (C++) 조옮김
최초 업로드: 2025-10-08 10:24:35
최근 수정 시간: 2025-10-08 10:24:35
게시자: rlatjwls3333
카테고리: 백준
조회수: 9
# [Bronze I] 조옮김 [문제 링크](https://www.acmicpc.net/problem/4732) ## 문제 설명 <p> 서양 음악의 음계는 12음으로 이루어져 있다.</p> <p> A A# B C C# D D# E F F# G G#</p> <p> 이 12음은 무한히 반복된다. G#보다 높은음은 A이다.</p> <p> 한 음과 인접한 음은 반음 관계이다. #는 "사프"라고 읽으며, 음을 반음 높였다는 뜻이다. "A#"은 A를 반음 높인 음이라는 뜻이다.</p> <p> 플랫은 반음 내린다는 뜻이다. 이 문제에서는 'b'로 표현한다.</p> <p> #와 b를 이용한다면, 같은 음을 여러 가지 이름으로 부를 수 있다. A#과 Bb는 같은 음이다. B#은 C와 같으며, Fb는 E와 같다.</p> <p> 조옮김은 편곡에서 중요한 일 중 하나이다. 조옮김이란 어떤 곡의 모든 음을 동일한 반음 개수만큼 올리거나 낮추는 작업이다. 조옮김 작업을 했을 때, 모든 인접합 음의 반음 개수(음정 관계)는 작업을 하기 전과 같아야 한다.</p> <p> 어떤 곡이 주어졌을 때, 조옮김을 하는 프로그램을 작성하시오.</p> ## 입력 <p> 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 어떤 곡의 음의 순서가 주어진다. 음과 음은 하나 또는 그 이상의 공백으로 구분되어 있다. 다음 줄에는 조옮김해야 하는 값이 주어진다. 이 값이 양수일 경우 그 값만큼 위로 옮겨야 하고, 음수일 경우 아래로 옮겨야 한다.</p> <p> 입력의 마지막 줄에는 "***"이 주어진다.</p> ## 출력 <p> 각 테스트 케이스에 대해서, 조옮김한 결과를 출력한다. 출력하는 음은 문제 설명에 나와있는 12개 음에 나와있는 음이어야 한다.</p> ## 풀이 맵에 모든 경우를 다 숫자로 매핑해서 분기 처리 해주었습니다. ``` c++ #include<bits/stdc++.h> using namespace std; unordered_map<string, int> sound = { {"A", 0}, {"A#", 1}, {"Bb", 1}, {"B", 2}, {"B#", 3}, {"Cb", 2}, {"C", 3}, {"C#", 4}, {"Db", 4}, {"D", 5}, {"D#", 6}, {"Eb", 6}, {"E", 7}, {"E#", 8}, {"Fb", 7}, {"F", 8}, {"F#", 9}, {"Gb", 9}, {"G", 10}, {"G#", 11}, {"Ab", 11}, }; string res[12] = {"A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#"}; int main() { ios::sync_with_stdio(0); cin.tie(0); while(true) { string s; getline(cin, s); if(s=="***") break; int n; cin >> n; cin.ignore(); s += " "; int idx=0; while(idx<s.length()) { int nextIdx = s.find(' ', idx); cout << res[(sound[s.substr(idx, nextIdx-idx)]+12000000+n)%12] << ' '; idx = nextIdx+1; } cout << '\n'; } } ```