๊ทธ๋์ ์ ๋ ฌ
์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํ๋ฉฐ ์ ๋ง ๋ง์ด ์ฐ๋จนํ์๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ. ๊ทธ๋งํผ ์ค์ํ๋ค๋ ๋ป์ด๊ฒ ์ง๋ง,
์ด์ ๋ ๊ทธ ๋ ๋ง๋ฌด๋ฆฌ๋ฅผ ํ๋ คํ๋ค.
์ ๋ ฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ํด์ง ๊ธฐ์ค์ ๋ฐ๋ผ ๋ฐฐ์นํด ์๋ฏธ ์๋ ๊ตฌ์กฐ๋ก ์ฌ์ค์ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ์ค์ํ ๊ฒ์ธ๊ฐ?
๊ฒฐ๊ตญ์ "ํจ์จ์ฑ"์ด๋ค.
์๊ฐ ๋ณต์ก๋๊ฐ ์์ ์๋ก ๋ ๋น ๋ฅด๊ณ ํจ๊ณผ์ ์ธ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ธฐ ์ฝ๋ค.
์ ๋ ฌ์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฌํ ํจ์จ์ฑ์ ์ฆ์ง์ํค๊ธฐ ์ํด, ์ ๋ง์ ๋๋ํ ์ฌ๋๋ค์ด ๋ง๋ค์ด ๋ธ ๊ฒ์ด๋ค.
์กฐ๊ธ์ ๊ณผ์ฅ์ผ ์ง๋ผ๋ ์ ๋ ฌ์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋๋ก ์ฌ์ฉํ ์ค ์๋ค๋ฉด ์ฝ๋ฉ ์ข ํ๋ ๊ฐ๋ฐ์๊ฐ ๋ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.

