백준/C++

[백준] 2920번: 음계 | C++ 풀이

성실한 당근농부 2023. 6. 23. 23:56

# 문제

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

 


 

# 풀이1

코드가 간단한 문제에 비해 길고 복잡한 것 같다.

아이디어가 떠오르면 무조건 그 방식을 고집해 푸는 것 좀 고치고 싶은데... 다방면으로 사고를 열도록 노력해야겠다.

구글링해서 찾아본 다른 방법까지 총 두 개의 방법을 포스팅한다.

우선 첫번째로 풀었던 정답 소스코드부터!

 

#include <iostream>
using namespace std;

int main(){
    int num;
    cin >> num;

    if(num == 1){
        for(int i=2; i<9; i++){
            cin >> num;
            if(i != num){
                cout << "mixed";
                break;
            }
            if(num == 8) cout << "ascending";
        }
    } else if(num == 8){
        for(int i=7; i>0; i--){
            cin >> num;
            if(i != num){
                cout << "mixed";
                break;
            }
            if(num == 1) cout << "descending";
        }
    } else cout << "mixed";
    return 0;
}

우선 입력되는 경우는 1로 시작하거나 (ascending) 8로 시작하거나 (descending), mixed인 경우 세 가지로 나누었다.

그리고 1로 시작되는 경우는 for문을 돌며 정말 ascending인지 확인하고, 아니라면 mixed 처리해주었다.

8로 시작되는 경우에도 마찬가지로 for문을 돌며 정말 descending인지 확인하고, 아니라면 mixed 처리해주었다.

 

 

 

 

 


 

 

# 풀이2

풀이 1의 경우는 mixed로 빠지는 다양한 경우를 고려해주어야 하는 점이 아쉬웠다.cout << "mixed" 만 세 번...좀 더 좋은 코드를 구글링해보았는데 나 빼고 다 같은 방법으로 풀더라...^^ 울지마배우면되는거지...

 

#include <iostream>
using namespace std;

int main(){
    int num;
    int asc = 0;
    int desc = 0;

    for(int i=0; i<8; i++){
        cin >> num;
        if(num == i+1) asc++;
        else if(num == 8-i) desc++;
    }
    if(asc == 8) cout << "ascending";
    else if(desc == 8) cout << "descending";
    else cout << "mixed";

    return 0;
}

우선 다들 입력이 어차피 딱 8개만 들어오므로 크기 8의 배열을 선언해 판단해주더라.

하지만 굳이 배열을 쓸 필요가 있나 싶어 해당 풀이에서는 배열 말고 정수 변수를 사용해주었다. 배열을 쓰는 게 더 좋은 이유를 알고 계시다면 댓글로 알려주세요... 오름차순과 내림차순을 판별해줄 변수도 만들어준 후에 for문을 돌며 판별을 시작해준다.

받아온 음을 확인하며 조건문에 해당하는 경우에는 오름차순, 내림차순 판별 변수를 증가!

 

for문을 빠져나온 후 오름차순 변수가 8이라면 1-8까지 오름차순으로 입력되었다는 의미이므로 "ascending" 출력

내림차순 변수가 8이라면 8-1까지 내림차순으로 입력되었다는 의미이므로 "descending" 출력

두 조건문 모두 해당하지 않는다면 mixed인 경우이므로 "mixed"를 출력해주면 끝이다!

코드가 훨씬 간결하고, 판별을 마지막에 한 번에 해주는 게 훨씬 효율적인 것 같아 보인다.

하지만 입력 크기가 작은 코드라 두 방법 모두 메모리나 수행 시간에서 차이는 없었다.

 

 

 

 

 


 

 

 

2920번: 음계

다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8

www.acmicpc.net

 

728x90