백준 2920번 (음계, C++) [BAEKJOON]

목차 테이블

음계

https://www.acmicpc.net/problem/2920

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초128 MB80097436333762155.702%

문제

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

  • 문제를 번역한 사람: baekjoon
  • 데이터를 추가한 사람: jh05013
  • 문제의 오타를 찾은 사람: thinksong1

알고리즘 분류


ascending, descending 를 어떤 방법으로 구별하는 지가 이 문제의 포인트 같다.

나는 숫자들을 배열에 넣어서 ( arr[i] ) 배열의 인덱스와 수의 관계로 구별했다.

만약 오름차순이라면

arr[0] = 1, arr[1] = 2, arr[2] = 3 … arr[7] = 8 값과 인덱스의 차이가 1이다.

만약 내림차순이라면

arr[0] = 8, arr[1] = 7, arr[2] = 6 … arr[7] = 1 값과 인덱스의 합이 8이다.

ascending가 아니면 descending를 확인

descending가 아니면 Mixed의 인덱스로 보내어 답을 구하였다.

통과된 코드

#include <iostream>

using namespace std;

int arr[8];
string str[3] = { "ascending", "descending", "mixed" };

int main()
{
	// 8개의 숫자를 차례대로 입력받는다.
	for (int i = 0; i < 8; i++) {
		cin >> arr[i];
	}

	int cnt = 0;

	for (int i = 0; i < 8; i++) {

		switch (cnt)
		{	
			case 0: // 처음은 오름차순을 체크
				if (arr[i] - i == 1) { continue; } // 오름차순은 arr[i] - i == 1 로 판단 가능
				else if (arr[i] + i == 8) { cnt++; } // 내름차순은 arr[i] + i == 8 로 판단 가능
				else { cnt = 2; }
				break;

			case 1:
				if (arr[i] + i == 8) { continue; } // 내름차순은 arr[i] + i == 8 로 판단 가능
				else { cnt = 2; }
				break;

			default:
				break;
		}

	}

	cout << str[cnt];
}

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