์ ๋ ฌ์ ์ข ๋ฅ
๋ฒ๋ธ : ๋ฐ์ดํฐ์ ์ธ์ ์์๋ฅผ ๋น๊ตํ๊ณ , swap ์ฐ์ฐ์ ์ํํ๋ฉฐ ์ ๋ ฌ
์ ํ : ๋์์์ ๊ฐ์ฅ ํฌ๊ฑฐ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๊ฐ ์ ํํ๋ฉฐ ์ ๋ ฌ
์ฝ์ : ๋์์ ์ ํํ์ฌ, ์ ์ ํ ์์น์ ์ฝ์
ํต : pivot ๊ฐ์ ์ ์ ํด ํด๋น ๊ฐ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
๋ณํฉ : ์ด๋ฏธ ์ ๋ ฌ๋ ๋ถ๋ถ ์งํฉ๋ค์ ํจ์จ์ ์ผ๋ก ๋ณํฉ
๊ธฐ์ : ๋ฐ์ดํฐ์ ์๋ฆฟ์๋ฅผ ๋น๊ตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌ
ํฌ๊ฒ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ๋ก ์์ ๊ฐ์ด 6๊ฐ๋ก ๋๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ๋น ํจ์จ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ ๋์ ๋ฐ๋ผ ์ฌ์ฉํ ๊ณณ์ด ์๋ "๋ฒ๋ธ", "์ ํ", "์ฝ์ " ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์ฌ์ฉํ๋ค.
๋ฒ๋ธ ์ ๋ ฌ
๋ฒ๋ธ ์ ๋ ฌ์ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ ์ ์๋ ๊ฐ์ฅ ์ฌ์ด ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ธ์ ํ ์์๋ฅผ ๋น๊ตํ๊ณ , swap์ ์งํํ๋ ๊ฒ.
์ฝ๋์ ๊ตฌ์กฐ ๋ํ ๊ฐ๋จํ์ฌ ๋ช ๋ฒ ๋ณด๋ค ๋ณด๋ฉด ๋ฐ๋ก ์์ฑํ ์ ๋์ด๋ค.
์์๋ก ๋ฐฑ์ค 2750๋ฒ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด์.
2750๋ฒ: ์ ์ ๋ ฌํ๊ธฐ
์ฒซ์งธ ์ค์ ์์ ๊ฐ์ N(1 ≤ N ≤ 1,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์๊ฐ ์ฃผ์ด์ง๋ค. ์ด ์๋ ์ ๋๊ฐ์ด 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค. ์๋ ์ค๋ณต๋์ง ์๋๋ค.
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
int[] A = new int[n];
for(int i=0; i<n; i++) {
A[i] = Integer.parseInt(bf.readLine());
}
// ์ ๋ ฌ ๊ฒฐ๊ณผ ์ถ๋ ฅ
for(int i=0; i<n-1; i++) {
for(int j=0; j<n-1-i; j++) {
if (A[j] > A[j+1]) {
int temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
}
for(int a : A) {
System.out.println(a);
}
}
}
n๊ฐ์ ์์๊ฐ ์์ผ๋ฏ๋ก, ๋น๊ต ์์ฒด๋ n-1๋ฒ ์งํํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํด ๋์.
๋จ, ๋ฒ๋ธ ์ ๋ ฌ์ O(n^2)์ ๋นํจ์จ์ ์ธ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ง๋๋ค. ์ ๋ ฅ ๊ฐ์ ์ฌ์ด์ฆ์ ์๊ฐ ์ ํ์ ๊ผญ ๊ณ ๋ คํด์ผํ๋ค.
๋ง์ฝ ์๊ฐ ์ ํ์ด 1์ด์ธ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์ถ์ฒํ๋ค.
์ ํ ์ ๋ ฌ
์ ํ ์ ๋ ฌ์ ๋ฐ์ดํฐ ์์๋ค ์ค์์ ์ต๋ ํน์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ์ฌ ์ฌ์ฉํ๋ค. ํ์ง๋ง, ๊ตฌํ ๋ฐฉ๋ฒ์ด ๋ณต์กํ๊ณ ์๊ฐ ๋ณต์ก๋๋ O(n^2)์ผ๋ก ํจ์จ์ ์ด์ง ์๋ค. ๋ฐ๋ผ์ ์ฝ๋ฉ ํ ์คํธ์์๋ ์ฌ์ฉํ์ง ์์ผ๋, ์ ์ฌ์ฉํ์ง ์๋์ง๋ ์์์ผ ํ๋ฏ๋ก ๋ฌธ์ ๋ฅผ ํตํด ๊ทธ ์ด์ ๋ฅผ ์ดํด๋ณด์.
๋ฐฑ์ค 1427๋ฒ ๋ฌธ์ ๋ฅผ ์ฐธ๊ณ ํ์๋ค.
1427๋ฒ: ์ํธ์ธ์ฌ์ด๋
์ฒซ์งธ ์ค์ ์ ๋ ฌํ๋ ค๊ณ ํ๋ ์ N์ด ์ฃผ์ด์ง๋ค. N์ 1,000,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
String str = sc.next();
int[] A = new int[str.length()];
for(int i=0; i<str.length(); i++) {
A[i] = Integer.parseInt(str.substring(i, i+1));
}
for(int i=0; i<str.length(); i++) {
int Max = i;
for(int j=i+1; j<str.length(); j++) {
if(A[j] > A[Max]) {
Max = j;
}
}
if(A[i] < A[Max]) {
int temp = A[i];
A[i] = A[Max];
A[Max] = temp;
}
}
for(int i=0; i<str.length(); i++) {
System.out.print(A[i]);
}
}
}
์ฒ์ฒํ ์ฝ์ด๋ณด๋ฉด, ์ ๋ ฌ์ ์ํด์ Max(ํน์ Min) ๊ฐ์ ์ฐพ์์ผ ํจ์ ์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ , ์ ์ผ ์ฒ์ ์ธ๋ฑ์ค๋ก ๋ถํฐ ๊ทธ Maxํน์ Min๊ฐ์ ์ฐจ๋ก๋๋ก ๋ฃ์ด ์ ๋ ฌํ๋ ๋ฐฉ์์ด๋ค.
์ฝ์ ์ ๋ ฌ
์ฝ์ ์ ๋ ฌ์ ์ ๋ ฌ๋ ๋ฐ์ดํฐ ๋ฒ์์ ์ ๋ ฌ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์ฝ์ ํ์ฌ ๋ฃ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ํ๊ท ์๊ฐ ๋ณต์ก๋๊ฐ O(n^2)์ผ๋ก ๋๋ฆฐ ํธ์ด๋ ๊ตฌํํ๊ธฐ ์ฝ๋ค๋ ์ฅ์ ์ด ์๋ค.
์์ ๋ฌธ์ ๋ก๋ ๋ฐฑ์ค 11399๋ฒ ๋ฌธ์ ๋ฅผ ์ฐธ๊ณ ํ์.
11399๋ฒ: ATM
์ฒซ์งธ ์ค์ ์ฌ๋์ ์ N(1 ≤ N ≤ 1,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ๊ฐ ์ฌ๋์ด ๋์ ์ธ์ถํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ Pi๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ Pi ≤ 1,000)
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] A = new int[n];
int[] S = new int[n];
for(int i=0; i<n; i++) {
A[i] = sc.nextInt();
}
for(int i=0; i<n; i++) {
int insert_point = i;
int insert_value = A[i];
for(int j=i-1; j>=0; j--) {
if(A[j] < A[i]) {
insert_point = j+1;
break;
}
if (j == 0) {
insert_point = 0;
}
}
for(int j = i; j > insert_point; j--) {
A[j] = A[j-1];
}
A[insert_point] = insert_value;
}
S[0] = A[0];
for(int i=1; i<n; i++) {
S[i] = S[i-1] + A[i];
}
int sum = 0;
for(int i=0; i<n; i++) {
sum = sum+ S[i];
}
System.out.println(sum);
}
}
ํด๋น ๋ฌธ์ ๋ ์ ๋ ฌ ์ด์ธ์๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ, ํฉ ๋ฐฐ์ด ๊ณต์์ด ์ฌ์ฉ๋์๋ค.
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋น์ฅ์ ์ต์ ์ ์ ํ์ด ์ต๊ณ ์ ์ ํ์ด๋ผ๊ณ ์ฌ๊ธฐ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ฌธ์ ์ํฉ์์ ๊ฐ์ฅ ์ ๊ฒ ์ธ์ถํ๋ ์ฌ๋์ ์์ ๋๋ ๊ฒ์ด ์ต๊ณ ์ ์ ํ์ด ๋๋ฏ๋ก ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ฐ ์ ํฉํ๋ค๊ณ ํ ์ ์๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด, ์ ๋ ฌ ๋์ด ์๋ ๋ถ๋ถ์ ํ์ํ๋ฉฐ ์ฝ์ ์์น๋ฅผ ์ฐพ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฝ์ ์์น๊ฐ ์์น๊ฐ ์ ์ ๋์๋ค๋ฉด, ์ฝ์ ์์น ์ดํ์ ์์๋ค๋ถํฐ ๊ธฐ์กด์ ์ฝ์ ๋์ ์์น๊น์ง ํ๋์ฉ ์ฎ๊ฒจ์ฃผ์ด์ผ ํ๋ค.
์ฝ์ ํ ๋์๋ ์ ์ฒ๋ผ ๊ทธ ์ดํ์ ์์๋ค์ ๋ํด ํ๋์ฉ ๋น๊ฒจ์ฃผ์ด์ผ ํ๋ค๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ ๋ฏ ํ๋ค.
Reference
- Do it! ์ฝ๋ฉ ํ ์คํธ - ๊ธฐ์ด ํธ
'๐ Knowledge > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(๋ณํฉ, ๊ธฐ์) ์๊ณ ๋ฆฌ์ฆ (3) (0) | 2023.08.18 |
|---|---|
| [์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(ํต ์ํธ) ์๊ณ ๋ฆฌ์ฆ (2) (0) | 2023.08.14 |
| [์๊ณ ๋ฆฌ์ฆ] ์คํ๊ณผ ํ์ ์ฌ์ฉ (0) | 2023.08.12 |
| [์๊ณ ๋ฆฌ์ฆ] ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ (0) | 2023.08.11 |
| [์๊ณ ๋ฆฌ์ฆ] ํฌ ํฌ์ธํฐ ์ฌ์ฉํ๊ธฐ (0) | 2023.08.10 |