[Problem Solving - Baekjoon] 2920 음계
[Baekjoon Online Judge] 2920 음계
시작하기 전 백준 문제 푸는 방법
- 클래스 명은 반드시 Main 으로 해야 함 (컴파일 에러뜸..나..)
- import도 다 명시해주어야 함
- 출력은 반드시 문제에 나온 것처럼 그대로 나와야함. 다른것 나오면 에러임 (이쁘게 출력하고픈 마음 알겠으나 쓸데없는 출력은 자제)
- 컴파일에러, 런타임에러, 시간초과 등의 갖가지 사유로 문제를 풀지 못 했을 경우는 코드 검토 후 수정을 강력히 권고 (대부분 내 잘못이지 채점 서버 잘못아님)
문제
다장조는 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
- input
1 2 3 4 5 6 7 8
- output
ascending
예제2
- input
8 7 6 5 4 3 2 1
- output
descending
예제3
- input
8 1 7 2 6 3 5 4
- output
mixed
풀이
문제 파악
- 8개의 숫자가 한 번씩 등장하는 한 줄이 입력
- 입력된 숫자의 순서가 ascending인지 descending인지 mixed인지를 판단
- 판단 결과 출력
연산
- 한 줄 입력 받기
- 8개의 숫자 array로 변경
- i 와 i+1 번째 숫자를 비교해서 ascending인지 descending인지 mixed인지 판단
- 결과 출력
구현
- system.in 표준 입력을 통해 숫자를 입력 받은 수를 정규식으로 구분하기 위해 scanner로 받음
Scanner sc = new Scanner(System.in);
- 입력받은 문자를 array로 변경
String[] arr = sc.nextLine().split(" ");
- for문으로 array내 element i와 i-1번째 크기를 비교해서 판단
for (int i = 1; i < arr.length; i++) { if (Integer.parseInt(arr[i]) > Integer.parseInt(arr[i-1])) { ascending = true; }else if (Integer.parseInt(arr[i]) < Integer.parseInt(arr[i-1])) { descending = true; } }
- 애초에 아래와 같이 입력받은 배열을 int로 한 번 변환했다면, 바로 위와 같이 반복문내 Intger.parseInt를 매번 실행하지 않아도 될 문제
- 그러나 숫자가 8개 밖에 없으니.. 그냥 진행해서 풀었음
int[] input = new int[arr.length]; for (int i = 0; i < arr.length; i++) { input[i] = Integer.parseInt(arr[i]); }
- 결과 판단은 boolean으로 해 줌
boolean ascending = false;
boolean descending = false;
if (ascending && descending) {
System.out.println("mixed");
} else if (ascending){
System.out.println("ascending");
}else if (descending) {
System.out.println("descending");
}