피너클의 it공부방
백준 2034 반음 (c++) : 피너클 본문
728x90
반응형
https://www.acmicpc.net/problem/2034
2034번: 반음
첫째 줄에 악보의 길이를 나타내는 정수 n(1 ≤ n ≤ 10,000)이 주어진다. 다음 n개의 줄에는 절댓값이 20을 넘지 않는 정수로 악보가 주어진다.
www.acmicpc.net
간단한 구현문제다.
int n;
int arr[10001];
char piano[12] = { 'C', 'X', 'D', 'X', 'E', 'F', 'X', 'G', 'X', 'A', 'X', 'B' };
n과 arr에 값들을 입력받는다.
piano는 피아노 칠음계를 나타낸다. 하얀 건반은 각각의 영어 알파벳으로, 검은 건반은 X로 표시한다.
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
arr[i] %= 12;
}
값을 입력받을때 arr의 모든 숫자를 12로 나눈 나머지로 바꾼다.
현재 위치가 D이고 (idx = 2) 악보에 19이 쓰여있을때 19을 더하거나 7을 더하거나 결국 A에 간다.
그러니 계산할때 간단하게 하기 위해 미리 12로 나눠준다.
for (char c = 'A'; c <= 'G'; c++) {
int idx;
char last;
for (int i = 0; i < 12; i++) {
if (piano[i] == c) {
idx = i;
break;
}
}
A부터 G까지 반복한다.
idx는 현재 c가 piano에서 어느 위치에 있는지, last는 마지막에 친 건반이 어느 건반인지를 나타낸다.
내부 반복문을 통해 c가 piano에서 어느 위치에 있는지 idx에 집어넣는다.
bool chk = true;
for (int i = 0; i < n; i++) {
idx += arr[i];
idx %= 12;
if (idx < 0) idx += 12;
chk는 n만큼 반복하며 악보에 검은 건반이 있을 경우 바로 false로 바뀐다.
idx에 arr[i]를 더하고 12로 나눈 나머지를 구한다. 만약 0보다 작다면 12를 더해 범위안에 넣어준다.
if (piano[idx] == 'X') {
chk = false;
break;
}
last = piano[idx];
}
만약 현재 idx가 피아노에서 X를 가르킨다면 검은 건반을 친다는 뜻이니 chk를 false로 바꾸고 반복문을 나온다.
아니라면 last에 마지막으로 친 건반인 piano[idx]를 넣어준다.
if (chk) cout << c << ' ' << last << endl;
}
마지막으로 만약 chk가 true라면 c와 last를 출력해준다.
#include <iostream>
using namespace std;
int n;
int arr[10001];
char piano[12] = { 'C', 'X', 'D', 'X', 'E', 'F', 'X', 'G', 'X', 'A', 'X', 'B' };
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
arr[i] %= 12;
}
for (char c = 'A'; c <= 'G'; c++) {
int idx;
char last;
for (int i = 0; i < 12; i++) {
if (piano[i] == c) {
idx = i;
break;
}
}
bool chk = true;
for (int i = 0; i < n; i++) {
idx += arr[i];
idx %= 12;
if (idx < 0) idx += 12;
if (piano[idx] == 'X') {
chk = false;
break;
}
last = piano[idx];
}
if (chk) cout << c << ' ' << last << endl;
}
}
전체코드다.
728x90
반응형
'백준' 카테고리의 다른 글
백준 14440 정수 수열 (c++) : 피너클 (0) | 2022.07.19 |
---|---|
백준 2535 아시아 정보올림피아드 (c++) : 피너클 (0) | 2022.07.19 |
백준 1417 국회의원 선거 (c++) : 피너클 (0) | 2022.07.17 |
백준 1817 짐 챙기는 숌 (c++) : 피너클 (0) | 2022.07.16 |
백준 1531 투명 (c++) : 피너클 (0) | 2022.07.14 |
Comments