๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/10972
โธ ๋ฌธ์
1๋ถํฐ N๊น์ง์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ด ์๋ค. ์ด๋, ์ฌ์ ์์ผ๋ก ๋ค์์ ์ค๋ ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ์์๋ ์์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ด๋ฃจ์ด์ง ์์ด์ด๊ณ , ๊ฐ์ฅ ๋ง์ง๋ง์ ์ค๋ ์์ด์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ด๋ฃจ์ด์ง ์์ด์ด๋ค.
N = 3์ธ ๊ฒฝ์ฐ์ ์ฌ์ ์์ผ๋ก ์์ด์ ๋์ดํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- 1, 2, 3
- 1, 3, 2
- 2, 1, 3
- 2, 3, 1
- 3, 1, 2
- 3, 2, 1
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 ≤ N ≤ 10,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์ ์์ด์ด ์ฃผ์ด์ง๋ค.
โธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์์ด์ ๋ค์์ ์ค๋ ์์ด์ ์ถ๋ ฅํ๋ค. ๋ง์ฝ, ์ฌ์ ์์ผ๋ก ๋ง์ง๋ง์ ์ค๋ ์์ด์ธ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ์ค๋ฒ 3
- ๐ ๋ฌธ์ ์ ํ : ์ํ, ์กฐํฉ๋ก
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
๐๋ค์ ์์ด(Next Permutation)
๋ค์ ์์ด์ด๋, ํ์ฌ ์์ด๋ณด๋ค ์ฌ์ ์์ผ๋ก ๋ฐ๋ก ๋ค์์ ์ค๋ ์์ด์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, ๋ค์ ์์ด์ ๊ตฌํ๊ณ ์ถ์ ์์ด์ด ๋ค์๊ณผ ๊ฐ๋ค๊ณ ํด๋ณด์.
์์ด : 7 2 3 6 5 4 1
์ด ์์ด์ ๋ํด ๋ค์ ์์ด์ ๊ตฌํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ 4๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ค.
1๏ธโฃ A[i-1] < A[i]๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ฅ ํฐ i ์ฐพ๊ธฐ
๋ค์์๋ถํฐ ์์ด์ ํ์ํ๋ฉฐ ์ฒ์์ผ๋ก ๊ฐ์๊ฐ ๋ฉ์ถ๋ ์ง์ (i-1)์ ์ฐพ๋๋ค.
์ฆ, A[i-1] < A[i]๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ฅ ํฐ i๋ฅผ ์ฐพ๋๋ค.
์ด๋ ๋ค์ชฝ์์๋ถํฐ ์์๋๋ ๋ด๋ฆผ์ฐจ์ ๊ตฌ๊ฐ์ด ๋๋๋ ์ง์ ์ ์๋ฏธํ๋ค.
7 2 3 6 5 4 1
โฒ
i-1 = 2 (A[i-1] = 3), i = 3 (A[i] = 6)
2๏ธโฃ j ≥ i์ด๋ฉด์ A[j] > A[i-1]์ ๋ง์กฑํ๋ ๊ฐ์ฅ ํฐ j ์ฐพ๊ธฐ
i๋ถํฐ ์์ด์ ๋๊น์ง ํ์ํ๋ฉฐ, A[j] > A[i-1]์ ๋ง์กฑํ๋ ๊ฐ์ฅ ํฐ j๋ฅผ ์ฐพ๋๋ค.
์ด๋ i ≤ j ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ A[j] > A[i-1]์ธ ๊ฐ์ฅ ํฐ j๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค.
7 2 3 6 5 4 1
โฒ
j = 5 (A[j] = 4), A[i-1] = 3
3๏ธโฃ A[i-1]๊ณผ A[j]๋ฅผ swap
์ฐพ์ ๋ ๊ฐ์ ์๋ก ๊ตํํ๋ค.
Before swap: 7 2 3 6 5 4 1
After swap : 7 2 4 6 5 3 1
4๏ธโฃ A[i]๋ถํฐ ๋๊น์ง ์ค๋ฆ์ฐจ์ ์ ๋ ฌ (๋ค์ง๊ธฐ)
A[i]๋ถํฐ ๋๊น์ง์ ๊ตฌ๊ฐ์ ์๋ ๋ด๋ฆผ์ฐจ์์ด์๊ธฐ ๋๋ฌธ์,
ํด๋น ๊ตฌ๊ฐ์ ๋ค์ง์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ฉด ๊ฐ์ฅ ์์ ์์ด์ด ๋๋ค.
Before reverse: 7 2 4 6 5 3 1
After reverse : 7 2 4 1 3 5 6
์ด๋ ๊ฒ 4๋จ๊ณ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด, ์ ๋ ฅ๋ ์์ด์ ๋ค์ ์์ด์ ์ป์ ์ ์๋ค.
๋ง์ฝ ์ ๋ ฅ๋ ์์ด์ด ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ๋ง์ง๋ง ์์ด์ด๋ผ๋ฉด, ๋ ์ด์ ๋ค์ ์์ด์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ -1์ ์ถ๋ ฅํ๋ค.
์ ํ์ด์ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 13432KB
์๊ฐ : 96ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 1๋ถํฐ N๊น์ง์ ์
StringTokenizer st = new StringTokenizer(br.readLine());
arr = new int[n]; // ์์ด
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
StringBuilder sb = new StringBuilder();
if (nextPermutation()) {
for (int a : arr) {
sb.append(a).append(" ");
}
} else { // ์ฌ์ ์์ผ๋ก ๋ง์ง๋ง์ ์ค๋ ์์ด
sb.append(-1);
}
System.out.println(sb.toString());
br.close();
}
private static boolean nextPermutation() {
int i = arr.length-1;
// A[i-1] < A[i]๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ฅ ํฐ i๋ฅผ ์ฐพ๊ธฐ
while (i > 0 && arr[i-1] >= arr[i]) {
i -= 1;
}
// i์ ์์น๊ฐ 0์ด๋ฉด ๋ด๋ฆผ์ฐจ์ (๋ง์ง๋ง ์์ด)
if (i <= 0) return false;
// j >= i์ด๋ฉด์ A[j] > A[i-1] ์ ๋ง์กฑํ๋ ๊ฐ์ฅ ํฐ j๋ฅผ ์ฐพ๊ธฐ
int j = arr.length-1;
while (arr[i-1] >= arr[j]) {
j -= 1;
}
// A[i-1]๊ณผ A[j]๋ฅผ swap
int tmp = arr[j];
arr[j] = arr[i-1];
arr[i-1] = tmp;
j = arr.length-1;
// A[i]๋ถํฐ ์์ด ๋ค์ง๊ธฐ
while (i < j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i += 1;
j -= 1;
}
return true;
}
}
์ฒ์์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๊ณ ์ ๋ ฅ๊ฐ๊ณผ ๋์ผํ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ค๋ฉด ์ถ๋ ฅํ๋ฉด ๋๊ฒ ๋ค ์๊ฐํ๋๋ฐ,
์ด๋ฐ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ฉด ์๊ฐ ์ด๊ณผ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๊ทธ๋ฌ๋ค ๋ค์ ์์ด์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ณ , ์ด๋ฅผ ํ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ฒธ ํฌ์คํ ํ๊ฒ ๋์๋ค. ์ค๋๋ ์ด๋ ๊ฒ ์๋ก์ด ๊ฒ์ ํ๋ ์๊ฒ ๋์๋ค ! @,@
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_1208] ๋ถ๋ถ์์ด์ ํฉ 2 (3) | 2025.08.10 |
---|---|
[Boj_1450] ๋ ์๋ฌธ์ (3) | 2025.08.07 |
[Boj_1561] ๋์ด ๊ณต์ (4) | 2025.08.05 |
[Boj_1194] ์์ด์คํฌ๋ฆผ ๋๋ ์งํธ (3) | 2025.08.05 |
[Boj_1194] ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์. (0) | 2025.07.25 |