Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

피너클의 it공부방

백준 2034 반음 (c++) : 피너클 본문

백준

백준 2034 반음 (c++) : 피너클

피너클 2022. 7. 18. 17:37
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
반응형
Comments