
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm)
๊ฐ์
greedy
ํ์ฉ์ฌ - 1. ํ์์ค๋ฌ์ด 2.์์ฌ ๋ง์
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm)์ ๋งค ์๊ฐ ๊ฐ์ฅ ์ต์ ์ด๋ผ๊ณ ํ๋จ๋๋ ์ ํ์ ๋ฐ๋ณตํ์ฌ ์ต์ข ํด๋ต์ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ฆ, ํ์ฌ ๋จ๊ณ์์์ ์ต์ ์ ์ ํ์ด ์ต์ข ์ ์ผ๋ก๋ ์ต์ ํด(Optimal Solution)๊ฐ ๋๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- ์ฝ๋ฉํ ์คํธ์์ ๋ง๋ ๊ฒฝ์ฐ ์ฌ์ ์ ์ธ์ฐ๊ณ ์์ง ์์๋ ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ฌธ์ ์ ํ
- ์ง์ญ ์ต์ ํด(Local Optimum) โ ์ ์ญ ์ต์ ํด(Global Optimum) ๋ณด์ฅ ๊ฐ๋ฅํด์ผ ํจ
- ํ์์ ์ ํ(Greedy Choice)๊ณผ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal Substructure) ๋ง์กฑ
โ ๋์ ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming)๊ณผ ์ฐจ์ด์
- DP๋ ๋ถ๋ถ ๋ฌธ์ ์ ํด๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ฉฐ ์ต์ ํด๋ฅผ ์ฐพ์
- Greedy๋ ๋งค ์ ํ์ด ์ต์ ํด๋ก ๊ฐ๋ ๊ณผ์ ์ด๋ผ ๊ฐ์ ํ๊ณ ํ
โ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ ํ ์ ์๋ ์กฐ๊ฑด
- ํ์์ ์ ํ ์์ฑ(Greedy Choice Property)
- ํ์ฌ์ ์ ํ์ด ์ดํ ์ ํ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ต์ ํด๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค. - ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal Substructure)
- ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด๊ฐ ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๊ตฌ์ฑํ ์ ์์ด์ผ ํ๋ค.
โ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ์ ํ
- ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์
- ํ๋ ์ ํ ๋ฌธ์ (Activity Selection Problem)
- ํ๋ฆผ(Prim) ์๊ณ ๋ฆฌ์ฆ (์ต์ ์ ์ฅ ํธ๋ฆฌ)
- ํฌ๋ฃจ์ค์นผ(Kruskal) ์๊ณ ๋ฆฌ์ฆ (์ต์ ์ ์ฅ ํธ๋ฆฌ)
- ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ (์ต๋จ ๊ฒฝ๋ก)
์์ 1 - ๊ฑฐ์ค๋ฆ๋
๋น์ ์ ๋งํธ์์ ๊ณ์ฐ์ ํ๋ ์ ์์ด ๋์์ต๋๋ค. ์๋์๊ฒ ๊ฑฐ์ฌ๋ฌ์ค์ผํ ๋์ด N์์ผ ๋ ๊ฑฐ์ฌ๋ฌ์ค์ผ ํ ๋์ ์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ์ธ์. ์ด๋ ๊ฑฐ์ค๋ฆ๋์ผ๋ก ์ฌ์ฉํ ๋์ ์ 500์, 100์, 50์, 10์์ผ๋ก ๋ฌดํํ ์กด์ฌํ๊ณ , N์ 10์ ๋ฐฐ์๋ก ๊ฐ์ ํฉ๋๋ค.
์ ์ถ๋ ฅ ์
์ ๋ ฅ ์์ | ์ถ๋ ฅ ์์ |
1,460 | 8 |
1,890 | 11 |
์์
- ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ ๊ฐ์ฅ ํฐ ํํ ๋จ์๋ถํฐ ๋์ ๊ฑฐ์ฌ๋ฌ ์ค๋ค.
์์ค์ฝ๋
package Algorithm_01_Greedy;
import java.util.Scanner;
public class Q01_1_change {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int total = sc.nextInt();
int minCoinCnt = 0;
int coins [] = {500, 100, 50, 10};
for (int coin : coins) {
minCoinCnt += (total/coin);
total %= coin;
}
System.out.println("result = " + minCoinCnt);
sc.close();
}
}
์์ 2 - ํฐ ์ ๋ง๋ค๊ธฐ
์ด๋ค ์ซ์์์ k๊ฐ์ ์๋ฅผ ์ ๊ฑฐํ์ ๋ ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ ๊ตฌํ๋ ค ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ซ์ 1924์์ ์ ๋ ๊ฐ๋ฅผ ์ ๊ฑฐํ๋ฉด [19, 12, 14, 92, 94, 24] ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ค ๊ฐ์ฅ ํฐ ์ซ์๋ 94 ์ ๋๋ค. ๋ฌธ์์ด ํ์์ผ๋ก ์ซ์ number์ ์ ๊ฑฐํ ์์ ๊ฐ์ k๊ฐ solution ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. number์์ k ๊ฐ์ ์๋ฅผ ์ ๊ฑฐํ์ ๋
๋ง๋ค ์ ์๋ ์ ์ค ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ ๋ฌธ์์ด ํํ๋ก return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์ธ์.
์ ํ ์กฐ๊ฑด
- number๋ 2์๋ฆฌ ์ด์, 1,000,000์๋ฆฌ ์ดํ์ธ ์ซ์์ ๋๋ค.
- k๋ 1 ์ด์ number์ ์๋ฆฟ์ ๋ฏธ๋ง์ธ ์์ฐ์์ ๋๋ค.
์ถ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ ์ค์ ํฐ ์์ ๋ฒ์น์ ๋ฐ๋ผ ๋ํด์ง ๋ต์ ์ถ๋ ฅํ๋ค.
์ ์ถ๋ ฅ ์
number | k | return |
"1924" | 2 | "94" |
"1231234" | 3 | "3234" |
"4177252841" | 4 | "775841" |
์์
- ์์๋ฆฌ๋ถํฐ ํ์ํ๋ฉฐ ์ ๊ฑฐํ ์ ์๋ ์ซ์๋ ์ต๋ํ ์ ๊ฑฐํ์ฌ ํฐ ์ซ์๊ฐ ์์ ์ค๋๋ก greedyํ๊ฒ ์ ํํ๋ค. (์คํ์ ํ์ฉํ์ฌ ์ ์ซ์๋ณด๋ค ํฐ ์ซ์๊ฐ ์ค๋ฉด ์ด์ ์ซ์๋ฅผ ์ ๊ฑฐ)
์์ค ์ฝ๋
package Algorithm_01_Greedy;
import java.util.Stack;
public class Q01_2_TheLargestNumber {
public static void main(String[] args) {
// ํ๋ก๊ทธ๋๋จธ์ค
System.out.println(solution("1924", 2)); // ์ถ๋ ฅ: "94"
System.out.println(solution("1231234", 3)); // ์ถ๋ ฅ: "3234"
System.out.println(solution("4177252841", 4)); // ์ถ๋ ฅ: "775841"
}
public static String solution(String number, int k) {
Stack<Character> stack = new Stack<>();
for (char digit : number.toCharArray()) {
while (!stack.isEmpty() && stack.peek() < digit && k > 0) {
stack.pop();
k--;
}
stack.push(digit);
}
while (k > 0) {
stack.pop();
k--;
}
StringBuilder answer = new StringBuilder();
for (char digit : stack) {
answer.append(digit);
}
return answer.toString();
}
}
์์ 3 - ๋จ์์นด๋ฉ๋ผ
๊ณ ์๋๋ก๋ฅผ ์ด๋ํ๋ ๋ชจ๋ ์ฐจ๋์ด ๊ณ ์๋๋ก๋ฅผ ์ด์ฉํ๋ฉด์ ๋จ์์ฉ ์นด๋ฉ๋ผ๋ฅผ ํ ๋ฒ์ ๋ง๋๋๋ก ์นด๋ฉ๋ผ๋ฅผ ์ค์นํ๋ ค๊ณ ํฉ๋๋ค.
๊ณ ์๋๋ก๋ฅผ ์ด๋ํ๋ ์ฐจ๋์ ๊ฒฝ๋ก routes๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋ชจ๋ ์ฐจ๋์ด ํ ๋ฒ์ ๋จ์์ฉ ์นด๋ฉ๋ผ๋ฅผ ๋ง๋๋๋ก ํ๋ ค๋ฉด ์ต์ ๋ช ๋์ ์นด๋ฉ๋ผ๋ฅผ ์ค์นํด์ผ ํ๋์ง๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์ธ์.
์ ํ ์กฐ๊ฑด
- ์ฐจ๋์ ๋์๋ 1๋ ์ด์ 10,000๋ ์ดํ์ ๋๋ค.
- routes์๋ ์ฐจ๋์ ์ด๋ ๊ฒฝ๋ก๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ routes[i][0]์๋ i๋ฒ์งธ ์ฐจ๋์ด ๊ณ ์๋๋ก์ ์ง์ ํ ์ง์ , routes[i][1]์๋ i๋ฒ์งธ ์ฐจ๋์ด ๊ณ ์๋๋ก์์ ๋๊ฐ ์ง์ ์ด ์ ํ ์์ต๋๋ค.
- ์ฐจ๋์ ์ง์ /์ง์ถ ์ง์ ์ ์นด๋ฉ๋ผ๊ฐ ์ค์น๋์ด ์์ด๋ ์นด๋ฉ๋ผ๋ฅผ ๋ง๋๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
- ์ฐจ๋์ ์ง์ ์ง์ , ์ง์ถ ์ง์ ์ -30,000 ์ด์ 30,000 ์ดํ์ ๋๋ค.
์ ์ถ๋ ฅ ์
routes | return |
[[-20,-15], [-14,-5], [-18,-13], [-5,-3]] | 2 |
์ ์ถ๋ ฅ์ ์ค๋ช
- -5 ์ง์ ์ ์นด๋ฉ๋ผ๋ฅผ ์ค์นํ๋ฉด ๋ ๋ฒ์งธ, ๋ค ๋ฒ์งธ ์ฐจ๋์ด ์นด๋ฉ๋ผ๋ฅผ ๋ง๋ฉ๋๋ค.
- -15 ์ง์ ์ ์นด๋ฉ๋ผ๋ฅผ ์ค์นํ๋ฉด ์ฒซ ๋ฒ์งธ, ์ธ ๋ฒ์งธ ์ฐจ๋์ด ์นด๋ฉ๋ผ๋ฅผ ๋ง๋ฉ๋๋ค.
์์
- ์ง์ถ ์ง์ ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ ํ, ๊ฐ์ฅ ๋จผ์ ๋จ์์นด๋ฉ๋ผ๋ฅผ ์ค์นํด์ผ ํ๋ ์์น๋ฅผ ๊ฐฑ์ ํ๋ฉฐ ์ต์ ๊ฐ์์ ์นด๋ฉ๋ผ๋ฅผ ๋ฐฐ์นํ๋ค.
์์ค ์ฝ๋
package Algorithm_01_Greedy;
import java.util.Arrays;
import java.util.Comparator;
public class Q01_3_Camera {
public static void main(String[] args) {
int[][] routes = {{-20, -15}, {-14, -5}, {-18, -13}, {-5, -3}};
System.out.println(new Q01_3_Camera().solution(routes)); // ๊ฒฐ๊ณผ: 2
}
public int solution(int[][] routes) {
// ์นด๋ฉ๋ผ๋ฅผ ์ค์นํ ํ์
int cameraCount = 0;
// ์ด๋ ๊ฒฝ๋ก ์ข
๋ฃ ์ง์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
Arrays.sort(routes, new Comparator<int[]>() {
@Override
public int compare(int[] route1, int[] route2) {
return Integer.compare(route1[1], route2[1]); // ๋ ์์ ํ ๋น๊ต ๋ฐฉ์
}
});
// ์ค์น๋ ์นด๋ฉ๋ผ๊ฐ ๊ฐ์ํ ์ ์๋ ๋ง์ง๋ง ์์น
int lastCameraPosition = Integer.MIN_VALUE;
// ๋ชจ๋ ์ฐจ๋์ ๊ฒฝ๋ก๋ฅผ ์ํํ๋ฉด์ ์นด๋ฉ๋ผ๊ฐ ํ์ํ ๊ตฌ๊ฐ ์ฐพ๊ธฐ
for (int[] route : routes) {
if (lastCameraPosition < route[0]) { // ์๋ก์ด ์นด๋ฉ๋ผ ํ์
lastCameraPosition = route[1]; // ์นด๋ฉ๋ผ๋ฅผ ํ์ฌ ์ฐจ๋์ ๋ ์ง์ ์ ์ค์น
cameraCount++; // ์นด๋ฉ๋ผ ๊ฐ์ ์ฆ๊ฐ
}
}
return cameraCount; // ์ต์ข
์นด๋ฉ๋ผ ๊ฐ์ ๋ฐํ
}
}
์์ 4 - ๊ตฌ๋ช ๋ณดํธ
๋ฌด์ธ๋์ ๊ฐํ ์ฌ๋๋ค์ ๊ตฌ๋ช ๋ณดํธ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌ์ถํ๋ ค๊ณ ํฉ๋๋ค. ๊ตฌ๋ช ๋ณดํธ๋ ์์์ ํ ๋ฒ์ ์ต๋ 2๋ช ์ฉ ๋ฐ์ ํ ์ ์๊ณ , ๋ฌด๊ฒ ์ ํ๋ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ๋๋ค์ ๋ชธ๋ฌด๊ฒ๊ฐ [70kg, 50kg, 80kg, 50kg]์ด๊ณ ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ด 100kg์ด๋ผ๋ฉด 2๋ฒ์งธ ์ฌ๋๊ณผ 4๋ฒ์งธ ์ฌ๋์ ๊ฐ์ด ํ ์ ์์ง๋ง 1๋ฒ์งธ ์ฌ๋๊ณผ 3๋ฒ์งธ ์ฌ๋์ ๋ฌด๊ฒ์ ํฉ์ 150kg์ด๋ฏ๋ก ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ ์ด๊ณผํ์ฌ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
๊ตฌ๋ช ๋ณดํธ๋ฅผ ์ต๋ํ ์ ๊ฒ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ฌ๋์ ๊ตฌ์ถํ๋ ค๊ณ ํฉ๋๋ค.
์ฌ๋๋ค์ ๋ชธ๋ฌด๊ฒ๋ฅผ ๋ด์ ๋ฐฐ์ด people๊ณผ ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ limit๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋ชจ๋ ์ฌ๋์ ๊ตฌ์ถํ๊ธฐ ์ํด ํ์ํ ๊ตฌ๋ช ๋ณดํธ ๊ฐ์์ ์ต์๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์ฌํญ
- ๋ฌด์ธ๋์ ๊ฐํ ์ฌ๋์ 1๋ช ์ด์ 50,000๋ช ์ดํ์ ๋๋ค.
- ๊ฐ ์ฌ๋์ ๋ชธ๋ฌด๊ฒ๋ 40kg ์ด์ 240kg ์ดํ์ ๋๋ค.
- ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ 40kg ์ด์ 240kg ์ดํ์ ๋๋ค.
- ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ ํญ์ ์ฌ๋๋ค์ ๋ชธ๋ฌด๊ฒ ์ค ์ต๋๊ฐ๋ณด๋ค ํฌ๊ฒ ์ฃผ์ด์ง๋ฏ๋ก ์ฌ๋๋ค์ ๊ตฌ์ถํ ์ ์๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
people | limit | return |
[70, 50, 80, 50] | 100 | 3 |
[70, 80, 50] | 100 | 3 |
์์
- ๋ชธ๋ฌด๊ฒ๊ฐ ๊ฐ๋ฒผ์ด ์ฌ๋๊ณผ ๋ฌด๊ฑฐ์ด ์ฌ๋์ ์์ผ๋ก ๋ฌถ์ด ํ์ฐ๋, ๋ฌด๊ฒ ์ ํ์ ์ด๊ณผํ์ง ์๋๋ก ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํ์ฌ ์ต์ํ์ ๋ณดํธ๋ฅผ ์ฌ์ฉํ๋ค.
์์ค ์ฝ๋
package Algorithm_01_Greedy;
import java.util.Arrays;
public class Q01_4_Lifeboat {
public static void main(String[] args) {
Q01_4_Lifeboat lifeboat = new Q01_4_Lifeboat();
int[] people1 = {70, 50, 80, 50};
int limit1 = 100;
System.out.println(lifeboat.solution(people1, limit1)); // Expected output: 3
int[] people2 = {70, 80, 50};
int limit2 = 100;
System.out.println(lifeboat.solution(people2, limit2)); // Expected output: 3
}
public int solution(int[] people, int limit) {
Arrays.sort(people);
int idx = 0; // ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ์ฌ๋์ ์ธ๋ฑ์ค
int answer = 0; // ํ์ํ ๊ตฌ๋ช
๋ณดํธ ์
for (int i = people.length - 1; i >= idx; i--) {
if (people[i] + people[idx] <= limit) {
idx++; // ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ์ฌ๋๋ ํ์
}
answer++; // ๋ณดํธ ์ฌ์ฉ
}
return answer;
}
}
์์ 5 - ์ฒด์ก๋ณต
์ ์ฌ์๊ฐ์ ๋๋์ด ๋ค์ด, ์ผ๋ถ ํ์์ด ์ฒด์ก๋ณต์ ๋๋๋นํ์ต๋๋ค. ๋คํํ ์ฌ๋ฒ ์ฒด์ก๋ณต์ด ์๋ ํ์์ด ์ด๋ค์๊ฒ ์ฒด์ก๋ณต์ ๋น๋ ค์ฃผ๋ ค ํฉ๋๋ค. ํ์๋ค์ ๋ฒํธ๋ ์ฒด๊ฒฉ ์์ผ๋ก ๋งค๊ฒจ์ ธ ์์ด, ๋ฐ๋ก ์๋ฒํธ์ ํ์์ด๋ ๋ฐ๋ก ๋ท๋ฒํธ์ ํ์์๊ฒ๋ง ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, 4๋ฒ ํ์์ 3๋ฒ ํ์์ด๋ 5๋ฒ ํ์์๊ฒ๋ง ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค. ์ฒด์ก๋ณต์ด ์์ผ๋ฉด ์์ ์ ๋ค์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฒด์ก๋ณต์ ์ ์ ํ ๋น๋ ค ์ต๋ํ ๋ง์ ํ์์ด ์ฒด์ก์์ ์ ๋ค์ด์ผ ํฉ๋๋ค.
์ ์ฒด ํ์์ ์ n, ์ฒด์ก๋ณต์ ๋๋๋นํ ํ์๋ค์ ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฐฐ์ด lost, ์ฌ๋ฒ์ ์ฒด์ก๋ณต์ ๊ฐ์ ธ์จ ํ์๋ค์ ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฐฐ์ด reserve๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ฒด์ก์์ ์ ๋ค์ ์ ์๋ ํ์์ ์ต๋๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์ฌํญ
- ์ ์ฒด ํ์์ ์๋ 2๋ช ์ด์ 30๋ช ์ดํ์ ๋๋ค.
- ์ฒด์ก๋ณต์ ๋๋๋นํ ํ์์ ์๋ 1๋ช ์ด์ n๋ช ์ดํ์ด๊ณ ์ค๋ณต๋๋ ๋ฒํธ๋ ์์ต๋๋ค.
- ์ฌ๋ฒ์ ์ฒด์ก๋ณต์ ๊ฐ์ ธ์จ ํ์์ ์๋ 1๋ช ์ด์ n๋ช ์ดํ์ด๊ณ ์ค๋ณต๋๋ ๋ฒํธ๋ ์์ต๋๋ค.
- ์ฌ๋ฒ ์ฒด์ก๋ณต์ด ์๋ ํ์๋ง ๋ค๋ฅธ ํ์์๊ฒ ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค.
- ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ ธ์จ ํ์์ด ์ฒด์ก๋ณต์ ๋๋๋นํ์ ์ ์์ต๋๋ค. ์ด๋ ์ด ํ์์ ์ฒด์ก๋ณต์ ํ๋๋ง ๋๋๋นํ๋ค๊ณ ๊ฐ์ ํ๋ฉฐ, ๋จ์ ์ฒด์ก๋ณต์ด ํ๋์ด๊ธฐ์ ๋ค๋ฅธ ํ์์๊ฒ๋ ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
n | lost | reserve | return |
5 | [2, 4] | [1, 3, 5] | 5 |
5 | [2, 4] | [3] | 4 |
3 | [3] | [1] | 2 |
์์
- ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์์ ๋ฒํธ์(์ค๋ฆ์ฐจ์)์ผ๋ก ์ ๋ ฌํ ํ, ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์์ด ์๋ฒํธ(๋ฒํธ -1) โ ๋ท๋ฒํธ(๋ฒํธ +1) ์์๋ก ๋น๋ ค์ค ์ ์๋์ง ํ์ธํ๋ค. ์๋ฒํธ ํ์์ด ์ฒด์ก๋ณต์ด ์์ผ๋ฉด ๋จผ์ ๋น๋ ค์ฃผ๊ณ , ์์ผ๋ฉด ๋ท๋ฒํธ ํ์์๊ฒ ๋น๋ ค์ค๋ค. ์ด๋ ๊ฒํ๋ฉด ์ต๋ํ ๋ง์ ํ์์ด ์ฒด์ก๋ณต์ ๊ฐ์ง๋๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
์์ค ์ฝ๋
package Algorithm_01_Greedy;
import java.util.Arrays;
public class Q01_5_Sportswear {
public static void main(String[] args) {
Q01_5_Sportswear sw = new Q01_5_Sportswear();
int n1 = 5;
int[] lost1 = {2, 4};
int[] reserve1 = {1, 3, 5};
System.out.println(sw.solution(n1, lost1, reserve1)); // Expected output: 5
int n2 = 5;
int[] lost2 = {2, 4};
int[] reserve2 = {3};
System.out.println(sw.solution(n2, lost2, reserve2)); // Expected output: 4
int n3 = 3;
int[] lost3 = {3};
int[] reserve3 = {1};
System.out.println(sw.solution(n3, lost3, reserve3)); // Expected output: 2
}
public int solution(int n, int[] lost, int[] reserve) {
// 1. ์ฒด์ก๋ณต์ ์์ด๋ฒ๋ฆฐ ํ์์ ์์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฒด์ก๋ณต์ ๊ฐ์ง๊ณ ์๋ ํ์ ์๋ฅผ ๋บ ๊ฐ์ผ๋ก ์์.
int answer = n - lost.length;
// 2. ์์ด๋ฒ๋ฆฐ ํ์๊ณผ ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์์ ๋ฐฐ์ด์ ์ ๋ ฌํ์ฌ ๋น ๋ฅด๊ฒ ๋น๊ตํ ์ ์๊ฒ ํจ.
Arrays.sort(lost);
Arrays.sort(reserve);
// 3. ๊ฐ์ ํ์์ด ์์ด๋ฒ๋ฆฐ ์ฒด์ก๋ณต๊ณผ ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง๊ณ ์์ ๊ฒฝ์ฐ, ๊ทธ ํ์์ ์ฒด์ก๋ณต์ ์ฌ์ฉํ ์ ์์.
for (int i = 0; i < lost.length; i++) {
for (int j = 0; j < reserve.length; j++) {
// 4. ์์ด๋ฒ๋ฆฐ ํ์๊ณผ ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์์ด ๊ฐ์ผ๋ฉด ๊ทธ ํ์์ ์ฒด์ก๋ณต์ ์ฌ์ฉํ ์ ์์.
if (lost[i] == reserve[j]) {
answer++; // ์ฒด์ก๋ณต์ ๊ฐ์ง๊ฒ ๋๋ฏ๋ก answer ์ฆ๊ฐ
lost[i] = -1; // ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํ์์ -1๋ก ํ์ํ์ฌ ๋ค์ ์ฒ๋ฆฌ๋์ง ์๊ฒ ํจ
reserve[j] = -1; // ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์๋ -1๋ก ์ฒ๋ฆฌ
break; // ๋ ์ด์ ๋น๊ตํ ํ์ ์์
}
}
}
// 5. ์ด์ ์์ด๋ฒ๋ฆฐ ํ์์๊ฒ ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์๋ ์ฌ๋ฒ ์ฒด์ก๋ณต์ ์ฐพ์
for (int i = 0; i < lost.length; i++) {
for (int j = 0; j < reserve.length; j++) {
// 6. ์์ด๋ฒ๋ฆฐ ํ์์ด ์ฒด์ก๋ณต์ ๋น๋ฆด ์ ์๋ ํ์์ ์ฐพ์ (์๋ฒํธ๋ ๋ท๋ฒํธ ํ์)
if (lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j]) {
answer++; // ๋น๋ ค์ฃผ์์ผ๋ฏ๋ก answer ์ฆ๊ฐ
reserve[j] = -1; // ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์์ ๋ ์ด์ ๋น๋ ค์ค ์ ์์ผ๋ฏ๋ก -1๋ก ์ฒ๋ฆฌ
break; // ๋ ์ด์ ๋น๊ตํ ํ์ ์์
}
}
}
// 7. ์ต์ข
์ ์ผ๋ก ์ฒด์ก ์์
์ ์ฐธ์ฌํ ์ ์๋ ํ์ ์ ๋ฐํ
return answer;
}
์์ 6 - ์กฐ์ด์คํฑ
์กฐ์ด์คํฑ์ผ๋ก ์ํ๋ฒณ ์ด๋ฆ์ ์์ฑํ์ธ์. ๋งจ ์ฒ์์ A๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.ex) ์์ฑํด์ผ ํ๋ ์ด๋ฆ์ด ์ธ ๊ธ์๋ฉด AAA, ๋ค ๊ธ์๋ฉด AAAA์กฐ์ด์คํฑ์ ๊ฐ ๋ฐฉํฅ์ผ๋ก ์์ง์ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
โฒ - ๋ค์ ์ํ๋ฒณโผ - ์ด์ ์ํ๋ฒณ (A์์ ์๋์ชฝ์ผ๋ก ์ด๋ํ๋ฉด Z๋ก)โ - ์ปค์๋ฅผ ์ผ์ชฝ์ผ๋ก ์ด๋ (์ฒซ ๋ฒ์งธ ์์น์์ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ฉด ๋ง์ง๋ง ๋ฌธ์์ ์ปค์)โถ - ์ปค์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ (๋ง์ง๋ง ์์น์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ฉด ์ฒซ ๋ฒ์งธ ๋ฌธ์์ ์ปค์)
์๋ฅผ ๋ค์ด ์๋์ ๋ฐฉ๋ฒ์ผ๋ก "JAZ"๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
- ์ฒซ ๋ฒ์งธ ์์น์์ ์กฐ์ด์คํฑ์ ์๋ก 9๋ฒ ์กฐ์ํ์ฌ J๋ฅผ ์์ฑํฉ๋๋ค.- ์กฐ์ด์คํฑ์ ์ผ์ชฝ์ผ๋ก 1๋ฒ ์กฐ์ํ์ฌ ์ปค์๋ฅผ ๋ง์ง๋ง ๋ฌธ์ ์์น๋ก ์ด๋์ํต๋๋ค.- ๋ง์ง๋ง ์์น์์ ์กฐ์ด์คํฑ์ ์๋๋ก 1๋ฒ ์กฐ์ํ์ฌ Z๋ฅผ ์์ฑํฉ๋๋ค.๋ฐ๋ผ์ 11๋ฒ ์ด๋์์ผ "JAZ"๋ฅผ ๋ง๋ค ์ ์๊ณ , ์ด๋๊ฐ ์ต์ ์ด๋์ ๋๋ค.
๋ง๋ค๊ณ ์ ํ๋ ์ด๋ฆ name์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ด๋ฆ์ ๋ํด ์กฐ์ด์คํฑ ์กฐ์ ํ์์ ์ต์๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ๋ง๋์ธ์.
์ ํ ์ฌํญ
- name์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- name์ ๊ธธ์ด๋ 1 ์ด์ 20 ์ดํ์ ๋๋ค.
์ ์ถ๋ ฅ ์
name | return |
"JEROEN" | 56 |
"JAN" | 23 |
์์
- ๊ฐ ์ํ๋ฒณ์ ๋ง๋๋ ์ต์ ์กฐ์ ํ์์ ์ปค์ ์ด๋์ ์ต์๊ฐ์ ๊ณ ๋ คํ์ฌ ์ ์ฒด ์ต์ ์ด๋ ํ์๋ฅผ ๊ตฌํ๋ค. (์ปค์ ์ด๋์์๋ ์ผ์ชฝ/์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ๋์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ์ฌ, ์ฐ์๋ A๊ฐ ์๋ ๊ตฌ๊ฐ์ ๊ฑด๋๋ฐ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ๋ค.)
์์ค ์ฝ๋
package Algorithm_01_Greedy;
public class Q01_6_Joystick {
public static void main(String[] args) {
Q01_6_Joystick js = new Q01_6_Joystick();
System.out.println(js.solution("JEROEN")); // 56
System.out.println(js.solution("JAN")); // 23
System.out.println(js.solution("AAAA")); // 0
System.out.println(js.solution("ABABAAAAABA")); // 10
}
public int solution(String name) {
int answer = 0; // ์ด ์กฐ์ ํ์๋ฅผ ์ ์ฅํ ๋ณ์
int length = name.length(); // ์ด๋ฆ์ ๊ธธ์ด
int index = 0; // ์ปค์๋ฅผ ์ด๋ํ ์์น๋ฅผ ์ถ์ ํ๋ ๋ณ์
int move = length - 1; // ์ปค์ ์ด๋์ ์ต์๊ฐ์ ์ถ์ ํ๋ ๋ณ์
// 1. ๊ฐ ์ํ๋ฒณ์ ๋ง๋ค๊ธฐ ์ํ ์ต์ ์กฐ์ ํ์๋ฅผ ๋ํด์ค
for (int i = 0; i < length; i++) {
// ์ํ๋ฒณ์ ๋ง๋๋ ๋ฐ ๋๋ ์ต์ ์กฐ์ ํ์: ์๋ก ๊ฐ๋ ๋ฐฉ๋ฒ๊ณผ ์๋๋ก ๊ฐ๋ ๋ฐฉ๋ฒ ์ค ๋ ์์ ๊ฐ ์ ํ
answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
// 2. ์ผ์ชฝ์ผ๋ก ์ด๋ํ ์ ์๋ ์ฐ์๋ A๋ฅผ ์ฐพ์, ๊ทธ ๋ฒ์ ์์์ ์ด๋์ ์ต์ํ
index = i + 1;
// A๊ฐ ์ฐ์๋๋ ๊ตฌ๊ฐ์ ๊ฑด๋๋ฐ๊ธฐ ์ํด index๋ฅผ ์ฐพ์
while (index < length && name.charAt(index) == 'A') {
index++;
}
// 3. ์ด๋ ๊ฒฝ๋ก์์ ์ต์๊ฐ์ ๊ฐฑ์
// i * 2 + length - index๋ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๊ณ ๋์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ
move = Math.min(move, i * 2 + length - index);
// (length - index) * 2 + i๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๊ณ ๋์ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ
move = Math.min(move, (length - index) * 2 + i);
}
// 4. ์ํ๋ฒณ์ ๋ง๋๋ ์ต์ ํ์์ ์ปค์ ์ด๋์ ์ต์๊ฐ์ ํฉ์ฐํ์ฌ ๊ฒฐ๊ณผ ๋ฐํ
return answer + move;
}
}
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ ๋ฅผ ํ์ด๋ณธ ํ
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ ๋๋ฌด ์ด๋ ต๋ค. ํ์ง๋ง ํ ๊ฐ์ง ํฌ๋ง์ ์ธ ์ฌ์ค(?)์ ๋์๊ฒ๋ง ์ด๋ ค์ด ๊ฒ์ด ์๋๋ผ ๋จ๋ค์๊ฒ, ์ฐ๋ฆฌ ๋ชจ๋์๊ฒ ์ด๋ ต๋ค๋ ๊ฒ์ด๋ค. ์๋ฌด๋ ด, ์ต๊ณ ์ ์ํ์์ ๊ณผํ์๋ค์ด ๋ฐ๊ฒฌํ ๋์ ๋ฅผ ํธ๋ ๊ฑด๋ฐ, ์ฝ์ง ์์ ๊ฒ์ด๋ค. ๋ฌธ์ ์ ํ๋ณ๋ก ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ฅผ ์จ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐ ํ ์ง๋ฅผ ๋นจ๋ฆฌ ์บ์น ํ ์ค ์์์ผ ํ๋ค.
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฌ ์ํ์์ ์ต์ ์ ์ ํ์ ํ๋ ๋ฐฉ์์ด๋ค. ์ด ๋ฐฉ์์ด ์ ํตํ๋ ๋ฌธ์ ์ ๊ทธ๋ ์ง ์์ ๋ฌธ์ ๋ฅผ ์ง๊ฐ์ ์ผ๋ก ๊ตฌ๋ถํ ์ ์์ด์ผ ํ๋ค. ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST) ๋ฌธ์ , ๊ทธ๋ฆฌ๊ณ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ์ ๊ฒฝ์ฐ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ด ์ต์ ํด๋ฅผ ๋ณด์ฅํ๋ค.
๊ทธ๋ฌ๋ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ๋ฅผ ์ฌ์ฉํ๋ ์ต๋จ๊ฒฝ๋ก ๋ฌธ์ ๋ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ด ์ต์ ํด๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค. ์ด๋ฐ ๋ฌธ์ ๋ค์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(DP)์ด๋ ๋ฐฑํธ๋ํน ๋ฑ์ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก, ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ธ์๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋ํ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ฉด์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ฐ๋์ ๊ณ ๋ คํด์ผ ํ๋ค. ๋ณดํต ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ O(n) ๋๋ O(n log n)์ผ๋ก ํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก, ์๊ฐ ๋ณต์ก๋๊ฐ ์ค์ํ ๋ฌธ์ ์์ ํจ์จ์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํ๋ ๊ฒ๋ ์ค์ํ๋ค. ๊ทธ๋ฆฌ๋์ ํจ๊ป ์ฐ์ด๋ ์๋ฃ๊ตฌ์กฐ๋ก๋ ์ฐ์ ์์ ํ๋ ํ์ด๋ค.
GitHub: https://github.com/awesomepossumgirl/coding-test/tree/main/coding-test/src/Algorithm_01_Greedy
๋ฌธ์ ์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค https://school.programmers.co.kr/learn/courses/30/parts/12244
'Algorithm > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ

๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm)
๊ฐ์
greedy
ํ์ฉ์ฌ - 1. ํ์์ค๋ฌ์ด 2.์์ฌ ๋ง์
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm)์ ๋งค ์๊ฐ ๊ฐ์ฅ ์ต์ ์ด๋ผ๊ณ ํ๋จ๋๋ ์ ํ์ ๋ฐ๋ณตํ์ฌ ์ต์ข ํด๋ต์ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ฆ, ํ์ฌ ๋จ๊ณ์์์ ์ต์ ์ ์ ํ์ด ์ต์ข ์ ์ผ๋ก๋ ์ต์ ํด(Optimal Solution)๊ฐ ๋๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- ์ฝ๋ฉํ ์คํธ์์ ๋ง๋ ๊ฒฝ์ฐ ์ฌ์ ์ ์ธ์ฐ๊ณ ์์ง ์์๋ ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ฌธ์ ์ ํ
- ์ง์ญ ์ต์ ํด(Local Optimum) โ ์ ์ญ ์ต์ ํด(Global Optimum) ๋ณด์ฅ ๊ฐ๋ฅํด์ผ ํจ
- ํ์์ ์ ํ(Greedy Choice)๊ณผ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal Substructure) ๋ง์กฑ
โ ๋์ ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming)๊ณผ ์ฐจ์ด์
- DP๋ ๋ถ๋ถ ๋ฌธ์ ์ ํด๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ฉฐ ์ต์ ํด๋ฅผ ์ฐพ์
- Greedy๋ ๋งค ์ ํ์ด ์ต์ ํด๋ก ๊ฐ๋ ๊ณผ์ ์ด๋ผ ๊ฐ์ ํ๊ณ ํ
โ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ ํ ์ ์๋ ์กฐ๊ฑด
- ํ์์ ์ ํ ์์ฑ(Greedy Choice Property)
- ํ์ฌ์ ์ ํ์ด ์ดํ ์ ํ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ต์ ํด๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค. - ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal Substructure)
- ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด๊ฐ ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๊ตฌ์ฑํ ์ ์์ด์ผ ํ๋ค.
โ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ์ ํ
- ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์
- ํ๋ ์ ํ ๋ฌธ์ (Activity Selection Problem)
- ํ๋ฆผ(Prim) ์๊ณ ๋ฆฌ์ฆ (์ต์ ์ ์ฅ ํธ๋ฆฌ)
- ํฌ๋ฃจ์ค์นผ(Kruskal) ์๊ณ ๋ฆฌ์ฆ (์ต์ ์ ์ฅ ํธ๋ฆฌ)
- ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ (์ต๋จ ๊ฒฝ๋ก)
์์ 1 - ๊ฑฐ์ค๋ฆ๋
๋น์ ์ ๋งํธ์์ ๊ณ์ฐ์ ํ๋ ์ ์์ด ๋์์ต๋๋ค. ์๋์๊ฒ ๊ฑฐ์ฌ๋ฌ์ค์ผํ ๋์ด N์์ผ ๋ ๊ฑฐ์ฌ๋ฌ์ค์ผ ํ ๋์ ์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ์ธ์. ์ด๋ ๊ฑฐ์ค๋ฆ๋์ผ๋ก ์ฌ์ฉํ ๋์ ์ 500์, 100์, 50์, 10์์ผ๋ก ๋ฌดํํ ์กด์ฌํ๊ณ , N์ 10์ ๋ฐฐ์๋ก ๊ฐ์ ํฉ๋๋ค.
์ ์ถ๋ ฅ ์
์ ๋ ฅ ์์ | ์ถ๋ ฅ ์์ |
1,460 | 8 |
1,890 | 11 |
์์
- ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ ๊ฐ์ฅ ํฐ ํํ ๋จ์๋ถํฐ ๋์ ๊ฑฐ์ฌ๋ฌ ์ค๋ค.
์์ค์ฝ๋
package Algorithm_01_Greedy;
import java.util.Scanner;
public class Q01_1_change {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int total = sc.nextInt();
int minCoinCnt = 0;
int coins [] = {500, 100, 50, 10};
for (int coin : coins) {
minCoinCnt += (total/coin);
total %= coin;
}
System.out.println("result = " + minCoinCnt);
sc.close();
}
}
์์ 2 - ํฐ ์ ๋ง๋ค๊ธฐ
์ด๋ค ์ซ์์์ k๊ฐ์ ์๋ฅผ ์ ๊ฑฐํ์ ๋ ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ ๊ตฌํ๋ ค ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ซ์ 1924์์ ์ ๋ ๊ฐ๋ฅผ ์ ๊ฑฐํ๋ฉด [19, 12, 14, 92, 94, 24] ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ค ๊ฐ์ฅ ํฐ ์ซ์๋ 94 ์ ๋๋ค. ๋ฌธ์์ด ํ์์ผ๋ก ์ซ์ number์ ์ ๊ฑฐํ ์์ ๊ฐ์ k๊ฐ solution ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. number์์ k ๊ฐ์ ์๋ฅผ ์ ๊ฑฐํ์ ๋
๋ง๋ค ์ ์๋ ์ ์ค ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ ๋ฌธ์์ด ํํ๋ก return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์ธ์.
์ ํ ์กฐ๊ฑด
- number๋ 2์๋ฆฌ ์ด์, 1,000,000์๋ฆฌ ์ดํ์ธ ์ซ์์ ๋๋ค.
- k๋ 1 ์ด์ number์ ์๋ฆฟ์ ๋ฏธ๋ง์ธ ์์ฐ์์ ๋๋ค.
์ถ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ ์ค์ ํฐ ์์ ๋ฒ์น์ ๋ฐ๋ผ ๋ํด์ง ๋ต์ ์ถ๋ ฅํ๋ค.
์ ์ถ๋ ฅ ์
number | k | return |
"1924" | 2 | "94" |
"1231234" | 3 | "3234" |
"4177252841" | 4 | "775841" |
์์
- ์์๋ฆฌ๋ถํฐ ํ์ํ๋ฉฐ ์ ๊ฑฐํ ์ ์๋ ์ซ์๋ ์ต๋ํ ์ ๊ฑฐํ์ฌ ํฐ ์ซ์๊ฐ ์์ ์ค๋๋ก greedyํ๊ฒ ์ ํํ๋ค. (์คํ์ ํ์ฉํ์ฌ ์ ์ซ์๋ณด๋ค ํฐ ์ซ์๊ฐ ์ค๋ฉด ์ด์ ์ซ์๋ฅผ ์ ๊ฑฐ)
์์ค ์ฝ๋
package Algorithm_01_Greedy;
import java.util.Stack;
public class Q01_2_TheLargestNumber {
public static void main(String[] args) {
// ํ๋ก๊ทธ๋๋จธ์ค
System.out.println(solution("1924", 2)); // ์ถ๋ ฅ: "94"
System.out.println(solution("1231234", 3)); // ์ถ๋ ฅ: "3234"
System.out.println(solution("4177252841", 4)); // ์ถ๋ ฅ: "775841"
}
public static String solution(String number, int k) {
Stack<Character> stack = new Stack<>();
for (char digit : number.toCharArray()) {
while (!stack.isEmpty() && stack.peek() < digit && k > 0) {
stack.pop();
k--;
}
stack.push(digit);
}
while (k > 0) {
stack.pop();
k--;
}
StringBuilder answer = new StringBuilder();
for (char digit : stack) {
answer.append(digit);
}
return answer.toString();
}
}
์์ 3 - ๋จ์์นด๋ฉ๋ผ
๊ณ ์๋๋ก๋ฅผ ์ด๋ํ๋ ๋ชจ๋ ์ฐจ๋์ด ๊ณ ์๋๋ก๋ฅผ ์ด์ฉํ๋ฉด์ ๋จ์์ฉ ์นด๋ฉ๋ผ๋ฅผ ํ ๋ฒ์ ๋ง๋๋๋ก ์นด๋ฉ๋ผ๋ฅผ ์ค์นํ๋ ค๊ณ ํฉ๋๋ค.
๊ณ ์๋๋ก๋ฅผ ์ด๋ํ๋ ์ฐจ๋์ ๊ฒฝ๋ก routes๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋ชจ๋ ์ฐจ๋์ด ํ ๋ฒ์ ๋จ์์ฉ ์นด๋ฉ๋ผ๋ฅผ ๋ง๋๋๋ก ํ๋ ค๋ฉด ์ต์ ๋ช ๋์ ์นด๋ฉ๋ผ๋ฅผ ์ค์นํด์ผ ํ๋์ง๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์ธ์.
์ ํ ์กฐ๊ฑด
- ์ฐจ๋์ ๋์๋ 1๋ ์ด์ 10,000๋ ์ดํ์ ๋๋ค.
- routes์๋ ์ฐจ๋์ ์ด๋ ๊ฒฝ๋ก๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ routes[i][0]์๋ i๋ฒ์งธ ์ฐจ๋์ด ๊ณ ์๋๋ก์ ์ง์ ํ ์ง์ , routes[i][1]์๋ i๋ฒ์งธ ์ฐจ๋์ด ๊ณ ์๋๋ก์์ ๋๊ฐ ์ง์ ์ด ์ ํ ์์ต๋๋ค.
- ์ฐจ๋์ ์ง์ /์ง์ถ ์ง์ ์ ์นด๋ฉ๋ผ๊ฐ ์ค์น๋์ด ์์ด๋ ์นด๋ฉ๋ผ๋ฅผ ๋ง๋๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
- ์ฐจ๋์ ์ง์ ์ง์ , ์ง์ถ ์ง์ ์ -30,000 ์ด์ 30,000 ์ดํ์ ๋๋ค.
์ ์ถ๋ ฅ ์
routes | return |
[[-20,-15], [-14,-5], [-18,-13], [-5,-3]] | 2 |
์ ์ถ๋ ฅ์ ์ค๋ช
- -5 ์ง์ ์ ์นด๋ฉ๋ผ๋ฅผ ์ค์นํ๋ฉด ๋ ๋ฒ์งธ, ๋ค ๋ฒ์งธ ์ฐจ๋์ด ์นด๋ฉ๋ผ๋ฅผ ๋ง๋ฉ๋๋ค.
- -15 ์ง์ ์ ์นด๋ฉ๋ผ๋ฅผ ์ค์นํ๋ฉด ์ฒซ ๋ฒ์งธ, ์ธ ๋ฒ์งธ ์ฐจ๋์ด ์นด๋ฉ๋ผ๋ฅผ ๋ง๋ฉ๋๋ค.
์์
- ์ง์ถ ์ง์ ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ ํ, ๊ฐ์ฅ ๋จผ์ ๋จ์์นด๋ฉ๋ผ๋ฅผ ์ค์นํด์ผ ํ๋ ์์น๋ฅผ ๊ฐฑ์ ํ๋ฉฐ ์ต์ ๊ฐ์์ ์นด๋ฉ๋ผ๋ฅผ ๋ฐฐ์นํ๋ค.
์์ค ์ฝ๋
package Algorithm_01_Greedy;
import java.util.Arrays;
import java.util.Comparator;
public class Q01_3_Camera {
public static void main(String[] args) {
int[][] routes = {{-20, -15}, {-14, -5}, {-18, -13}, {-5, -3}};
System.out.println(new Q01_3_Camera().solution(routes)); // ๊ฒฐ๊ณผ: 2
}
public int solution(int[][] routes) {
// ์นด๋ฉ๋ผ๋ฅผ ์ค์นํ ํ์
int cameraCount = 0;
// ์ด๋ ๊ฒฝ๋ก ์ข
๋ฃ ์ง์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
Arrays.sort(routes, new Comparator<int[]>() {
@Override
public int compare(int[] route1, int[] route2) {
return Integer.compare(route1[1], route2[1]); // ๋ ์์ ํ ๋น๊ต ๋ฐฉ์
}
});
// ์ค์น๋ ์นด๋ฉ๋ผ๊ฐ ๊ฐ์ํ ์ ์๋ ๋ง์ง๋ง ์์น
int lastCameraPosition = Integer.MIN_VALUE;
// ๋ชจ๋ ์ฐจ๋์ ๊ฒฝ๋ก๋ฅผ ์ํํ๋ฉด์ ์นด๋ฉ๋ผ๊ฐ ํ์ํ ๊ตฌ๊ฐ ์ฐพ๊ธฐ
for (int[] route : routes) {
if (lastCameraPosition < route[0]) { // ์๋ก์ด ์นด๋ฉ๋ผ ํ์
lastCameraPosition = route[1]; // ์นด๋ฉ๋ผ๋ฅผ ํ์ฌ ์ฐจ๋์ ๋ ์ง์ ์ ์ค์น
cameraCount++; // ์นด๋ฉ๋ผ ๊ฐ์ ์ฆ๊ฐ
}
}
return cameraCount; // ์ต์ข
์นด๋ฉ๋ผ ๊ฐ์ ๋ฐํ
}
}
์์ 4 - ๊ตฌ๋ช ๋ณดํธ
๋ฌด์ธ๋์ ๊ฐํ ์ฌ๋๋ค์ ๊ตฌ๋ช ๋ณดํธ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌ์ถํ๋ ค๊ณ ํฉ๋๋ค. ๊ตฌ๋ช ๋ณดํธ๋ ์์์ ํ ๋ฒ์ ์ต๋ 2๋ช ์ฉ ๋ฐ์ ํ ์ ์๊ณ , ๋ฌด๊ฒ ์ ํ๋ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ๋๋ค์ ๋ชธ๋ฌด๊ฒ๊ฐ [70kg, 50kg, 80kg, 50kg]์ด๊ณ ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ด 100kg์ด๋ผ๋ฉด 2๋ฒ์งธ ์ฌ๋๊ณผ 4๋ฒ์งธ ์ฌ๋์ ๊ฐ์ด ํ ์ ์์ง๋ง 1๋ฒ์งธ ์ฌ๋๊ณผ 3๋ฒ์งธ ์ฌ๋์ ๋ฌด๊ฒ์ ํฉ์ 150kg์ด๋ฏ๋ก ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ ์ด๊ณผํ์ฌ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
๊ตฌ๋ช ๋ณดํธ๋ฅผ ์ต๋ํ ์ ๊ฒ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ฌ๋์ ๊ตฌ์ถํ๋ ค๊ณ ํฉ๋๋ค.
์ฌ๋๋ค์ ๋ชธ๋ฌด๊ฒ๋ฅผ ๋ด์ ๋ฐฐ์ด people๊ณผ ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ limit๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋ชจ๋ ์ฌ๋์ ๊ตฌ์ถํ๊ธฐ ์ํด ํ์ํ ๊ตฌ๋ช ๋ณดํธ ๊ฐ์์ ์ต์๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์ฌํญ
- ๋ฌด์ธ๋์ ๊ฐํ ์ฌ๋์ 1๋ช ์ด์ 50,000๋ช ์ดํ์ ๋๋ค.
- ๊ฐ ์ฌ๋์ ๋ชธ๋ฌด๊ฒ๋ 40kg ์ด์ 240kg ์ดํ์ ๋๋ค.
- ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ 40kg ์ด์ 240kg ์ดํ์ ๋๋ค.
- ๊ตฌ๋ช ๋ณดํธ์ ๋ฌด๊ฒ ์ ํ์ ํญ์ ์ฌ๋๋ค์ ๋ชธ๋ฌด๊ฒ ์ค ์ต๋๊ฐ๋ณด๋ค ํฌ๊ฒ ์ฃผ์ด์ง๋ฏ๋ก ์ฌ๋๋ค์ ๊ตฌ์ถํ ์ ์๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
people | limit | return |
[70, 50, 80, 50] | 100 | 3 |
[70, 80, 50] | 100 | 3 |
์์
- ๋ชธ๋ฌด๊ฒ๊ฐ ๊ฐ๋ฒผ์ด ์ฌ๋๊ณผ ๋ฌด๊ฑฐ์ด ์ฌ๋์ ์์ผ๋ก ๋ฌถ์ด ํ์ฐ๋, ๋ฌด๊ฒ ์ ํ์ ์ด๊ณผํ์ง ์๋๋ก ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํ์ฌ ์ต์ํ์ ๋ณดํธ๋ฅผ ์ฌ์ฉํ๋ค.
์์ค ์ฝ๋
package Algorithm_01_Greedy;
import java.util.Arrays;
public class Q01_4_Lifeboat {
public static void main(String[] args) {
Q01_4_Lifeboat lifeboat = new Q01_4_Lifeboat();
int[] people1 = {70, 50, 80, 50};
int limit1 = 100;
System.out.println(lifeboat.solution(people1, limit1)); // Expected output: 3
int[] people2 = {70, 80, 50};
int limit2 = 100;
System.out.println(lifeboat.solution(people2, limit2)); // Expected output: 3
}
public int solution(int[] people, int limit) {
Arrays.sort(people);
int idx = 0; // ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ์ฌ๋์ ์ธ๋ฑ์ค
int answer = 0; // ํ์ํ ๊ตฌ๋ช
๋ณดํธ ์
for (int i = people.length - 1; i >= idx; i--) {
if (people[i] + people[idx] <= limit) {
idx++; // ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ์ฌ๋๋ ํ์
}
answer++; // ๋ณดํธ ์ฌ์ฉ
}
return answer;
}
}
์์ 5 - ์ฒด์ก๋ณต
์ ์ฌ์๊ฐ์ ๋๋์ด ๋ค์ด, ์ผ๋ถ ํ์์ด ์ฒด์ก๋ณต์ ๋๋๋นํ์ต๋๋ค. ๋คํํ ์ฌ๋ฒ ์ฒด์ก๋ณต์ด ์๋ ํ์์ด ์ด๋ค์๊ฒ ์ฒด์ก๋ณต์ ๋น๋ ค์ฃผ๋ ค ํฉ๋๋ค. ํ์๋ค์ ๋ฒํธ๋ ์ฒด๊ฒฉ ์์ผ๋ก ๋งค๊ฒจ์ ธ ์์ด, ๋ฐ๋ก ์๋ฒํธ์ ํ์์ด๋ ๋ฐ๋ก ๋ท๋ฒํธ์ ํ์์๊ฒ๋ง ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, 4๋ฒ ํ์์ 3๋ฒ ํ์์ด๋ 5๋ฒ ํ์์๊ฒ๋ง ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค. ์ฒด์ก๋ณต์ด ์์ผ๋ฉด ์์ ์ ๋ค์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฒด์ก๋ณต์ ์ ์ ํ ๋น๋ ค ์ต๋ํ ๋ง์ ํ์์ด ์ฒด์ก์์ ์ ๋ค์ด์ผ ํฉ๋๋ค.
์ ์ฒด ํ์์ ์ n, ์ฒด์ก๋ณต์ ๋๋๋นํ ํ์๋ค์ ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฐฐ์ด lost, ์ฌ๋ฒ์ ์ฒด์ก๋ณต์ ๊ฐ์ ธ์จ ํ์๋ค์ ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฐฐ์ด reserve๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ฒด์ก์์ ์ ๋ค์ ์ ์๋ ํ์์ ์ต๋๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์ฌํญ
- ์ ์ฒด ํ์์ ์๋ 2๋ช ์ด์ 30๋ช ์ดํ์ ๋๋ค.
- ์ฒด์ก๋ณต์ ๋๋๋นํ ํ์์ ์๋ 1๋ช ์ด์ n๋ช ์ดํ์ด๊ณ ์ค๋ณต๋๋ ๋ฒํธ๋ ์์ต๋๋ค.
- ์ฌ๋ฒ์ ์ฒด์ก๋ณต์ ๊ฐ์ ธ์จ ํ์์ ์๋ 1๋ช ์ด์ n๋ช ์ดํ์ด๊ณ ์ค๋ณต๋๋ ๋ฒํธ๋ ์์ต๋๋ค.
- ์ฌ๋ฒ ์ฒด์ก๋ณต์ด ์๋ ํ์๋ง ๋ค๋ฅธ ํ์์๊ฒ ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค.
- ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ ธ์จ ํ์์ด ์ฒด์ก๋ณต์ ๋๋๋นํ์ ์ ์์ต๋๋ค. ์ด๋ ์ด ํ์์ ์ฒด์ก๋ณต์ ํ๋๋ง ๋๋๋นํ๋ค๊ณ ๊ฐ์ ํ๋ฉฐ, ๋จ์ ์ฒด์ก๋ณต์ด ํ๋์ด๊ธฐ์ ๋ค๋ฅธ ํ์์๊ฒ๋ ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
n | lost | reserve | return |
5 | [2, 4] | [1, 3, 5] | 5 |
5 | [2, 4] | [3] | 4 |
3 | [3] | [1] | 2 |
์์
- ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์์ ๋ฒํธ์(์ค๋ฆ์ฐจ์)์ผ๋ก ์ ๋ ฌํ ํ, ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์์ด ์๋ฒํธ(๋ฒํธ -1) โ ๋ท๋ฒํธ(๋ฒํธ +1) ์์๋ก ๋น๋ ค์ค ์ ์๋์ง ํ์ธํ๋ค. ์๋ฒํธ ํ์์ด ์ฒด์ก๋ณต์ด ์์ผ๋ฉด ๋จผ์ ๋น๋ ค์ฃผ๊ณ , ์์ผ๋ฉด ๋ท๋ฒํธ ํ์์๊ฒ ๋น๋ ค์ค๋ค. ์ด๋ ๊ฒํ๋ฉด ์ต๋ํ ๋ง์ ํ์์ด ์ฒด์ก๋ณต์ ๊ฐ์ง๋๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
์์ค ์ฝ๋
package Algorithm_01_Greedy;
import java.util.Arrays;
public class Q01_5_Sportswear {
public static void main(String[] args) {
Q01_5_Sportswear sw = new Q01_5_Sportswear();
int n1 = 5;
int[] lost1 = {2, 4};
int[] reserve1 = {1, 3, 5};
System.out.println(sw.solution(n1, lost1, reserve1)); // Expected output: 5
int n2 = 5;
int[] lost2 = {2, 4};
int[] reserve2 = {3};
System.out.println(sw.solution(n2, lost2, reserve2)); // Expected output: 4
int n3 = 3;
int[] lost3 = {3};
int[] reserve3 = {1};
System.out.println(sw.solution(n3, lost3, reserve3)); // Expected output: 2
}
public int solution(int n, int[] lost, int[] reserve) {
// 1. ์ฒด์ก๋ณต์ ์์ด๋ฒ๋ฆฐ ํ์์ ์์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฒด์ก๋ณต์ ๊ฐ์ง๊ณ ์๋ ํ์ ์๋ฅผ ๋บ ๊ฐ์ผ๋ก ์์.
int answer = n - lost.length;
// 2. ์์ด๋ฒ๋ฆฐ ํ์๊ณผ ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์์ ๋ฐฐ์ด์ ์ ๋ ฌํ์ฌ ๋น ๋ฅด๊ฒ ๋น๊ตํ ์ ์๊ฒ ํจ.
Arrays.sort(lost);
Arrays.sort(reserve);
// 3. ๊ฐ์ ํ์์ด ์์ด๋ฒ๋ฆฐ ์ฒด์ก๋ณต๊ณผ ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง๊ณ ์์ ๊ฒฝ์ฐ, ๊ทธ ํ์์ ์ฒด์ก๋ณต์ ์ฌ์ฉํ ์ ์์.
for (int i = 0; i < lost.length; i++) {
for (int j = 0; j < reserve.length; j++) {
// 4. ์์ด๋ฒ๋ฆฐ ํ์๊ณผ ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์์ด ๊ฐ์ผ๋ฉด ๊ทธ ํ์์ ์ฒด์ก๋ณต์ ์ฌ์ฉํ ์ ์์.
if (lost[i] == reserve[j]) {
answer++; // ์ฒด์ก๋ณต์ ๊ฐ์ง๊ฒ ๋๋ฏ๋ก answer ์ฆ๊ฐ
lost[i] = -1; // ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํ์์ -1๋ก ํ์ํ์ฌ ๋ค์ ์ฒ๋ฆฌ๋์ง ์๊ฒ ํจ
reserve[j] = -1; // ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์๋ -1๋ก ์ฒ๋ฆฌ
break; // ๋ ์ด์ ๋น๊ตํ ํ์ ์์
}
}
}
// 5. ์ด์ ์์ด๋ฒ๋ฆฐ ํ์์๊ฒ ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์๋ ์ฌ๋ฒ ์ฒด์ก๋ณต์ ์ฐพ์
for (int i = 0; i < lost.length; i++) {
for (int j = 0; j < reserve.length; j++) {
// 6. ์์ด๋ฒ๋ฆฐ ํ์์ด ์ฒด์ก๋ณต์ ๋น๋ฆด ์ ์๋ ํ์์ ์ฐพ์ (์๋ฒํธ๋ ๋ท๋ฒํธ ํ์)
if (lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j]) {
answer++; // ๋น๋ ค์ฃผ์์ผ๋ฏ๋ก answer ์ฆ๊ฐ
reserve[j] = -1; // ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์์ ๋ ์ด์ ๋น๋ ค์ค ์ ์์ผ๋ฏ๋ก -1๋ก ์ฒ๋ฆฌ
break; // ๋ ์ด์ ๋น๊ตํ ํ์ ์์
}
}
}
// 7. ์ต์ข
์ ์ผ๋ก ์ฒด์ก ์์
์ ์ฐธ์ฌํ ์ ์๋ ํ์ ์ ๋ฐํ
return answer;
}
์์ 6 - ์กฐ์ด์คํฑ
์กฐ์ด์คํฑ์ผ๋ก ์ํ๋ฒณ ์ด๋ฆ์ ์์ฑํ์ธ์. ๋งจ ์ฒ์์ A๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.ex) ์์ฑํด์ผ ํ๋ ์ด๋ฆ์ด ์ธ ๊ธ์๋ฉด AAA, ๋ค ๊ธ์๋ฉด AAAA์กฐ์ด์คํฑ์ ๊ฐ ๋ฐฉํฅ์ผ๋ก ์์ง์ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
โฒ - ๋ค์ ์ํ๋ฒณโผ - ์ด์ ์ํ๋ฒณ (A์์ ์๋์ชฝ์ผ๋ก ์ด๋ํ๋ฉด Z๋ก)โ - ์ปค์๋ฅผ ์ผ์ชฝ์ผ๋ก ์ด๋ (์ฒซ ๋ฒ์งธ ์์น์์ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ฉด ๋ง์ง๋ง ๋ฌธ์์ ์ปค์)โถ - ์ปค์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ (๋ง์ง๋ง ์์น์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ฉด ์ฒซ ๋ฒ์งธ ๋ฌธ์์ ์ปค์)
์๋ฅผ ๋ค์ด ์๋์ ๋ฐฉ๋ฒ์ผ๋ก "JAZ"๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
- ์ฒซ ๋ฒ์งธ ์์น์์ ์กฐ์ด์คํฑ์ ์๋ก 9๋ฒ ์กฐ์ํ์ฌ J๋ฅผ ์์ฑํฉ๋๋ค.- ์กฐ์ด์คํฑ์ ์ผ์ชฝ์ผ๋ก 1๋ฒ ์กฐ์ํ์ฌ ์ปค์๋ฅผ ๋ง์ง๋ง ๋ฌธ์ ์์น๋ก ์ด๋์ํต๋๋ค.- ๋ง์ง๋ง ์์น์์ ์กฐ์ด์คํฑ์ ์๋๋ก 1๋ฒ ์กฐ์ํ์ฌ Z๋ฅผ ์์ฑํฉ๋๋ค.๋ฐ๋ผ์ 11๋ฒ ์ด๋์์ผ "JAZ"๋ฅผ ๋ง๋ค ์ ์๊ณ , ์ด๋๊ฐ ์ต์ ์ด๋์ ๋๋ค.
๋ง๋ค๊ณ ์ ํ๋ ์ด๋ฆ name์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ด๋ฆ์ ๋ํด ์กฐ์ด์คํฑ ์กฐ์ ํ์์ ์ต์๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ๋ง๋์ธ์.
์ ํ ์ฌํญ
- name์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- name์ ๊ธธ์ด๋ 1 ์ด์ 20 ์ดํ์ ๋๋ค.
์ ์ถ๋ ฅ ์
name | return |
"JEROEN" | 56 |
"JAN" | 23 |
์์
- ๊ฐ ์ํ๋ฒณ์ ๋ง๋๋ ์ต์ ์กฐ์ ํ์์ ์ปค์ ์ด๋์ ์ต์๊ฐ์ ๊ณ ๋ คํ์ฌ ์ ์ฒด ์ต์ ์ด๋ ํ์๋ฅผ ๊ตฌํ๋ค. (์ปค์ ์ด๋์์๋ ์ผ์ชฝ/์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ๋์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ์ฌ, ์ฐ์๋ A๊ฐ ์๋ ๊ตฌ๊ฐ์ ๊ฑด๋๋ฐ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ๋ค.)
์์ค ์ฝ๋
package Algorithm_01_Greedy;
public class Q01_6_Joystick {
public static void main(String[] args) {
Q01_6_Joystick js = new Q01_6_Joystick();
System.out.println(js.solution("JEROEN")); // 56
System.out.println(js.solution("JAN")); // 23
System.out.println(js.solution("AAAA")); // 0
System.out.println(js.solution("ABABAAAAABA")); // 10
}
public int solution(String name) {
int answer = 0; // ์ด ์กฐ์ ํ์๋ฅผ ์ ์ฅํ ๋ณ์
int length = name.length(); // ์ด๋ฆ์ ๊ธธ์ด
int index = 0; // ์ปค์๋ฅผ ์ด๋ํ ์์น๋ฅผ ์ถ์ ํ๋ ๋ณ์
int move = length - 1; // ์ปค์ ์ด๋์ ์ต์๊ฐ์ ์ถ์ ํ๋ ๋ณ์
// 1. ๊ฐ ์ํ๋ฒณ์ ๋ง๋ค๊ธฐ ์ํ ์ต์ ์กฐ์ ํ์๋ฅผ ๋ํด์ค
for (int i = 0; i < length; i++) {
// ์ํ๋ฒณ์ ๋ง๋๋ ๋ฐ ๋๋ ์ต์ ์กฐ์ ํ์: ์๋ก ๊ฐ๋ ๋ฐฉ๋ฒ๊ณผ ์๋๋ก ๊ฐ๋ ๋ฐฉ๋ฒ ์ค ๋ ์์ ๊ฐ ์ ํ
answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
// 2. ์ผ์ชฝ์ผ๋ก ์ด๋ํ ์ ์๋ ์ฐ์๋ A๋ฅผ ์ฐพ์, ๊ทธ ๋ฒ์ ์์์ ์ด๋์ ์ต์ํ
index = i + 1;
// A๊ฐ ์ฐ์๋๋ ๊ตฌ๊ฐ์ ๊ฑด๋๋ฐ๊ธฐ ์ํด index๋ฅผ ์ฐพ์
while (index < length && name.charAt(index) == 'A') {
index++;
}
// 3. ์ด๋ ๊ฒฝ๋ก์์ ์ต์๊ฐ์ ๊ฐฑ์
// i * 2 + length - index๋ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๊ณ ๋์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ
move = Math.min(move, i * 2 + length - index);
// (length - index) * 2 + i๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๊ณ ๋์ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ
move = Math.min(move, (length - index) * 2 + i);
}
// 4. ์ํ๋ฒณ์ ๋ง๋๋ ์ต์ ํ์์ ์ปค์ ์ด๋์ ์ต์๊ฐ์ ํฉ์ฐํ์ฌ ๊ฒฐ๊ณผ ๋ฐํ
return answer + move;
}
}
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ ๋ฅผ ํ์ด๋ณธ ํ
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ ๋๋ฌด ์ด๋ ต๋ค. ํ์ง๋ง ํ ๊ฐ์ง ํฌ๋ง์ ์ธ ์ฌ์ค(?)์ ๋์๊ฒ๋ง ์ด๋ ค์ด ๊ฒ์ด ์๋๋ผ ๋จ๋ค์๊ฒ, ์ฐ๋ฆฌ ๋ชจ๋์๊ฒ ์ด๋ ต๋ค๋ ๊ฒ์ด๋ค. ์๋ฌด๋ ด, ์ต๊ณ ์ ์ํ์์ ๊ณผํ์๋ค์ด ๋ฐ๊ฒฌํ ๋์ ๋ฅผ ํธ๋ ๊ฑด๋ฐ, ์ฝ์ง ์์ ๊ฒ์ด๋ค. ๋ฌธ์ ์ ํ๋ณ๋ก ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ฅผ ์จ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐ ํ ์ง๋ฅผ ๋นจ๋ฆฌ ์บ์น ํ ์ค ์์์ผ ํ๋ค.
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฌ ์ํ์์ ์ต์ ์ ์ ํ์ ํ๋ ๋ฐฉ์์ด๋ค. ์ด ๋ฐฉ์์ด ์ ํตํ๋ ๋ฌธ์ ์ ๊ทธ๋ ์ง ์์ ๋ฌธ์ ๋ฅผ ์ง๊ฐ์ ์ผ๋ก ๊ตฌ๋ถํ ์ ์์ด์ผ ํ๋ค. ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST) ๋ฌธ์ , ๊ทธ๋ฆฌ๊ณ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ์ ๊ฒฝ์ฐ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ด ์ต์ ํด๋ฅผ ๋ณด์ฅํ๋ค.
๊ทธ๋ฌ๋ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ๋ฅผ ์ฌ์ฉํ๋ ์ต๋จ๊ฒฝ๋ก ๋ฌธ์ ๋ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ด ์ต์ ํด๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค. ์ด๋ฐ ๋ฌธ์ ๋ค์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(DP)์ด๋ ๋ฐฑํธ๋ํน ๋ฑ์ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก, ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ธ์๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋ํ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ฉด์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ฐ๋์ ๊ณ ๋ คํด์ผ ํ๋ค. ๋ณดํต ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ O(n) ๋๋ O(n log n)์ผ๋ก ํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก, ์๊ฐ ๋ณต์ก๋๊ฐ ์ค์ํ ๋ฌธ์ ์์ ํจ์จ์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํ๋ ๊ฒ๋ ์ค์ํ๋ค. ๊ทธ๋ฆฌ๋์ ํจ๊ป ์ฐ์ด๋ ์๋ฃ๊ตฌ์กฐ๋ก๋ ์ฐ์ ์์ ํ๋ ํ์ด๋ค.
GitHub: https://github.com/awesomepossumgirl/coding-test/tree/main/coding-test/src/Algorithm_01_Greedy
๋ฌธ์ ์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค https://school.programmers.co.kr/learn/courses/30/parts/12244