์ ๋ ฌ(Sort)
๊ฐ์
๋ฐ์ดํฐ๋ฅผ ์ค๋ฆ์ฐจ์ ๋๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ฐฐ์ดํ๊ฑฐ๋ ๋ฆฌ์คํธ์ ์์๋ฅผ ์ ๋ ฌํ๋ ๊ณผ์ ์ด๋ค.
์ ๋ ฌ์ ํ์ฉํ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ๋ ๋งค์ฐ ๋ค์ํ๋ค. ์ ๋ ฌ ๋ฌธ์ ๋ ๋ฌธ์ ๋ฅผ ํ ๋๋ ์ ๋ ฌ ๊ธฐ์ค์ ์ ํํ ํ์ ํ๊ณ , ๊ทธ์ ๋ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํ๋ค. ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ, ์ด์ง ํ์, ํฌ ํฌ์ธํฐ, ๋น๋์ ๊ณ์ฐ ๋ฑ ๋ค์ํ ๊ธฐ์ ์ ์กฐํฉํด ํด๊ฒฐํด์ผ ํ๋ ๋ฌธ์ ๋ค์ด ๋ง๋ค.
์ฃผ์ด์ง ์กฐ๊ฑด์ Arrays.sort() ๋ฅผ ์ด์ฉํด์ ์ ๋ ฌํด์ผ ํ๋ ๋ฌธ์ ๋ ์๊ณ , ์ ๋ ฌ ๊ธฐ์ค์ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด์ ๋ง๊ฒ ์ง์ ํด์ผ ํ๋ ๊ฒฝ์ฐ, Comparator ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ Collections.sort() ๋๋ Arrays.sort()์ ์ ๋ฌํ์ฌ ์ ๋ ฌํ๋ฉด ๋๊ณ , ์ด ๋ Java 8 ์ด์์์๋ Comparator๋ฅผ ๋๋ค ํํ์์ผ๋ก ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
[Java] ๋ฐฐ์ด ์ฌ์ฉ์์ ์ ์ ๋ ฌํ๋ ๋ฒ(๋ด๋ฆผ์ฐจ์, ๋๋ค์)
์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด ์ ๋ ฌํ ๋ ์ฐ๋ ๋ฉ์๋ `Arrays.sort()` ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๋ค. ํ์ง๋ง ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ์ ๋ `Arrays.sort()`์ `Comparator` ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์์ ๋ง์ถคํ ์ ๋ ฌ์
awesomepossum.tistory.com
โ ์ ๋ ฌ ๊ธฐ์ค
- ์ ๋ ฌ ๊ธฐ์ค์ ์ ํ์ ํ๊ณ , ์์ฃผ ๋์ค๋ ์กฐ๊ฑด์ ์ดํดํด์ผ ํ๋ค.
- ์๋ฅผ ๋ค์ด, "์ซ์๊ฐ ์์ ์์ผ๋ก ์ ๋ ฌ" ๋๋ "๋ฌธ์์ด ๊ธธ์ด๊ฐ ์งง์ ์์ผ๋ก ์ ๋ ฌ"๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ์ ํํ ์ฝ๊ณ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํ๋ค.
โ ์๊ฐ๋ณต์ก๋
- ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํ์ฌ ์ ๋ ฌ์ ์ํํ๋ค.
- ์ต์ ์ ๊ฒฝ์ฐ์๋ O(n log n)์ ์ฑ๋ฅ์ ๋ด๋ ์ ๋ ฌ์ ์ ํํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค.
โ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ์ ํ
- ๊ธฐ๋ณธ ์ ๋ ฌ: ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์ ๋๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ๋ฌธ์ .
- ์ด์ง ํ์: ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํน์ ๊ฐ์ ์ฐพ๋ ๋ฌธ์
- ๋ ์์ ํฉ: ๋ ์์ ํฉ์ด ํน์ ๊ฐ์ด ๋๋ ๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ๋ฌธ์ (ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ ํ์ฉ)
- ๋ฐฐ์ด์์ ์ค๋ณต๋ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ์ ๋ ฌํ๋ ๋ฌธ์
- ๋ค์ํ ์ ๋ ฌ ๊ธฐ์ค (Comparator ์ฌ์ฉ): ๊ฐ์ฒด์ ์ฌ๋ฌ ์์ฑ์ผ๋ก ์ ๋ ฌํ๋ ๋ฌธ์
- K๋ฒ์งธ ํฐ/์์ ์ ์ฐพ๊ธฐ: ๋ฐฐ์ด์์ K๋ฒ์งธ๋ก ํฐ ๋๋ ์์ ๊ฐ์ ์ฐพ๋ ๋ฌธ์
- ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ํฉ์ณ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ง๋๋ ๋ฌธ์
- ๋ฐฐ์ด์ ์ซ์ ๋น๋๋ฅผ ๊ณ์ฐํ๊ณ ๋น๋์๋๋ก ์ ๋ ฌํ๋ ๋ฌธ์
- ์๊ฐ/๋ ์ง ์ ๋ ฌ
์์ 1 - K๋ฒ์งธ์
๋ฐฐ์ด array์ i๋ฒ์งธ ์ซ์๋ถํฐ j๋ฒ์งธ ์ซ์๊น์ง ์๋ฅด๊ณ ์ ๋ ฌํ์ ๋, k๋ฒ์งธ์ ์๋ ์๋ฅผ ๊ตฌํ๋ ค ํฉ๋๋ค. ์๋ฅผ ๋ค์ด array๊ฐ [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3์ด๋ผ๋ฉด array์ 2๋ฒ์งธ๋ถํฐ 5๋ฒ์งธ๊น์ง ์๋ฅด๋ฉด [5, 2, 6, 3]์ ๋๋ค. 1์์ ๋์จ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ฉด [2, 3, 5, 6]์ ๋๋ค. 2์์ ๋์จ ๋ฐฐ์ด์ 3๋ฒ์งธ ์ซ์๋ 5์ ๋๋ค. ๋ฐฐ์ด array, [i, j, k]๋ฅผ ์์๋ก ๊ฐ์ง 2์ฐจ์ ๋ฐฐ์ด commands๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, commands์ ๋ชจ๋ ์์์ ๋ํด ์์ ์ค๋ช ํ ์ฐ์ฐ์ ์ ์ฉํ์ ๋ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด์ ๋ด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์
์ ํ ์กฐ๊ฑด
- array์ ๊ธธ์ด๋ 1 ์ด์ 100 ์ดํ์ ๋๋ค.
- array์ ๊ฐ ์์๋ 1 ์ด์ 100 ์ดํ์ ๋๋ค.
- commands์ ๊ธธ์ด๋ 1 ์ด์ 50 ์ดํ์ ๋๋ค.
- commands์ ๊ฐ ์์๋ ๊ธธ์ด๊ฐ 3์ ๋๋ค.
์ ์ถ๋ ฅ ์
array | commands | return |
[1, 5, 2, 6, 3, 7, 4] | [[2, 5, 3], [4, 4, 1], [1, 7, 3]] | [5, 6, 3] |
์์
- ์ฃผ์ด์ง ๋ฒ์(i, j)๋ก ๋ฐฐ์ด์ ์๋ฅด๊ณ , ๊ทธ ๋ถ๋ถ์ ๋ฐฐ์ด์ ์ ๋ ฌํ ๋ค, k๋ฒ์งธ ์ซ์๋ฅผ ๊ตฌํ๋ ์์ ์ ๋ฆฌ์คํธ ์ฌ๋ผ์ด์ฑ๊ณผ ์ ๋ ฌ์ ์ด์ฉํ์ฌ ์ฒ๋ฆฌํ๋ค.
์์ค์ฝ๋
package Algorithm_02_Sort;
import java.util.Arrays;
public class Q02_1_KthNumber {
public static void main(String[] args) {
// ํ
์คํธ ๋ฐ์ดํฐ
int[] array = { 1, 5, 2, 6, 3, 7, 4 };
int[][] commands = { { 2, 5, 3 }, // array[1:5] → {5,2,6,3} → ์ ๋ ฌ ํ {2,3,5,6} → 3๋ฒ์งธ ์ซ์๋ 5
{ 4, 4, 1 }, // array[3:4] → {6} → ์ ๋ ฌ ํ {6} → 1๋ฒ์งธ ์ซ์๋ 6
{ 1, 7, 3 } // array[0:7] → {1,5,2,6,3,7,4} → ์ ๋ ฌ ํ {1,2,3,4,5,6,7} → 3๋ฒ์งธ ์ซ์๋ 3
};
// solution ๋ฉ์๋ ์คํ
Q02_1_KthNumber solution = new Q02_1_KthNumber();
int[] result = solution.solution(array, commands);
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
System.out.println(Arrays.toString(result)); // [5, 6, 3]
}
public int[] solution(int[] array, int[][] commands) {
// ํ๋ก๊ทธ๋๋จธ์ค K๋ฒ์งธ ์
// 1. ๊ฒฐ๊ณผ๊ฐ ๋ด์์ค ์ ์ํ ๋ฐฐ์ด result ์ ์ธ
int[] result = new int[commands.length];
for (int i = 0; i < commands.length; i++) {
// 2. array ๋ฐฐ์ด ๋๋ฉด์ ๊ฐ commands ์์์
// i๋ฒ์งธ์ซ์, j๋ฒ์งธ์ซ์๋ฅผ ์ธ์๋ก ์ฌ๋ผ์ด์ฑ
// ์ฌ๋ผ์ด์ฑํ ๋ฐฐ์ด์ slicedArray์ ๋ด์์ค
int[] slicedArray = Arrays.copyOfRange(array, commands[i][0] - 1, commands[i][1]);
// 3. ์๋ฅธ ๋ฐฐ์ด ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
Arrays.sort(slicedArray);
// 4. result์ slicedArray์ k๋ฒ์งธ ์ซ์ ์ง์ด ๋ฃ๊ธฐ
result[i] = slicedArray[commands[i][2] - 1];
}
return result;
}
}
์์ 2 - ๊ฐ์ฅ ํฐ ์
0 ๋๋ ์์ ์ ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ ์๋ฅผ ์ด์ด ๋ถ์ฌ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ์๋ฅผ ์์๋ด ์ฃผ์ธ์. ์๋ฅผ ๋ค์ด, ์ฃผ์ด์ง ์ ์๊ฐ [6, 10, 2]๋ผ๋ฉด [6102, 6210, 1062, 1026, 2610, 2106]๋ฅผ ๋ง๋ค ์ ์๊ณ , ์ด์ค ๊ฐ์ฅ ํฐ ์๋ 6210์ ๋๋ค.
0 ๋๋ ์์ ์ ์๊ฐ ๋ด๊ธด ๋ฐฐ์ด numbers๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์์๋ฅผ ์ฌ๋ฐฐ์นํ์ฌ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ฌธ์์ด๋ก ๋ฐ๊พธ์ด return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์กฐ๊ฑด
- numbers์ ๊ธธ์ด๋ 1 ์ด์ 100,000 ์ดํ์ ๋๋ค.
- numbers์ ์์๋ 0 ์ด์ 1,000 ์ดํ์ ๋๋ค.
- ์ ๋ต์ด ๋๋ฌด ํด ์ ์์ผ๋ ๋ฌธ์์ด๋ก ๋ฐ๊พธ์ด return ํฉ๋๋ค.
์ ์ถ๋ ฅ ์
numbers | return |
[6, 10, 2] | "6210" |
[3, 30, 34, 5, 9] | "9534330" |
์์
- ์ฃผ์ด์ง ์ซ์๋ค์ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๊ณ , ๋ ์ซ์์ ์กฐํฉ์ด ๋ ํฐ ๊ฐ์ ๋ง๋ค๋๋ก ์ ๋ ฌ ๊ธฐ์ค์ ์ฌ์ฉ์ ์ ์ํ์ฌ ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ง๋ ๋ค. ์ซ์๋ค๋ผ๋ฆฌ ๊ฒฐํฉํ์ ๋ ๋ ํฐ ๊ฐ์ ๋ง๋๋ ์์๋๋ก ์ ๋ ฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ด์ด๋ถ์ด๋ฉด ๋๋ค.
์์ค ์ฝ๋
package Algorithm_02_Sort;
import java.util.Arrays;
public class Q02_2_maximumNumber {
public static void main(String[] args) {
// ํ
์คํธ ๋ฐ์ดํฐ
String[] arr1 = { "3", "30", "34", "5", "9" };
String[] arr2 = { "10", "2" };
String[] arr3 = { "0", "0", "0" }; // ์์ธ ์ผ์ด์ค: "000" → "0"์ผ๋ก ์ฒ๋ฆฌ ํ์
String[] arr4 = { "1", "20", "23", "4", "8" };
// ํ
์คํธ ์คํ
System.out.println(getLargestNumber(arr1)); // 9534330
System.out.println(getLargestNumber(arr2)); // 210
System.out.println(getLargestNumber(arr3)); // 0
System.out.println(getLargestNumber(arr4)); // 8423201
}
public static String getLargestNumber(String[] arr) {
// ํ๋ก๊ทธ๋๋จธ์ค ๊ฐ์ฅ ํฐ ์
// ๋ฌธ์์ด ์ ๋ ฌ (๋ด๋ฆผ์ฐจ์, o2+o1๊ณผ o1+o2๋ฅผ ๋น๊ต)
Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
// ์์ธ ์ฒ๋ฆฌ: ๋ฐฐ์ด์ด "0"์ผ๋ก๋ง ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ → "0" ๋ฐํ
if (arr[0].equals("0"))
return "0";
// ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ํ๋์ ๋ฌธ์์ด๋ก ๊ฒฐํฉ
StringBuilder result = new StringBuilder();
for (String str : arr) {
result.append(str);
}
return result.toString();
}
}
์์ 3 - H-Index
H-Index๋ ๊ณผํ์์ ์์ฐ์ฑ๊ณผ ์ํฅ๋ ฅ์ ๋ํ๋ด๋ ์งํ์ ๋๋ค. ์ด๋ ๊ณผํ์์ H-Index๋ฅผ ๋ํ๋ด๋ ๊ฐ์ธ h๋ฅผ ๊ตฌํ๋ ค๊ณ ํฉ๋๋ค. ์ํค๋ฐฑ๊ณผ1์ ๋ฐ๋ฅด๋ฉด, H-Index๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํฉ๋๋ค.
์ด๋ค ๊ณผํ์๊ฐ ๋ฐํํ ๋ ผ๋ฌธ nํธ ์ค, h๋ฒ ์ด์ ์ธ์ฉ๋ ๋ ผ๋ฌธ์ด hํธ ์ด์์ด๊ณ ๋๋จธ์ง ๋ ผ๋ฌธ์ด h๋ฒ ์ดํ ์ธ์ฉ๋์๋ค๋ฉด h์ ์ต๋๊ฐ์ด ์ด ๊ณผํ์์ H-Index์ ๋๋ค. ์ด๋ค ๊ณผํ์๊ฐ ๋ฐํํ ๋ ผ๋ฌธ์ ์ธ์ฉ ํ์๋ฅผ ๋ด์ ๋ฐฐ์ด citations๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ด ๊ณผํ์์ H-Index๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์กฐ๊ฑด
- ๊ณผํ์๊ฐ ๋ฐํํ ๋ ผ๋ฌธ์ ์๋ 1ํธ ์ด์ 1,000ํธ ์ดํ์ ๋๋ค.
- ๋ ผ๋ฌธ๋ณ ์ธ์ฉ ํ์๋ 0ํ ์ด์ 10,000ํ ์ดํ์ ๋๋ค.
์ ์ถ๋ ฅ ์
citations | return |
[3, 0, 6, 1, 5] | 3 |
์์
- ๋ ผ๋ฌธ๋ค์ ์ธ์ฉ ํ์๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๋ค, ๊ฐ ๋ ผ๋ฌธ์ ๋ํด ์ธ์ฉ ํ์๊ฐ ๊ทธ ์์น๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์์ง๋ฅผ ์ฒดํฌํ์ฌ ์ต๋ h๊ฐ์ ์ฐพ์๋ด๋ ๋ฐฉ์์ผ๋ก H-Index๋ฅผ ๊ตฌํ๋ค.
์์ค ์ฝ๋
package Algorithm_02_Sort;
import java.util.Arrays;
public class Q02_3_HIndex {
public static void main(String[] args) {
// ํ
์คํธ ๋ฐ์ดํฐ
int[] citations1 = {3, 0, 6, 1, 5}; // ์์ ๊ฒฐ๊ณผ: 3
int[] citations2 = {10, 8, 5, 4, 3}; // ์์ ๊ฒฐ๊ณผ: 4
int[] citations3 = {25, 8, 5, 3, 3}; // ์์ ๊ฒฐ๊ณผ: 3
int[] citations4 = {0, 0, 0, 0, 0}; // ์์ ๊ฒฐ๊ณผ: 0
int[] citations5 = {6, 6, 6, 6, 6}; // ์์ ๊ฒฐ๊ณผ: 5
// solution ๋ฉ์๋ ์คํ
Q02_3_HIndex solution = new Q02_3_HIndex();
System.out.println(solution.solution(citations1)); // 3
System.out.println(solution.solution(citations2)); // 4
System.out.println(solution.solution(citations3)); // 3
System.out.println(solution.solution(citations4)); // 0
System.out.println(solution.solution(citations5)); // 5
}
public int solution(int[] citations) {
// ํ๋ก๊ทธ๋๋จธ์ค H-INDEX
// ๊ฒฐ๊ณผ๊ฐ ๋ด์ ์ ์ํ ๋ณ์ ์ด๊ธฐํ
int answer = 0;
// ๋ฐฐ์ด ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
Arrays.sort(citations);
// ๋ฐฐ์ด ์ํํ์ฌ H-Index ์ฐพ๊ธฐ
for (int i = 0; i < citations.length; i++) {
// ๋จ์ ๋
ผ๋ฌธ์ ์
int h = citations.length - i;
// ํ์ฌ ์ธ์ฉ๋ ๋
ผ๋ฌธ ์๊ฐ h ์ด์์ด๋ฉด H-Index ๊ฐฑ์
if (citations[i] >= h) {
answer = h;
break;
}
}
return answer;
}
}
์์ 4 - ๋ ์์ ํฉ์ด ํน์ ๊ฐ์ด ๋๋ ๊ฒฝ์ฐ (ํฌ ํฌ์ธํฐ ๊ธฐ๋ฒ)
์ฃผ์ด์ง ๋ฐฐ์ด์์ ๋ ์์ ํฉ์ด ํน์ ๊ฐ์ด ๋๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์ผ๋ผ.
์์ค ์ฝ๋
Arrays.sort(arr); // ๋จผ์ ๋ฐฐ์ด์ ์ ๋ ฌ
int left = 0, right = arr.length - 1;
while (left < right) {
int sum = arr[left] + arr[right];
if (sum == target) {
System.out.println(left + ", " + right);
break;
} else if (sum < target) {
left++;
} else {
right--;
}
}
์์ 5 - ๋ฐฐ์ด์์ ์ค๋ณต์ ์ ๊ฑฐํ ํ ์ ๋ ฌ
๋ฐฐ์ด์์ ์ค๋ณต๋ ์์๋ฅผ ์ ๊ฑฐํ๊ณ , ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ผ.
์์ค ์ฝ๋
int[] arr = {5, 2, 9, 1, 5, 6};
Set<Integer> uniqueElements = new HashSet<>();
for (int num : arr) {
uniqueElements.add(num);
}
int[] result = uniqueElements.stream().mapToInt(Integer::intValue).toArray();
Arrays.sort(result);
์์ 6 - ์ ๋ ฌ ๊ธฐ์ค์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ (Comparator ์ฌ์ฉ)
ํ์ ๊ฐ์ฒด๋ค์ ์ ์ ์์ผ๋ก ์ ๋ ฌํ๋, ์ ์๊ฐ ๊ฐ์ผ๋ฉด ์ด๋ฆ์ ์ํ๋ฒณ ์์ผ๋ก ์ ๋ ฌํ๋ผ.
์์ค ์ฝ๋
import java.util.*;
class Student {
String name;
int score;
Student(String name, int score) {
this.name = name;
this.score = score;
}
}
public class Main {
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("Alice", 90),
new Student("Bob", 80),
new Student("Charlie", 90)
);
students.sort(Comparator.comparingInt((Student s) -> s.score)
.thenComparing(s -> s.name));
for (Student student : students) {
System.out.println(student.name + ": " + student.score);
}
}
}
์์ 7 - ๋ ๋ฐฐ์ด ํฉ์น๊ธฐ
๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ํฉ์ณ ํ๋์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ง๋ค๋ผ.
์์ค ์ฝ๋
int[] arr1 = {1, 3, 5};
int[] arr2 = {2, 4, 6};
int[] result = new int[arr1.length + arr2.length];
int i = 0, j = 0, k = 0;
while (i < arr1.length && j < arr2.length) {
if (arr1[i] < arr2[j]) {
result[k++] = arr1[i++];
} else {
result[k++] = arr2[j++];
}
}
while (i < arr1.length) {
result[k++] = arr1[i++];
}
while (j < arr2.length) {
result[k++] = arr2[j++];
}
์์ 8 - ์์ฃผ ๋ฑ์ฅํ๋ ์ซ์ ์ฐพ๊ธฐ (๋น๋์ ์ ๋ ฌ)
๋ฐฐ์ด์์ ์์ฃผ ๋ฑ์ฅํ๋ ์ซ์ ์์ผ๋ก ์ ๋ ฌํ๋ผ.
* ๋ฐฐ์ด์์ ๊ฐ ์ซ์๊ฐ ๋ช ๋ฒ ๋ฑ์ฅํ๋์ง ๊ตฌํ๊ณ , ๊ทธ ๋น๋์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ๋ฌธ์ ์ด๋ค. ์ด ๋ฌธ์ ๋ Map์ ํ์ฉํ์ฌ ๊ฐ ์ซ์์ ๋น๋๋ฅผ ๊ตฌํ๊ณ , ๋น๋์๋๋ก ์ ๋ ฌํ๋ค.
์์ค ์ฝ๋
import java.util.*;
public class Main {
public static void main(String[] args) {
int[] arr = {3, 1, 2, 3, 1, 3, 2, 1};
Map<Integer, Integer> freqMap = new HashMap<>();
for (int num : arr) {
freqMap.put(num, freqMap.getOrDefault(num, 0) + 1);
}
List<Map.Entry<Integer, Integer>> list = new ArrayList<>(freqMap.entrySet());
list.sort((entry1, entry2) -> entry2.getValue() - entry1.getValue());
for (Map.Entry<Integer, Integer> entry : list) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
์์ 9 - ์๊ฐ์ด๋ ๋ ์ง ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ธฐ (์๊ฐ/๋ ์ง ์ ๋ ฌ)
์ฃผ์ด์ง ๋ ์ง ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ผ.
*LocalDateTime ๋๋ SimpleDateFormat ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ง๋ ์๊ฐ์ ์ฒ๋ฆฌํ๋ค.
์์ค ์ฝ๋
import java.time.LocalDate;
import java.util.*;
public class Main {
public static void main(String[] args) {
LocalDate[] dates = {
LocalDate.of(2022, 3, 1),
LocalDate.of(2021, 5, 12),
LocalDate.of(2023, 1, 25)
};
Arrays.sort(dates);
for (LocalDate date : dates) {
System.out.println(date);
}
}
}
์ ๋ ฌ ์์ ๋ฅผ ํ์ด๋ณธ ํ
์๋ฐ์์ ์ ๋ ฌ์ ๊ตฌํํ ๋, ๋๋ถ๋ถ ๊ฐ์ฒด ๋ฐฐ์ด ํ์์ผ๋ก ๋์ค๋๋ฐ ์ด ๋ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ฅผ ์ ๋ ฌํ๋ ค๋ฉด Comparator๋ฅผ ์ ํ์ฉํด์ผ ํ๋ค.
Arrays.sort(array, new Comparator<YourClass>() {
@Override
public int compare(YourClass o1, YourClass o2) {
return Integer.compare(o1.getValue(), o2.getValue());
}
});
์๋ฐ 8๋ถํฐ ์ ๊ณต๋๋ Lambda ํํ์์ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ํน์ ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ๋ Comparator๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๊ตฌํํ ์ ์๋ค.
Arrays.sort(array, (o1, o2) -> Integer.compare(o1.getValue(), o2.getValue()));
์ ๋ ฌ ๊ธฐ์ค์ ํ์คํ ํ์. ๋ฌธ์ ์์ ์๊ตฌํ๋ ์ ๋ ฌ ๊ธฐ์ค์ด ๋ฌด์์ธ์ง ์ ํํ๊ฒ ํ์ ํ๊ณ , Comparator๋ Comparable์ ์ ์ ํ ์ฌ์ฉํ์. ์ด ๋ ์์ฃผ ๋ฐ์ํ๋ ์ค์๋ ์ค๋ฆ์ฐจ์์ธ์ง ๋ด๋ฆผ์ฐจ์์ธ์ง ํท๊ฐ๋ฆฌ๋ ๊ฒ์ด๋ค. ํ๋ก๊ทธ๋๋ฐ์์ ๋ํดํธ๋ ์ค๋ฆ์ฐจ์์ด๊ธฐ ๋๋ฌธ์, ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ ํ ๋๋ Comparator.reverseOrder()๋ Collections.reverseOrder()๋ฅผ ์จ์ ์ ๋ ฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ ๋, ์ค๋ณต๋ ๊ฐ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ณต์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ๋ ๊ฒฝ์ฐ๋, HashSet์ ์ฌ์ฉํ๋๋ฐ ์ด ๋ ๋จผ์ ์ค๋ณต์ ์ ๊ฑฐํ๊ฑฐ๋, ์ ๋ ฌ ํ ์ค๋ณต์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ณต๋ถํ๋ค ๋ณด๋ Stream API๋ก ์ ๋ ฌํ๋ ๋ฒ๋ ์๊ฒ ๋์๋ค.
์๋๋ ์ฝํ ๋ฌธ์ ํ๋ฉด์ ๋ค๋ฅธ ๋ถ๋ค์ด Stream ์ผ๋ก ์ ๋ ฌํ ๊ฑธ ๋ณด๊ณ , ์คํธ๋ฆผ์ผ๋ก ์ ๋ ฌํ๋ ๋ฒ์ ์ฐพ์์ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค. ์ ๋ฆฌ๋ฅผ ๋ค ํ๊ณ ๋์ ์๋ฃ ์กฐ์ฌ๋ฅผ ์ข ๋ ํด ๋ณด๋,
โญStream API๋ฅผ ์ด์ฉํ ์ ๋ ฌ์ ์๋๊ฐ ๋๋ฌด ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฝ๋ฉํ ์คํธ์์๋ ํผํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.โญ
Stream์ผ๋ก ์ ๋ ฌํ๋ ๋ฒ
Stream์ ํ์ฉํ๋ฉด ์ ๋ ฌ๋ฟ๋ง ์๋๋ผ ํํฐ๋ง, ๋งคํ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ์ฒด์ด๋ํ์ฌ ๊น๋ํ ์ฝ๋๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ํ์ง๋ง ์ด ๋ ์ฃผ์ ํ ์ ์ ์คํธ๋ฆผ์์ ์ ๋ ฌ์ ํ๊ณ ๋์ ํ์์ ๋ฐ๋ผ ๋ค์ ํ๋ณํ์ ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ค๋ฆ์ฐจ์
List<YourClass> list = Arrays.asList(new YourClass(3), new YourClass(1), new YourClass(2));
list = list.stream()
.sorted(Comparator.comparing(YourClass::getValue)) // YourClass์ getValue() ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
.collect(Collectors.toList());
๋ด๋ฆผ์ฐจ์
List<YourClass> list = Arrays.asList(new YourClass(3), new YourClass(1), new YourClass(2));
list = list.stream()
.sorted(Comparator.comparing(YourClass::getValue).reversed()) // ์ค๋ฆ์ฐจ์์ ๋ฐ์ ์์ผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
.collect(Collectors.toList());
Comparator.comparing ๋์ ๋๋ค ํํ์์ผ๋ก ์ ๋ ฌํ๊ธฐ
List<YourClass> list = Arrays.asList(new YourClass(3), new YourClass(1), new YourClass(2));
list = list.stream()
.sorted((o1, o2) -> Integer.compare(o1.getValue(), o2.getValue())) // ๋๋ค ํํ์์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
.collect(Collectors.toList());
Stream์ ์ ๋ ฌํ ํ ๋ฐํ๋๋ ๊ฒฐ๊ณผ๋ Stream ํ์
์ด๋ค. ์ฆ, ์ ๋ ฌ ์์
์ ์คํธ๋ฆผ์์ ์ํํ ํ์๋, ๊ทธ ๊ฒฐ๊ณผ ์ญ์ ์คํธ๋ฆผ ๊ฐ์ฒด๋ก ๋ฐํ๋๋ค. ์ด๊ฑธ ํ์์ ๋ฐ๋ผ ์ปฌ๋ ์
ํ์
(๋ฆฌ์คํธ, ๋ฐฐ์ด ๋ฑ)์ผ๋ก ๋ณํํ๋ ค๋ฉด collect()๋ toArray() ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ฌ ํ ์ค๋ณต์ ์ ๊ฑฐํ๋ ค๋ฉด Set ํ์
์ผ๋ก ๋ณํํด์ผ ํ๋๋ฐ ์ค๋ณต์ ์ ๊ฑฐํ๋ ํน์ฑ์ ๊ฐ์ง HashSet์ ์ฌ์ฉํ๋ค.
Stream → List๋ก ๋ณํํ๊ธฐ: collect(Collectors.toList())
// ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ ๋ฆฌ์คํธ๋ก ๋ณํ
List<YourClass> sortedList = list.stream()
.sorted(Comparator.comparing(YourClass::getValue))
.collect(Collectors.toList()); // ๋ฆฌ์คํธ๋ก ๋ณํ
System.out.println("์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ ๋ฆฌ์คํธ: " + sortedList);
Stream → ๋ฐฐ์ด๋ก ๋ณํํ๊ธฐ: toArray()
์ด ๋, (YourClass[]::new์ ๊ฐ์ด ๋ฐฐ์ด์ ํ์ ์ ์ง์ ํด์ผ ํ๋ค)
// ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ ๋ฐฐ์ด๋ก ๋ณํ
YourClass[] sortedArray = list.stream()
.sorted(Comparator.comparing(YourClass::getValue))
.toArray(YourClass[]::new); // ๋ฐฐ์ด๋ก ๋ณํ
System.out.println("์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ ๋ฐฐ์ด: " + Arrays.toString(sortedArray));
Stream → Set์ผ๋ก ๋ณํํ๊ธฐ: collect(Collectors.toSet())
// ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ Set์ผ๋ก ๋ณํ (์ค๋ณต ์ ๊ฑฐ)
Set<YourClass> sortedSet = list.stream()
.sorted(Comparator.comparing(YourClass::getValue))
.collect(Collectors.toSet()); // Set์ผ๋ก ๋ณํ
System.out.println("์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ Set: " + sortedSet);
GitHub: https://github.com/awesomepossumgirl/coding-test/tree/main/coding-test/src/Algorithm_02_Sort
๋ฌธ์ ์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค https://school.programmers.co.kr/learn/courses/30/parts/12244
์๋๋ ์ง์ ์ ๋ฆฌํ๋ ค๊ณ ํ์ผ๋, ์ ์ ๋ฆฌ๋ ๊ธ์ ์คํฌ๋ฉ ํด ์์ต๋๋ค.
โ๏ธ์ฝ์ ์ ๋ ฌ
[์๊ณ ๋ฆฌ์ฆ] ์ฝ์ ์ ๋ ฌ(insertion Sort) - JAVA(์๋ฐ)
์ฝ์ ์ ๋ ฌ(insertion Sort) 2๋ฒ์งธ ์์๋ถํฐ n๋ฒ์งธ๊น์ง ๊ทธ ์ด์ ์ ์๋ ์์๋ค๊ณผ ๋น๊ตํ๋ฉฐ ์ฝ์ ํ ์์น๋ฅผ ์ฐพ์ ์ ๋ ฌํ๋ค. 2๋ฒ์งธ๋ถํฐ ์ฐจ๋ก๋๋ก ์ด์ ์ ์๋ ์์๋ค๊ณผ ๋น๊ตํ๋ค. ๋น๊ตํ ๋, ์ด์ ์ ์๋
chobo24.tistory.com
์๋ฐ [JAVA] - ์ฝ์ ์ ๋ ฌ (Insertion Sort)
[์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋ชจ์] ๋๋ณด๊ธฐ 1. ๊ณ์ ์ ๋ ฌ (Counting Sort) 2. ์ ํ ์ ๋ ฌ (Selection Sort) 3. ์ฝ์ ์ ๋ ฌ (Insertion Sort) - [ํ์ฌ ํ์ด์ง] 4. ๊ฑฐํ ์ ๋ ฌ (Bubble Sort) 5. ์ ธ ์ ๋ ฌ (Shell Sort) 6. ํ ์ ๋ ฌ (Heap Sort) 7. ํฉ๋ณ(
st-lab.tistory.com
โ๏ธ์ ํ์ ๋ ฌ
[์๊ณ ๋ฆฌ์ฆ] ์ ํ์ ๋ ฌ(Selection Sort) - Java(์๋ฐ)
์ ํ์ ๋ ฌ(Selection Sort) ์์๋ฅผ ๋ฃ์ ์์น๋ฅผ ์ด๋ฏธ ์ ํ๊ณ , ๊ทธ ์์น์ ์ต์๊ฐ์ ์ฐพ์์ ๋ฃ๋ ์ ๋ ฌ ๋ฐฉ๋ฒ์ด๋ค. ์ฒซ๋ฒ์งธ ์์น์๋ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ๋น๊ตํ ๋ค, ์ต์๊ฐ์ ๊ทธ์๋ฆฌ์ ๋ฃ๋๋ค. ๋๋ฒ์งธ ์
chobo24.tistory.com
โ๏ธ๋ฒ๋ธ์ ๋ ฌ
[์๊ณ ๋ฆฌ์ฆ] ๋ฒ๋ธ์ ๋ ฌ(Bubble Sort) - JAVA(์๋ฐ)
๋ฒ๋ธ์ ๋ ฌ(Bubble Sort) ๊ฑฐํ์ ๋ ฌ์ด๋ผ๊ณ ๋ ํ๋ฉฐ, ์ธ์ ํ ๋ ์์๋ฅผ ๋น๊ตํ๋ฉฐ ์ ๋ ฌํ๋ค. ์ฒ์๋ถํฐ ์ธ์ ํ ๋ ์์์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ๋ค. ๋ ์์ ์๋ ์์๊ฐ ํฌ๋ค๋ฉด ์๋ฆฌ๋ฅผ ๋ฐ๊พผ๋ค. (์๋๋ผ๋ฉด ๊ทธ๋๋
chobo24.tistory.com
โ๏ธ๋ณํฉ ์ ๋ ฌ
[์๊ณ ๋ฆฌ์ฆ] ํฉ๋ณ์ ๋ ฌ(Merge Sort) - JAVA
ํฉ๋ณ์ ๋ ฌ(Merge Sort) ์ฃผ์ด์ง ๋ฐฐ์ด ๋๋ ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 1์ด ๋ ๋๊น์ง ๋ถํ ํ ๋ค, ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ฉด์ ํฉ์น๋ ์ ๋ ฌ์ด๋ค. ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 1์ด ๋ ๋(ํ๋์ ์์๋ง ๊ฐ์ง ์ํ)๊น์ง ๋ถํ ํ๋ค. - ๋ถ
chobo24.tistory.com
โ๏ธํต์ ๋ ฌ
[์๊ณ ๋ฆฌ์ฆ] ํต ์ ๋ ฌ(Quick Sort) - JAVA(์๋ฐ)
ํต ์ ๋ ฌ(Quick Sort) ๊ธฐ์ค ๊ฐ์ ์ ํ๊ณ ๊ทธ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์ ๊ฐ๊ณผ ํฐ ๊ฐ์ผ๋ก ๋ถ๋ถ๋ฆฌ์คํธ๋ฅผ ๋ถํ ํ๊ณ ์ ๋ ฌํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ ๋ค, ๋ถ๋ถ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 1์ด ๋๋ฉด ํฉ์น๋ ์ ๋ ฌ์ด๋ค. ๊ธฐ์ค ๊ฐ(pivot)์
chobo24.tistory.com
โ๏ธํ์ ๋ ฌ
[์๊ณ ๋ฆฌ์ฆ] ํ ์ ๋ ฌ(heap sort)์ด๋ - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
โ๏ธ์ด์ง ํ์
[์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์(Binary Search) - JAVA(์๋ฐ)
์ด์ง ํ์(Binary Search) ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ์ฐพ๋ ๊ฐ๊ณผ ์ค๊ฐ๊ฐ์ ๋น๊ต, ์ค๊ฐ๊ฐ๋ณด๋ค ์๋ค๋ฉด ์ฒ์~์ค๊ฐ๊ฐ์ด์ , ํฌ๋ค๋ฉด ์ค๊ฐ๊ฐ์ดํ~๋ง์ง๋ง์ผ๋ก ๋ฒ์๋ฅผ ์ขํ๊ณ ํ์ํ๋ค๊ฐ ์ค๊ฐ๊ฐ์ด ์ฐพ๋๊ฐ์ด ๋ ๋๋ฅผ ์ฐพ
chobo24.tistory.com
โ๏ธํฌํฌ์ธํฐ
[์๊ณ ๋ฆฌ์ฆ] ํฌ ํฌ์ธํฐ(Two Pointer) - JAVA(์๋ฐ)
ํฌ ํฌ์ธํฐ(Two Pointer) ๋ฐฐ์ด ๋๋ ๋ฆฌ์คํธ์์ ๋๊ฐ์ ํฌ์ธํฐ์ ์์น๋ฅผ ๊ธฐ๋กํด๊ฐ๋ฉด์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ (2๊ฐ์ง ๋ฐฉ๋ฒ์กด์ฌ) ์์ํ ๋, ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ์ฒ์ ์ธ๋ฑ์ค์ ๋ง์ง๋ง์ธ๋ฑ์ค
chobo24.tistory.com
โ๏ธ Comparable์ Comparator ์ฐจ์ด
Java ์ฝ๋ฉ ํ ์คํธ ์ค๋น - ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ, Comparable์ Comparator
์๋ฐ์์๋ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๊ณ , ํนํ ์ข ๋ณต์กํ ์ ๋ ฌ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ์ด๋ ต๊ธฐ๋ ํ๋ค... ๋ฐ๋ผ์ ์ด์ ๋ํด ์ ์์๋ ํ์๊ฐ ์๋ค.
velog.io
โ๏ธ ์ฝ๋ฉํ ์คํธ์์ Stream ์ฐ์ง ๋ง์ธ์
[Java] Stream์ ์ ์กด์ฌํ ๊น? (feat.์ฝํ ์์ Stream ์ฐ์ง ๋ง์ธ์)
Stream์ ์๊ณ ์ฐ์
velog.io