728x90
반응형

문제

다장조는 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

 

내가 작성한 코드 (C++성공)

1 )

#include <iostream>

using namespace std;

int main(){

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

2 )

#include <iostream>

using namespace std;

int main(){

	int n[8] = {0};
	int asc = 0;
	int desc = 8;

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

 

정리

이 문제를 간단하게 정리해보면 8개의 음계가 있고 1부터 8까지 나타낼 수 있다.


[ 1 2 3 4 5 6 7 8 ] : 1부터 순서대로 8까지 증가하면 ascending
[ 8 7 6 5 4 3 2 1 ] : 8부터 순서대로 1까지 감소하면 descending
[ 1 5 7 6 4 8 3 2 ] : 순서가 섞였다면 mixed

그래서 이 문제를 두 가지 방법으로 풀어보았다.
두 개의 코드에서 서로 다른 점은 반복문이다.

// 1번 코드
	for(int i=0; i<8; i++){
		cin >> n[i];
		if(n[i] == i+1) {
			asc++;
		} else if(n[i] == 8-i) {
			desc--;
		}
	}
    
    
// 2번 코드
	for(int i=0; i<8; i++){
		cin >> n[i];
		if(n[0] == 1){
			if(n[i] > n[i-1]) asc++;
		} else if(n[0] == 8){
			if(n[i] < n[i-1]) desc--;
		}
	}

1번 코드 반복문에서는 반복문을 시행하는 반복 값인 i 와 배열의 값의 비교를 통해서 숫자의 증감을 저장했고
2번 코드 반복문에서는 배열의 전과 후의 값을 비교해서 숫자의 증감을 저장해주었다.
나는 솔직하게 1번 코드에서 작성한 반복문이 개인적으로 마음에 든다.

마지막으로 결과값에서는 위의 반복문을 통해
숫자가 1부터 시작해서 순서대로 증가해 8이 된다면 asc 의 값은 8이 되고 ascending 을 출력해준다.
숫자가 8부터 시작해서 순서대로 감소해 1이 된다면 desc 의 값은 1이 되고 descending 을 출력해준다.
그 외에 1로 시작하지 않거나 8로 시작하지 않는 경우 그리고 1이나 8로 시작하고 순서대로 증가하지 않는 경우에는
asc 의 값이 8이 아니거나 desc 의 값이 1이 아니기 때문에 mixed 를 출력해준다.

	if(asc == 8) cout << "ascending\n";
	else if(desc == 1) cout << "descending\n";
	else cout << "mixed\n";
728x90
반응형
복사했습니다!