입력 코드
#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이면 증가
변수를 하나 더 사용해서 반복문을 하나 더 사용하면 되는데 배열의 인접한 두수를 계속해서 비교하는 방법을 생각을 못했다.
↓↓↓ 참고한 사이트
문제 출처
'C' 카테고리의 다른 글
#10. [백준_C언어] 10818번 : 최소, 최대 (0) | 2021.01.05 |
---|---|
#9. [백준_C언어] 8958번 : OX퀴즈 (0) | 2021.01.04 |
#7. [백준_C언어] 2739번 : 구구단 (0) | 2021.01.04 |
#6. [백준_C언어] 2675번 : 문자열 반복 (0) | 2021.01.03 |
#5. [백준_C언어] 2562번 : 최댓값 (0) | 2021.01.03 |