음계
https://www.acmicpc.net/problem/2920
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 128 MB | 80097 | 43633 | 37621 | 55.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]; }