티스토리 뷰

문제

다장조는 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 중 하나를 출력한다.

예제 입력 1

1 2 3 4 5 6 7 8

예제 출력 1

ascending

예제 입력 2 복사

8 7 6 5 4 3 2 1

예제 출력 2 복사

descending

예제 입력 3 복사

8 1 7 2 6 3 5 4

예제 출력 3 복사

mixed

출처: Contest > Croatian Open Competition in Informatics > COCI 2009/2010 > Contest #1 1번

해설

8개의 숫자를 1차원 배열로 입력받는다. 오름차순은 인접한 두 수의 차가 모두 1이며 내림차순은 인접한 두 수의 차가 모두 -1이라는 점엔 착안하여 인접한 두 수의 뺄셈 값을 통해 오름차순, 내림차순, 혼합순을 flag에 표시한다. 이때 주의해야 할 부분은 인접한 두 수의 차가 1, 또는 -1이 아닌 경우가 한 번이라도 나오면 바로 혼합순으로 결정하고 루프를 중단해야 한다는 점이다. 그렇지 않고 모두 비교하는 경우 6 7 8 1 2 3 4 5와 같이 입력될 경우 flag가 2가 되어 오름차순으로 출력이 되고 만다. 따라서 차의 값이 1 또는 -1이 아닌 경우에는 반드시 break;을 사용하여 루프를 중단해야 정확한 결과가 나온다.

소스 코드 C

#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;
}

소스 코드 Python3

num = list(map(int, input().split()))
if num == sorted(num):
    print("ascending")
elif num == sorted(num, reverse=True):
    print("descending")
else:
    print("mixed")

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함
05-19 00:14