๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Programmers lv-0

ํ•œ ๋ฒˆ๋งŒ ๋“ฑ์žฅํ•œ ๋ฌธ์ž - Java [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ž…๋ฌธ]

by ๊ทคํ”ผํ‚ค 2022. 11. 28.

 

โค๏ธ Problem

๋”๋ณด๊ธฐ
  • ๋ฌธ์ œ
    ๋ฌธ์ž์—ด s๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. s์—์„œ ํ•œ ๋ฒˆ๋งŒ ๋“ฑ์žฅํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋ฌธ์ž์—ด์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด๋ณด์„ธ์š”. ํ•œ ๋ฒˆ๋งŒ ๋“ฑ์žฅํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด์„ return ํ•ฉ๋‹ˆ๋‹ค.

 

  • ์ œํ•œ ์‚ฌํ•ญ
    • 0 < s์˜ ๊ธธ์ด < 1,000
    • s๋Š” ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์ž…์ถœ๋ ฅ ์˜ˆ & ์„ค๋ช…

no s result
1 "abcabcadc" "d"
2 "abdc" "abcd"
3 "hello" "eho"
  1. "abcabcadc"์—์„œ ํ•˜๋‚˜๋งŒ ๋“ฑ์žฅํ•˜๋Š” ๋ฌธ์ž๋Š” "d"์ž…๋‹ˆ๋‹ค.
  2. "abdc"์—์„œ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ํ•œ ๋ฒˆ์”ฉ ๋“ฑ์žฅํ•˜๋ฏ€๋กœ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ "abcd"๋ฅผ return ํ•ฉ๋‹ˆ๋‹ค.
  3. "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

"ํ•œ ๋ฒˆ๋งŒ ๋“ฑ์žฅํ•œ๋‹ค"๋ผ๋Š” ๊ฐœ๋…์ด ์ƒ๊ฐ๋ณด๋‹ค ์ฝ”๋“œ ๊ตฌํ˜„๋˜๋Š” ๊ฒŒ ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ. ๋‚˜๋Š” ์ด ๊ฐœ๋…์„ "์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ž์—ด์€ ๋ฐฐ์ œํ•œ๋‹ค"๋ผ๊ณ  ์ดํ•ดํ–ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์ฝ”๋“œ๋ฅผ ์งœ๋‹ค๋ณด๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ธ๊ฐ„์ ์ธ(?) ์ฒ˜๋ฆฌ๋ฐฉ์‹์œผ๋กœ๋Š” ๊ตฌํ˜„์ด ํž˜๋“ค ๋•Œ๊ฐ€ ๋งŽ์•˜๋‹ค. ์ธ๊ฐ„์˜ ์ž…์žฅ์—์„œ "์—ฌ๋Ÿฌ ๋ฒˆ ๋“ฑ์žฅํ•˜๋Š” ๊ฒƒ"์„ ๊ตฌ๋ถ„ํ•œ๋‹ค ์น˜๋ฉด ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋ฉด ๊ทธ๋งŒ์ธ๋ฐ, ์ด๊ฑธ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ ค๋‹ˆ ๋พฐ์กฑํ•œ ์ˆ˜๊ฐ€ ๋– ์˜ค๋ฅด์งˆ ์•Š์•˜๋‹ค๐Ÿ˜ฅ

ํ•œ์ฐธ์„ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๋ฌธ๋“ ๋“  ์ƒ๊ฐ์ด "๋ฌธ์ž์—ด์—์„œ ๋™์ผํ•œ ๋ฌธ์ž์—ด์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋“ฑ์žฅํ•œ๋‹ค๋ฉด, ์ฒซ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ์™€ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™๋‹ค"๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

  1. ๋งจ ์ฒ˜์Œ ๊ฒ€์‚ฌํ•  ๋ฌธ์ž์—ด์„ ๋ฐฐ์—ด๋กœ ์ชผ๊ฐœ๋‘” ๋’ค, ๊ฒ€์‚ฌ ๊ธฐ์ค€์ด ๋  ArrayList์— ์ค‘๋ณต์—†์ด ์ชผ๊ฐœ๋†“์€ ๋ฌธ์ž์—ด ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
  2. ArrayList์— ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  3. ๊ฒ€์‚ฌํ•  ๋ฌธ์ž์—ด์—์„œ 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

 

 

 

๋Œ“๊ธ€