🌞Algorithm/πŸ”₯Baekjoon

[Baekjoon] 10972_λ‹€μŒ μˆœμ—΄

λΏŒμ•Ό._. 2024. 4. 17. 12:16

Silver III

문제(좜처: https://www.acmicpc.net/problem/10972)

< λ‹€μŒ μˆœμ—΄ >

 

문제 풀이 

 

λ§Œμ•½ 1 2 3 5 4κ°€ μ£Όμ–΄μ‘Œλ‹€κ³  생각해 보자.

λ’€μ—μ„œλΆ€ν„° 값을 νƒμƒ‰ν•˜λ©΄μ„œ ν˜„μž¬ κ°’μ—μ„œ 뒀에 값을 νƒμƒ‰ν•œλ‹€. 

4λŠ” λ§ˆμ§€λ§‰ κ°’μ΄λ―€λ‘œ λ„˜μ–΄κ°„λ‹€.

5λ₯Ό ν™•μΈν–ˆμ„ λ•Œ 뒀에 4밖에 μ—†μœΌλ―€λ‘œ 5보닀 μž‘μ€ 수 μ΄λ―€λ‘œ λ„˜μ–΄κ°„λ‹€.

3을 ν™•μΈν–ˆμ„ λ•Œ 5,4와 같이 3보닀 큰 값이 μžˆμœΌλ―€λ‘œ λ‹€μŒ μˆœμ—΄μ„ 좜λ ₯ν•˜κΈ° μœ„ν•΄ 4둜 κ΅μ²΄ν•œλ‹€. κ·Έ 후에 남은 값을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ ν›„ 좜λ ₯ν•œλ‹€.

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class _10972_ { // λ‹€μŒ μˆœμ—΄

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		int n = Integer.parseInt(bf.readLine());

		int arr[] = new int[n];
		st = new StringTokenizer(bf.readLine());
		for (int i = 0; i < n; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		ArrayList<Integer> list = new ArrayList<>();
		int num = -1;
		int idx = -1;

		for (int i = n - 1; i >= 0; i--) {
			list.add(arr[i]);

			Collections.sort(list, Collections.reverseOrder());

			if (list.get(0) != arr[i]) {
				for (int j = list.size() - 1; j >= 0; j--) {
					if (list.get(j) > arr[i]) {
						num = list.get(j);
						break;
					}
				}
				idx = i;
				break;
			}
		}

		if (num == -1) {
			System.out.println(-1);
		} else {
			boolean flag = false;
			for (int i = 0; i < idx; i++) {
				bw.write(arr[i] + " ");
			}
			bw.write(num + " ");
			for (int i = list.size() - 1; i >= 0; i--) {
				if (!flag && list.get(i) == num) {
					flag = true;
					continue;
				}
				bw.write(list.get(i) + " ");
			}
			bw.flush();
		}
	}
}
λ³€μˆ˜)
n : μˆœμ—΄ 수
arr : μˆœμ—΄ κ°’
list : ν˜„μž¬ 값보닀 큰 수λ₯Ό μ°ΎκΈ° μœ„ν•œ 리슀트
num, idx : ν˜„μž¬ 값보닀 큰 κ°’, ꡐ체할 인덱슀

 

μˆœμ—΄ 개수 n을 μž…λ ₯λ°›λŠ”λ‹€. 배열에 μˆœμ—΄ 값을 μ €μž₯ν•œλ‹€. λ’€μ—μ„œλΆ€ν„° 값을 ν™•μΈν•˜λ©΄μ„œ  λ‹€μŒ 과정을 μˆ˜ν–‰ν•œλ‹€.

 

1) list에 값을 μΆ”κ°€ν•œλ‹€.

2) listλ₯Ό λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ ν›„ 0번째 κ°’κ³Ό ν˜„μž¬ 값이 μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.

3) μΌμΉ˜ν•œλ‹€λ©΄ ν˜„μž¬ 값보닀 큰 값이 μ—†μœΌλ―€λ‘œ κ³„μ†ν•΄μ„œ λ°˜λ³΅ν•œλ‹€. μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν˜„μž¬ 값보닀 큰 값이 μžˆλ‹€λŠ” λœ»μ΄λ―€λ‘œ list에 μžˆλŠ” 값을 νƒμƒ‰ν•˜μ—¬ ν˜„μž¬ 값보닀 큰 κ°’ μ€‘μ—μ„œ κ°€μž₯ μž‘μ€ 값을 μ°Ύμ•„ num에 μ €μž₯ν•œλ‹€. idxλ₯Ό ν˜„μž¬ μœ„μΉ˜λ‘œ μ €μž₯ν•œ ν›„ μ’…λ£Œν•œλ‹€.

 

λ§Œμ•½ num이 -1이라면 λ‹€μŒ μˆœμ—΄μ΄ μ—†λ‹€λŠ” λœ»μ΄λ―€λ‘œ -1을 좜λ ₯ν•œλ‹€. num 값이 μžˆλ‹€λ©΄ arr의 0λ²ˆμ§ΈλΆ€ν„° idxμ „κΉŒμ§€ 값을 좜λ ₯ν•œλ‹€. κ·Έ 후에 num 값을 좜λ ₯ν•œλ‹€. listλ₯Ό λ’€μ—μ„œλΆ€ν„° num 값을 μ œμ™Έν•œ 값을 μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•œλ‹€.