이 포스팅은 자바 8버전으로 풀이가 됐습니다.
문제
다장조는 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
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
// 2920번
public class Main {
public static void main(String[] args)throws IOException {
try {
BufferedReader rd = new BufferedReader(new InputStreamReader (System.in));
String text[] = rd.readLine().split(" ");
int num[] = new int[text.length];
String scale ="";
for(int i=0;i<text.length;i++) {
num[i] = Integer.parseInt(text[i]);
}
for(int i=0;i<num.length-1;i++) {
if(num[i]==num[i+1]-1) {
scale = "ascending";
}else if(num[i]==num[i+1]+1) {
scale = "descending";
}else {
scale = "mixed";
break;
}
}
System.out.println(scale);
}
catch(IOException e) {
System.out.println("error");
}
}
}
|
2) 전체 값 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
// 2920번
public class Main {
public static void main(String[] args)throws IOException {
try {
BufferedReader rd = new BufferedReader(new InputStreamReader (System.in));
String text[] = rd.readLine().split(" ");
int num[] = new int[8];
for(int i=0;i<text.length;i++) {
num[i] = Integer.parseInt(text[i]);
}
int ascending = 0;
int descending = 0;
for(int i=0;i<text.length;i++) {
for(int j=i+1;j<text.length;j++) {
if(num[i]<num[j]) {
ascending++;
}
}
for(int k=i+1;k<text.length;k++) {
if(num[i]>num[k]) {
descending++;
}
}
}
if(descending!=0 && ascending!=0){
System.out.println("mixed");
}else if(ascending>descending) {
System.out.println("ascending");
}else if(descending>ascending) {
System.out.println("descending");
}
}
catch(IOException e) {
System.out.println("error");
}
}
}
|
풀이
로직에 대해서 먼저 언급을 진행한다. 값은 3가지 종류를 갖는다.
순서대로 올라가는 값 = ascending,
역으로 줄어드는 값 = descending,
증가와 감소가 섞여있는 값 = mixed
ascending은 오름차순 = 값이 작은 수부터 큰 수로 순서대로 올라가는 값
descending은 내림차순 = 값이 큰 수부터 작은 수로 순서대로 내려가는 값
mixed는 두 가지를 만족하지 않는 경우이다.
본인은 코드를 두 가지의 방법으로 풀이했다.
(1) +1, -1, 0으로 3가지 값을 갖는 형식으로 예를 들 수 있다. 경우는 다음과 같다.
증가하는 경우 ascending를 감소만 진행하는 경우 descending를 갖고 온다. 또한 둘 다 왔다 갔다 하는 경우 mixed를 갖도록 코딩을 한다.
(2) 2번의 경우 오름차순과 내림차순인 ascending과 descending를 카운팅 형식으로 값을 측정 후 하나라도 값이 변동이 있으면 mixed를 출력하는 형식으로 코딩을 진행했다.
이중 (1) 방법의 코드 설명을 진행한다.
- 10번 라인부터 16번 라인까지에 대한 코드를 설명한다.
1) BufferedReader인 경우 스트링 값을 입력받는다.
2) 입력받은 길이만큼 배열을 할당받는다.
3) 값을 정수형으로 입력받는다.
- 18번 라인부터 27번 라인까지에 대한 코드를 설명한다.
1) 기본은 입력받은 배열의 길이만큼 반복을 한다. 하지만 본인이 찾으려는 경우 +1, -1, 0의 값을 갖는 경우이다.
2) 이 문제는 1부터 8까지 차례대로 연주하는 값이다.
-> 앞의 배열 요소 값과 뒤의 배열 요소 값의 증가, 감소를 비교하기 위해서는 변수[i] == 변수[i+1]-1 와 같이 num 변수의 0번 위치의 값과 1번 요소에서 -1을 한 값이 같은지를 확인하면 된다.
3) 이런 식으로 증가, 감소, 믹스 형식의 값을 추출하여 문자열에 값을 대입하여 출력하면 조금 더 효율적으로 코드를 만족시킬 수 있다.
짧은 포스팅 읽어주셔서 감사드립니다.
오타 때문에 되게 많이 틀렸던 문제네요😂 몇 시간을 ascending오타로 인해서 많이 날렸던 문제입니다 ㅎㅎ..
오타나 문제가 있는 경우 댓글 부탁드리겠습니다.
감사합니다.
'백준 - Java' 카테고리의 다른 글
[백준 - 10828][Java] 스택 (0) | 2022.05.23 |
---|---|
[백준 - 1152][Java] 단어의 개수 (0) | 2022.05.19 |
[백준 - 1712][Java]손익분기점 (0) | 2022.05.16 |
[백준 - 15596][Java] 정수 N개의 합 (0) | 2022.05.15 |
[백준 - 3052][Java] 나머지 (0) | 2022.05.14 |