BOJ(백준)

[C언어] 백준 - 2920 음계

ruming 2022. 2. 23. 21:49

문제

다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다.

1부터 8까지 차례대로 연주한다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed 이다.

연주한 순서가 주어졌을 때, 이것이 ascending인지, descending인지, 아니면 mixed인지 판별하는 프로그램을 작성하시오.

입력

첫째 줄에 8개 숫자가 주어진다. 이 숫자는 문제 설명에서 설명한 음이며, 1부터 8까지 숫자가 한 번씩 등장한다.

출력

첫째 줄에 ascending, descending, mixed 중 하나를 출력한다.

 

#include <stdio.h>
int main(void) {
	int n[8] = { 0 }, ck = 0;
	for (int i = 0; i < 8; i++)	scanf("%d", &n[i]);
	for (int i = 0; i < 8; i++) {
		if (i + 1 == n[i])	ck = 1;
		else
		{
			for (int i = 8; i > 0; i--) {
				if (i == n[8-i])	ck = 2;
				else
				{
					printf("mixed");
					return 0;
				}
			}
		}
	}
	if (ck == 1)	printf("ascending");
	else
	{
		printf("descending");
	}
	return 0;
}

최대한 효율적으로 풀어보려 했지만... 보기엔 좀 복잡하게 보이는 것 같다.

고려해야 할 건 두가지, ascending과 descending이 아닌 모든 경우의 수는 mixed다.

1부터 8까지 혹은 8부터 1까지 차례대로 숫자를 확인하는 과정만 줄이면 더 좋을 것 같다.

for문으로 i와 n[i]를 비교해 asceding을 찾고, 아니면 바로 else로 넘어가서 다시 for문을 돌려 descending을 찾는다.

두 가지 다 아니면 else로 넘어가 mixed를 출력시키고 종료한다.

 

설명을 쓰는 와중에 다른 방법이 생각나서 다시 풀어보았다.

#include <stdio.h>
int main(void) {
	int n[8] = { 0 }, ck = 0;
	int as[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	int ds[8] = { 8, 7, 6, 5, 4, 3, 2, 1 };

	for (int i = 0; i < 8; i++)	scanf("%d", &n[i]);

	for (int i = 0; i < 8; i++) {
		if (as[i] != n[i]) {
			ck = 0;
			break;
		}
		else ck = 1;
	}
	if (ck == 1) {
		printf("ascending");
		return 0;
	}
	for (int i = 0; i < 8; i++) {
		if (ds[i] != n[i]) {
			ck = 0;
			break;
		}
		else ck = 2;
	}
	if (ck == 2) {
		printf("descending");
		return 0;
	}
	printf("mixed");
	return 0;
}

배열과 비교하는 방법만 추가하려 했는데 for문도 따로 쓰게 됐다.

음... 이전 거가 훨씬 효율적인 것 같다. 배열보다는 체크변수를 처리하는 방법을 생각하는 게 더 좋을 것 같다.