[C언어] 백준 - 2920 음계
문제
다장조는 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문도 따로 쓰게 됐다.
음... 이전 거가 훨씬 효율적인 것 같다. 배열보다는 체크변수를 처리하는 방법을 생각하는 게 더 좋을 것 같다.