알고리즘/BAEKJOON

[구현] 백준 2920 음계 JAVA

윤개발새발 2022. 8. 16. 16:15

[문제출처 | https://www.acmicpc.net/problem/2920 ]

구현


역시 첫 주의 시작은 무난하게 시작하는 게 좋을 것 같아서 고른 브론즈 구현문제.
첫 문장을 읽기 시작했을 때, "오. 문자열로 들어오나?" 했는데 예제를 보니 그냥 숫자로 들어온다!
이건 뭐 soooooo eassssssy 한데~ 하고 짜고 보니, 뭔가..이것보다 더 간단하고 효율적으로 짤 수 있을 것 같은데 싶다..

 


방법1. 그냥 Arrays 클래스의 equals 메소드를 이용해 배열의 내용을 비교하여 출력

import java.io.*;
import java.util.*;

// 통과 124ms
public class Main {

	static int[] asc = { 1, 2, 3, 4, 5, 6, 7, 8 };
	static int[] desc = { 8, 7, 6, 5, 4, 3, 2, 1 };

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		int input[] = new int[8];
		for (int i = 0; i < 8; i++) {
			input[i] = Integer.parseInt(st.nextToken());
		}
		
		if(Arrays.equals(input, asc)) {
			System.out.println("ascending");
		} else if(Arrays.equals(input, desc)) {
			System.out.println("descending");
		} else {
			System.out.println("mixed");
		}

	}

}

 

 

클래스 사용 없이 구현해볼까? 싶어서 한,
방법2. 입력을 받으면서 비교 후 출력

import java.io.*;
import java.util.*;

// 통과 124ms
public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		int input[] = new int[8];
		final String DESC = "descending";
		final String ASC = "ascending";
		String ans = "mixed";
		for (int i = 0; i < 8; i++) {
			input[i] = Integer.parseInt(st.nextToken());
			if (i > 0) {
				if (input[i] == input[i - 1] + 1) { // asc 
					if(DESC.equals(ans)) {
						ans = "mixed";
						break;
					} else {
						ans = ASC;
					}
				} else if (input[i] == input[i - 1] - 1) { // desc
					if(ASC.equals(ans)) {
						ans = "mixed";
						break;
					} else {
						ans = DESC;
					}
				} else {
					ans = "mixed";
					break;
				}
			}
		}
		System.out.println(ans);
	}

}

메모리는 아주아주 조금 줄었지만, 수행 속도는 같고 중복코드가 남발하고 가독성도 별로 좋아보이지 않는다..

뭔가 flag를 사용해보기도 하고 [i+1] 과 [i] 의 차이를 어떻게 해봤지만,
자꾸 중복코드가 나와 다른 분들의 채점결과를 보는데...

72ms의 코드는
1. 1차원 int형 배열로 입력을 받는다.
2. 맨 앞 두 수([0], [1])의 차를 구한다.
3. 그 값이 1 또는 -1 일 때 flag = true를 가진다.
4. flag 의 값이 true 일 때,
  4.1. [1] ~ [7] 까지 반복문을 돌며
  4.2. 2와 같이 차를 구한 뒤,
  4.3. 그 차가 3과 같은지 비교하여 달라지면 flag를 바꾸고 반복문을 빠져나간다.
5. 그래서 이 flag가 false 라면 "mixed"
  5-1. 그렇지 않을 때는 차가 1, -1인지에 따라 "ascending", "descending" 을 출력한다.

주석하나 없었지만, 코드는 굉장히 간결하고 위에서 쭉 읽어가며 어떤 로직인지 파악하기 쉬웠다.
다른 사람의 코드를 읽어보며 배우는 것도 꽤나 재밌다.
나도 그렇게 짤 수 있도록 발전해야지 (๑•̀ㅂ•́)و✧