#8. [백준_C언어] 2920번 : 음계

 

 입력 코드 

#include <stdio.h> 

int main(int argc, char *argv[]) { 
	int number[8]; 
	int i, result, flag = 0; 
	
	for (i = 0; i < 8; ++i) { 
		scanf("%d", &number[i]); 
	} 

	for (i = 0; i < 7; ++i) { 
		result = number[i] - number[i+1]; 
		if ( result == 1){ 
			flag = 1; 
		} 
		else if ( result == -1) { 
			flag = 2; 
		} 
		else { 
			flag = 3; 
			printf("mixed\n"); 
			break; 
		} 
	} 
	
	if (flag == 1) 
		printf("descending\n"); 
	else if (flag == 2) 
		printf("ascending\n"); 
	return 0; 
}

 

 코드 설명 

배열과 반복문, 조건문을 이용하는 문제

#include <stdio.h>
#define Cmajor[] = { c,d,e,f,g,a,b,C };

main() {
	int note[] = { 1,2,3,4,5,6,7,8 };
	int i;

	for (i = 0; i < 8; i++) {
		Cmajor[i] = note[i];
	}

	int j, input[8];
	scanf("%s", &input[j]);

	for (j = 0; j < 8; j++) {
		if (input[j] > input[j + 1])
			printf("descending");
		else if (input[j] > input[j + 1])
			printf("ascending");
		else
			printf("mixed");
	}
}

처음에 아예 다장조 배열을 define 해야 하는 건지 아니면 일일이 다 선언하고 들어가야 하는 건지 모르겠었다. 물론 저렇게 하면 밑에서 오류가 난다.

 

저렇게 하는 게 아니라 문자열 배열로 넣어야하는 건가 싶어서 수정했다.

#include <stdio.h>

main() {
	char Cmajor[8] = "cdefgabC";
	char note[8] = "12345678";
	int i;

	for (i = 0; i < 8; i++) {
		Cmajor[i] = note[i];
	}

	int j;
	char s[8];

	scanf("%s", &s);

	for (j = 0; j < 8; j++) {
		if (s[j] > s[j + 1])
			printf("descending");
		else if (s[j] > s[j + 1])
			printf("ascending");
		else
			printf("mixed");
	}
}

반복문 안에 print를 넣으니까 다음 문자로 넘어갈 때마다 descending, mixed 판별해서 프린트하는 문제가 생겼다. 그리고 중간에 판별을 잘못하는 것 같았다.

 

생각해보니까 어차피 1~8까지 숫자가 한번씩만 등장한다고 했으니까 descending이면 87654321, ascending이면 12345678로 정해진다. 그래서 그냥 이걸로 비교해야겠다 하고 코드를 수정했다.

#include <stdio.h>

main() {
	char Cmajor[8] = "cdefgabC";
	char note[8] = "12345678";
	int i;

	for (i = 0; i < 8; i++) {
		Cmajor[i] = note[i];
	}

	int j;
	char s[8];

	scanf("%s", &s);

	if (s[8] == "87654321")
		printf("descending");
	else if (s[8] == "12345678")
		printf("ascending");
	else
		printf("mixed");
}

그런데 그렇게 하면 애초에 다장조 음계를 숫자로 바꿀 필요도 없는 것 같아서 다 삭제했다. 이렇게 했더니 문자 중간에 띄어쓰기 반영을 못하고 다 mixed로 판별해서 또 실패했다.

#include <stdio.h>

main() {
	char s[8];

	scanf("%s", &s);

	if (s[8] == "8 7 6 5 4 3 2 1")
		printf("descending");
	else if (s[8] == "1 2 3 4 5 6 7 8")
		printf("ascending");
	else
		printf("mixed");
}

그런데 또 아니었다. 띄여쓰기를 해서 문자열 길이가 8이 아니라 16이어서 그런 건가 싶었는데 인덱스로 비교하는 게 문제였다.

 

결국 시간 초과로 찾아봤는데 다양한 방법이 있었다. 

#include <stdio.h> 

int main(int argc, char *argv[]) { 
	int number[8]; 
	int i, result, flag = 0; 
	
	for (i = 0; i < 8; ++i) { 
		scanf("%d", &number[i]); 
	} 

	for (i = 0; i < 7; ++i) { 
		result = number[i] - number[i+1]; 
		if ( result == 1){ 
			flag = 1; 
		} 
		else if ( result == -1) { 
			flag = 2; 
		} 
		else { 
			flag = 3; 
			printf("mixed\n"); 
			break; 
		} 
	} 
	
	if (flag == 1) 
		printf("descending\n"); 
	else if (flag == 2) 
		printf("ascending\n"); 
	return 0; 
}

이건 내가 처음에 하고 싶었던 방법이다. 앞의 수와 비교해서 그 차가 1이면 감소, -1이면 증가

변수를 하나 더 사용해서 반복문을 하나 더 사용하면 되는데 배열의 인접한 두수를 계속해서 비교하는 방법을 생각을 못했다.

 

↓ 참고한 사이트

editor752.tistory.com/93

 

백준(BAEKJOON): 음계(2920번)

문제 다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascendi

editor752.tistory.com

 

 문제 출처 

www.acmicpc.net/problem/2920

 

2920번: 음계

다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8

www.acmicpc.net