PS/백준

[백준/Baekjoon]<2920번> 음계 [C/C++/Python][Class 1]

DigIT_JHB 2022. 9. 12. 19:01

백준 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 중 하나를 출력한다.


예제 입력 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
 

#문제 풀이 방법

1.

8개 숫자가 입력되고

이 숫자들이

선형적으로 상승곡선을 그리는지,

하강곡선을 그리는지,

비선형적인지 파악하여 출력.

(음계 얘기는 사실 하나도 필요없어 보인다.눈속임...?)

 

2-1. 숫자들이 관계를 파악하기 위해

각각의 숫자가

+1씩 차이나는지,

-1씩 차이나는지,

다르게 차이나는지 확인한다.

 

2-2.

1~8까지 8자리 밖에 안 되므로 일일이 비교하는 것도 가능할 것이다.

 

반응형

 

#C/C++

처음에 문제 풀었을 때는 아무생각없이 구현만 하자는 느낌으로 아무생각없이 풀었다.

그랬더니 아래와 같이 좀 지저분한 코드가 나온 것 같다.(답은 맞았지만......)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[8];
    for(int i=0;i<8;i++)
    {
        scanf("%d",&a[i]);
    }
    if(a[0]==8)
    {
           for(int i=0;i<8;i++)
    {
        if(a[i]!=8-i)
        {
            printf("mixed");
            return 0;
        }
        
    }
        printf("descending");
        return 0;
    }
    else if(a[0]==1)
    {
           for(int i=0;i<8;i++)
           {
               if(a[i]!=i+1)
        {
            printf("mixed");
            return 0;
        }
           }
        printf("ascending");
        return 0;

    
    }
    else
    {
        printf("mixed");
        return 0;
    }
    return 0;
}

그래서 위의 문제풀이방법을 통해 정리해서 다시 쳐보았다.

#include <iostream>
using namespace std;

int main()
{
    int a,b,c;//비교할 숫자 a, 입력받는 숫자b, 차이값 c
    bool t=true;
    cin>>a>>b;//처음 두 숫자 입력
    c=a-b;//처음 두 숫자의 차이
    a=b;//두번째 숫자를 a로 저장
    while(cin>>b)//그다음 숫자들을 입력받음.
    {
        if(a-b!=c)
        {
            t=false;
            cout<<"mixed";
            break;
        }
        a=b;//입력받은 숫자 a로 옮김.
    }
    if(t&&c==1) cout<<"descending";
    if(t&&c==-1) cout<<"ascending";
    return 0;
    
}
#include <iostream>
using namespace std;

int main()
{
    string s;
    getline(cin,s);//한 줄 다 입력받기
    if(!s.compare("1 2 3 4 5 6 7 8")) cout<<"ascending";
    else if(!s.compare("8 7 6 5 4 3 2 1")) cout<<"descending";
    else cout<<"mixed";
    return 0;
    
}

 

#Python

ls=list(map(int,input().split()))
t=True
a=ls[1]-ls[0]
for i in range(len(ls)-1):
    if ls[i+1]-ls[i]!=a:
        print("mixed")
        t=False
        break
if t and a==1:
    print("ascending")
if t and a==-1:
    print("descending")
s=input()
if s=="1 2 3 4 5 6 7 8":
    print("ascending")
elif s=="8 7 6 5 4 3 2 1":
    print("descending")
else:
    print("mixed")

 

반응형