ํ ๋ฒ๋ง ๋ฑ์ฅํ ๋ฌธ์ - Java [ํ๋ก๊ทธ๋๋จธ์ค ์ ๋ฌธ]
โค๏ธ Problem
- ๋ฌธ์
๋ฌธ์์ด s๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. s์์ ํ ๋ฒ๋ง ๋ฑ์ฅํ๋ ๋ฌธ์๋ฅผ ์ฌ์ ์์ผ๋ก ์ ๋ ฌํ ๋ฌธ์์ด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด๋ณด์ธ์. ํ ๋ฒ๋ง ๋ฑ์ฅํ๋ ๋ฌธ์๊ฐ ์์ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ return ํฉ๋๋ค.
- ์ ํ ์ฌํญ
- 0 < s์ ๊ธธ์ด < 1,000
- s๋ ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ์ ์ถ๋ ฅ ์ & ์ค๋ช
no | s | result |
1 | "abcabcadc" | "d" |
2 | "abdc" | "abcd" |
3 | "hello" | "eho" |
- "abcabcadc"์์ ํ๋๋ง ๋ฑ์ฅํ๋ ๋ฌธ์๋ "d"์ ๋๋ค.
- "abdc"์์ ๋ชจ๋ ๋ฌธ์๊ฐ ํ ๋ฒ์ฉ ๋ฑ์ฅํ๋ฏ๋ก ์ฌ์ ์์ผ๋ก ์ ๋ ฌํ "abcd"๋ฅผ return ํฉ๋๋ค.
- "hello"์์ ํ ๋ฒ์ฉ ๋ฑ์ฅํ ๋ฌธ์๋ "heo"์ด๊ณ ์ด๋ฅผ ์ฌ์ ์์ผ๋ก ์ ๋ ฌํ "eho"๋ฅผ return ํฉ๋๋ค.
๐ Solution
ํ์ด
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public String solution(String s) {
StringBuffer sb = new StringBuffer();
String[] trans = s.split("");
ArrayList<String> arr = new ArrayList<>();
for (int i=0; i<trans.length; i++) {
if(!arr.contains(trans[i])) {
arr.add(trans[i]);
}
}
Collections.sort(arr);
for(int i=0; i<arr.size(); i++) {
String tmp = arr.get(i);
if(s.indexOf(tmp) == s.lastIndexOf(tmp)) {
sb.append(tmp);
}
}
return sb.toString();
}
}
์ฒ๋ฆฌ์๋๋ฅผ ๋ ๋น ๋ฅด๊ฒ ํ ์๋ ์์๊น?
๐ Comment
"ํ ๋ฒ๋ง ๋ฑ์ฅํ๋ค"๋ผ๋ ๊ฐ๋ ์ด ์๊ฐ๋ณด๋ค ์ฝ๋ ๊ตฌํ๋๋ ๊ฒ ์ด๋ ค์ ๋ ๋ฌธ์ . ๋๋ ์ด ๊ฐ๋ ์ "์ฌ๋ฌ ๋ฒ ๋ํ๋๋ ๋ฌธ์์ด์ ๋ฐฐ์ ํ๋ค"๋ผ๊ณ ์ดํดํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฌ๋ฌ ๋ฒ ๋ํ๋๋ ๊ฒ์ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น?
์ฝ๋๋ฅผ ์ง๋ค๋ณด๋ฉด ์๊ฐ๋ณด๋ค ๋ด๊ฐ ์ฌ์ฉํ๋ ์ธ๊ฐ์ ์ธ(?) ์ฒ๋ฆฌ๋ฐฉ์์ผ๋ก๋ ๊ตฌํ์ด ํ๋ค ๋๊ฐ ๋ง์๋ค. ์ธ๊ฐ์ ์ ์ฅ์์ "์ฌ๋ฌ ๋ฒ ๋ฑ์ฅํ๋ ๊ฒ"์ ๊ตฌ๋ถํ๋ค ์น๋ฉด ์ค๋ณต๋๋ ๋ฌธ์์ด์ ๊ฐ์๋ฅผ ์ธ๋ฉด ๊ทธ๋ง์ธ๋ฐ, ์ด๊ฑธ ํ๋ก๊ทธ๋๋ฐํ๋ ค๋ ๋พฐ์กฑํ ์๊ฐ ๋ ์ค๋ฅด์ง ์์๋ค๐ฅ
ํ์ฐธ์ ๊ณ ๋ฏผํ๋ค๊ฐ ๋ฌธ๋ ๋ ์๊ฐ์ด "๋ฌธ์์ด์์ ๋์ผํ ๋ฌธ์์ด์ด ์ฌ๋ฌ ๋ฒ ๋ฑ์ฅํ๋ค๋ฉด, ์ฒซ ์ธ๋ฑ์ค ๋ฒํธ์ ๋ง์ง๋ง ์ธ๋ฑ์ค ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ ๊ฒ ๊ฐ๋ค"๋ ๊ฒ์ด์๋ค.
- ๋งจ ์ฒ์ ๊ฒ์ฌํ ๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ์ชผ๊ฐ๋ ๋ค, ๊ฒ์ฌ ๊ธฐ์ค์ด ๋ ArrayList์ ์ค๋ณต์์ด ์ชผ๊ฐ๋์ ๋ฌธ์์ด ๊ฐ์ ๋ฃ๋๋ค.
- ArrayList์ ์๋ ๋ฌธ์์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
- ๊ฒ์ฌํ ๋ฌธ์์ด์์ ArrayList์ ๊ฐ ๋ฌธ์์ด์ด ๋ฑ์ฅํ๋ ์ฒซ ์ธ๋ฑ์ค ๋ฒํธ์ ๋ง์ง๋ง ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ๋์กฐํ์ฌ ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ํด๋น ArrayList์ ๋ฌธ์์ด ๊ฐ์ StringBuffer์ ์ฝ์ ํ๋ค.
์ฒ๋ฆฌ ์๋๋ ์๊ฐํ๋ ๊ฒ๋งํผ ๋น ๋ฅด์ง ๋ชปํ์ง๋ง, ๋ค๋ฅธ ๋ต์ํ๊ณ ๋น๊ตํ์ ๋๋ ๋น ๋ฅธ ํธ์ ์ํ๋ฏ๋ก ์ผ๋จ์ ๋ง์กฑํ๊ธฐ๋ก ํ๋ค. ์ถํ์ ๊ณต๋ถํ๋ฉด์ ๋ณด์ํ ์ ์๋ ๋ถ๋ถ์ ๋ณด์ํ์!
์ค๋์ ArrayList์ ์ ๋ ฌ ๋ฉ์๋์ ๋ํด์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
๐ค Concept
ArrayList
- Collection Framework ์ค ํ๋ (java.util.ArrayList)
- List ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ์ ํด๋์ค ์ค ํ๋
- ๋์ ๋ฐฐ์ด → ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋์ง ์์
- ๋ฐฐ์ด์์ ์กฐ์์ด ํ์ํ ๊ฒฝ์ฐ ์ ์ฉ
- ์์ํ ์ฌ์ฉ ๋ถ๊ฐ
ArrayList ๊ด๋ จ ๋ฉ์๋
- ArrayList ๊ฐ ์ถ๊ฐ
1) arrayList.add(VALUE);
2) arrayList.add(INDEX, VALUE); - ArrayList ๊ฐ ์์ == arrayList.set(INDEX, VALUE);
- ArrayList ๊ฐ ์ ๊ฑฐ
1) arrayList.remove(VALUE);
2) arrayList.remove(INDEX); - ArrayList ์ด๊ธฐํ == arrayList.clear();
- ArrayList ๊ฐ ์ถ๋ ฅ == arrayList.get(INDEX);
→ Iterator์ ListIterator๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ ๊ฐ๋ฅ
public static void main(String[] args) {
ArrayList<String> numbers
= new ArrayList<>(Arrays.asList("one", "two", "three"));
// 1. for-each + arrayList.get();
for (String num : numbers) {
System.out.print(num + " / ");
}
// 2. for + arrayList.get();
for (int i = 0; i < numbers.size(); ++i) {
System.out.print(numbers.get(i) + " / ");
}
// 3. Iterator
Iterator<String> iterator = numbers.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " / ");
}
// 4. ListIterator
ListIterator<String> listIterator
= numbers.listIterator(numbers.size());
while (listIterator.hasPrevious()) {
System.out.print(listIterator.previous() + " / ");
}
}
- ArrayList๊ฐ ๋น์ด์๋์ง ์ฒดํฌ == arrayList.empty();
- ArrayList ํน์ ๊ฐ์ด ์๋์ง ์ฒดํฌ
1) arrayList.contains(VALUE); → True/False
2) arrayList.indexOf(VALUE); → INDEX/-1
3) arrayList.lasIndexOF(VALUE); → INDEX/-1
ArrayList ์ ๋ ฌ ๋ฉ์๋
- Collections.sort();
- ์ค๋ฆ์ฐจ์: ๋๋ฌธ์ → ์๋ฌธ์ ์์ผ๋ก ์ ๋ ฌ๋๋ค
- import java.util.Collections; ํ์
public static void main(String[] args) {
// ArrayList
ArrayList<String> arr
= new ArrayList<>(Arrays.asList("z", "A", "G", "d", "e"));
// ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
Collections.sort(arr);
System.out.println("์ค๋ฆ์ฐจ์ : " + arr); // [A, G, a, e, z]
// ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
Collections.sort(arr, Collections.reverseOrder());
System.out.println("๋ด๋ฆผ์ฐจ์ : " + arr); // [z, e, a, G, A]
// ๋์๋ฌธ์ ๊ตฌ๋ถํ์ง ์๋ ์ค๋ฆ์ฐจ์
Collections.sort(arr, String.CASE_INSENSITIVE_ORDER);
System.out.println("๋์๋ฌธ์ ๊ตฌ๋ถ์์ด ์ค๋ฆ์ฐจ์ : " + arr); // [a, A, e, G, z]
// ๋์๋ฌธ์ ๊ตฌ๋ถํ์ง ์๋ ๋ด๋ฆผ์ฐจ์
Collections.sort(arr, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
System.out.println("๋์๋ฌธ์ ๊ตฌ๋ถ์์ด ๋ด๋ฆผ์ฐจ์ : " + arr); // [z, G, e, a, A]
}
- List.sort();
- ์กฐ๊ฑด: Java 8 ์ด์
- sort()์ ํ๋ผ๋ฏธํฐ๋ก Comparator๊ฐ ํ์
(import java.util.Comparator;)
public static void main(String[] args) {
// ArrayList
ArrayList<String> arr
= new ArrayList<>(Arrays.asList("z", "A", "G", "d", "e"));
// ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
arr.sort(Comparator.naturalOrder());
System.out.println("์ค๋ฆ์ฐจ์ : " + arr); // [A, G, a, e, z]
// ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
arr.sort(Comparator.reverseOrder());
System.out.println("๋ด๋ฆผ์ฐจ์ : " + arr); // [z, e, a, G, A]
// ๋์๋ฌธ์ ๊ตฌ๋ถํ์ง ์๋ ์ค๋ฆ์ฐจ์
arr.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println("๋์๋ฌธ์ ๊ตฌ๋ถ์์ด ์ค๋ฆ์ฐจ์ : " + arr); // [a, A, e, G, z]
// ๋์๋ฌธ์ ๊ตฌ๋ถํ์ง ์๋ ๋ด๋ฆผ์ฐจ์
arr.sort(Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
System.out.println("๋์๋ฌธ์ ๊ตฌ๋ถ์์ด ๋ด๋ฆผ์ฐจ์ : " + arr); // [z, G, e, a, A]
}
Collections.sort() vs Arrays.sort() ์ฐจ์ด์
- Arrays.sort()๋ Dual-Pivot Quicksort๋ฅผ ์ฌ์ฉ
(๋ฐฐ์ด์์ ์ฃผ๋ก ์ฌ์ฉ) - Collections.sort()๋ merge sort์ insert sort๋ฅผ ํฉ์น timsort๋ฅผ ์ฌ์ฉ
- Quicksort๋ ๋ฐฐ์ด์์ ์ข์ ์ฑ๋ฅ์ ๋ณด์ด์ง๋ง stableํ์ง ์์
- ๋ฐ๋ผ์ stable์ด ํ์ํ Object์๋ Collections.sort()๋ฅผ ๋ง์ด ์ฌ์ฉ
- Arrays.sort๋ ์ธ์์ ํ์
์ด
1) Primitive Type์ธ ๊ฒฝ์ฐ DualPivotQuicksort.sort() ์ฌ์ฉ
2) Object Type์ธ ๊ฒฝ์ฐ์๋ TimSort.sort()๊ฐ ์ฌ์ฉ
๐ ์ฐธ๊ณ ํ ์ฌ์ดํธ
https://ttl-blog.tistory.com/148
https://brandpark.github.io/java/2021/01/05/arrays_sort1.html
[JAVA] List ์ ๋ ฌํ๊ธฐ (ArrayList, LinkedList ๋ฑ)
List๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ Collections.sort() List.sort() - Java 8 ์ดํ ์ ๋ ฌ ๊ธฐ์ค ์ค์ Comparable - compareTo ๊ตฌํ Comparator - compare๊ตฌํ List๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ 1. Collections.sort() public static void sort(List list) public static void
ttl-blog.tistory.com
[ JAVA ] Arrays.sort()์ ๋ด๋ถ ๋์(1) - ์๋ฐ๋๋์ Tech์ ๋ฌผ
๊ฐ์ ์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถ๋ฅผ ํ๋ค Arrays.sort()์ Collections.sort()์ ๋ด๋ถ๋ ์ด๋ค ์ ๋ ฌ์ ์ฌ์ฉํ๋์ง ๊ถ๊ธํด์ก๋ค. ๊ณต๋ถํ ๊ฒฐ๊ณผ๋ถํฐ ๋งํ์๋ฉด Arrays.sort๋ ์ธ์์ ํ์ ์ด ์์ํ์ (PrimitiveType)์ธ ๊ฒฝ์ฐ์๋ DualP
brandpark.github.io
๐ <์ฐธ๊ณ > ์ฌ์ฉ์๊ฐ ์ง์ Comparable, Comparator ๊ตฌํ
https://ttl-blog.tistory.com/148
https://hianna.tistory.com/569
[JAVA] List ์ ๋ ฌํ๊ธฐ (ArrayList, LinkedList ๋ฑ)
List๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ Collections.sort() List.sort() - Java 8 ์ดํ ์ ๋ ฌ ๊ธฐ์ค ์ค์ Comparable - compareTo ๊ตฌํ Comparator - compare๊ตฌํ List๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ 1. Collections.sort() public static void sort(List list) public static void
ttl-blog.tistory.com
[Java] ArrayList ์ ๋ ฌํ๊ธฐ (์ค๋ฆ์ฐจ์, ๋ด๋ฆผ์ฐจ์, ์ฌ์ฉ์ ์ ์)
Collections.sort() ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ธฐ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ธฐ ๋์๋ฌธ์ ๊ตฌ๋ถ์์ด ์ ๋ ฌํ๊ธฐ List.sort() - Java 8 ์ดํ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ธฐ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ธฐ ๋์๋ฌธ์ ๊ตฌ๋ถ์์ด ์ ๋ ฌํ๊ธฐ ์ฌ
hianna.tistory.com
๐ <์ฐธ๊ณ > Comparable๊ณผ Comparator ์ฐจ์ด์
https://st-lab.tistory.com/243
์๋ฐ [JAVA] - Comparable ๊ณผ Comparator์ ์ดํด
์๋ง ์ด ๊ธ์ ์ฐพ์ ์ค์ ๋ถ๋ค ๋๊ฐ๋ Comparable๊ณผ Comparator์ ์ฐจ์ด๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฑฐ๋ ๊ถ๊ธํด์ ์ฐพ์์ค์ จ์ ๊ฒ์ด๋ค. ์ฌ์ค ์๊ณ ๋ณด๋ฉด ๋ ๊ฐ๋ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ผ๋ ์๋ฌด๋๋ ์๋ฐ๋ฅผ ํ์ตํ๋ฉด์ ๊ฐ
st-lab.tistory.com