Publish:

νƒœκ·Έ: , , , , ,

μΉ΄ν…Œκ³ λ¦¬:

img_3.png

문제

문제 링크

img_3.png

μ„€λͺ…

μˆ«μžκ°€ μ£Όμ–΄μ‘Œμ„λ•Œ k 개의 숫자λ₯Ό 제거 ν–ˆμ„λ•Œ μ΅œλŒ€κ°€ λ˜λŠ” 수λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

μ‹œλ„ν•΄λ΄€λ˜ 방법

문제λ₯Ό 잘λͺ» μ΄ν•΄ν•΄μ„œ μ•žμ—μ„œ λΆ€ν„° κ°€μž₯ μž‘μ€ 수λ₯Ό 순차적으둜 k 개 μ œμ™Έμ‹œν‚€λŠ” λ°©ν–₯으둜 μ½”λ“œλ₯Ό μž‘μ„±ν–ˆμ—ˆλ‹€. μ˜ˆμ œμ—μ„œ 주어진 1924 λ‚˜ 1231234 의 κ²½μš°μ—” μš°μ—°νžˆ 숫자의 λ°°μΉ˜κ°€ λ§žμ•„ λ–¨μ–΄μ Έμ„œ ν†΅κ³Όν–ˆμ§€λ§Œ 4177252841 의 κ²½μš°μ—” 477584 결과값이 λ‚˜μ˜€λ©΄μ„œ ν†΅κ³Όν•˜μ§€ λͺ»ν–ˆλ‹€.

전체 μˆ˜μ—μ„œ μ΅œμ†Œ 숫자λ₯Ό λΉΌλŠ” λ°©μ‹μœΌλ‘œ ν‘ΈλŠ” λ¬Έμ œκ°€ μ•„λ‹ˆλž€ 것을 λŠκΌˆλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
  public String solution(String number, int k) {
    String[] arr = number.split("");
    Arrays.sort(arr);

    StringBuilder sb = new StringBuilder(number);
    for (int i = 0; i < k; i++) {
      for (int j = 0; j < sb.length(); j++) {
        if (String.valueOf(sb.charAt(j)).equals(arr[i])) {
          sb.deleteCharAt(j);
          break;
        }
      }
    }
    return sb.toString();
  }
}

풀이

  • 그리디 μ•Œκ³ λ¦¬μ¦˜ : μ΅œμ’… κΈΈμ΄λŠ” μ›λž˜ κΈΈμ΄μ—μ„œ k λ₯Ό λΊ€ 만큼(number.length() - k)이 λœλ‹€. κ·Έ 길이λ₯Ό len 이라고 ν•  λ•Œ, 맨 μ•žμ—μ„œλΆ€ν„° 순차적으둜 μ΅œλŒ€ μˆ«μžλ§Œμ„ len 개 이어 λΆ™μ—¬μ•Ό ν•œλ‹€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
  public String solution(String number, int k) {
    String answer = "";

    StringBuilder sb = new StringBuilder();
    ArrayDeque<Character> stack = new ArrayDeque<>();

    // 1
    for (int i = 0; i < number.length(); i++) {
      char c = number.charAt(i);
      while (!stack.isEmpty() && stack.peek() < c && k > 0) {
        stack.poll();
        k--;
      }
      stack.push(c);
    }

    // 2
    for (int i = 0; i < k; i++) {
      stack.pop();
    }

    // 3
    for (char c : stack) {
      sb.append(c);
    }

    return sb.reverse().toString();
  }
}
  • μ½”λ“œμ˜ 1 번 λΆ€λΆ„ : 맨 μ•ž μˆ«μžλΆ€ν„° ν™•μΈν•œλ‹€. ν˜„μž¬ μˆ«μžκ°€ μŠ€νƒμ— μžˆλŠ” 수 보닀 크면 μŠ€νƒμ— 있던 수λ₯Ό 제거 ν•˜κ³  λ„£λŠ”λ‹€. μ΄λ•Œ μŠ€νƒμ— λ“€μ–΄μžˆλŠ” μˆ˜κ°€ μ—¬λŸ¬κ°œ 있으면 k λ²”μœ„ λ‚΄μ—μ„œ λͺ¨λ‘ μ§€μš΄λ‹€. 예λ₯Ό λ“€μ–΄ 4177252841 μ—μ„œ μŠ€νƒμ— 4, 1 κΉŒμ§€ λ“€μ–΄μžˆλŠ” μƒνƒœμ—μ„œ λ‹€μŒ 숫자인 7 을 λ„£μ„λ•Œ μ•ž λ‘κ°œμ˜ 숫자λ₯Ό λͺ¨λ‘ μ§€μ›Œμ•Ό ν•œλ‹€.

  • μ½”λ“œμ˜ 2 번 λΆ€λΆ„ : 이 뢀뢄은 999 와 같이 λ˜‘κ°™μ€ 숫자 μ‘°ν•©μœΌλ‘œ μž…λ ₯λ˜λŠ” 경우, μŠ€νƒμ— 9, 9, 9 λͺ¨λ‘ λ“€μ–΄κ°€κΈ° λ•Œλ¬Έμ— k 만큼 제거 ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— ν•„μš”ν•˜λ‹€.
  • μ½”λ“œμ˜ 3 번 λΆ€λΆ„ : μŠ€νƒ 맨 μœ—λΆ€λΆ„ λΆ€ν„° sb 에 λ“€μ–΄κ°€ μžˆμœΌλ―€λ‘œ μ›λž˜ 숫자 μˆœμ„œλŒ€λ‘œ λ’€μ§‘μ–΄μ„œ 좜λ ₯ν•œλ‹€.

회고

그리디 μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό 많이 μ•ˆν’€μ–΄λ΄μ„œ κ·ΈλŸ°κ°€ λ­”κ°€ μ •ν˜•ν™”λœ μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•΄ ν‘ΈλŠ” λŠλ‚Œμ΄ μ•„λ‹ˆκ³ , 문제λ₯Ό 보고 μ–΄λ–€ μ‹μœΌλ‘œ ν’€μ–΄λ‚˜κ°€μ•Ό 될지에 λŒ€ν•œ μ „λž΅μ— κ°€κΉλ‹€λŠ” 것을 λŠκΌˆλ‹€. μ½”λ“œλŠ” μ§§μ§€λ§Œ 생각해 λ‚΄κΈ°κ°€ 쉽지 μ•Šλ‹€. λ§Žμ€ 문제λ₯Ό ν’€μ–΄λ³΄λ©΄μ„œ μƒκ°ν•˜λŠ” μ—°μŠ΅μ„ ν•΄μ•Ό 될 것 κ°™λ‹€.

λ°©λ¬Έν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! λŒ“κΈ€,지적,ν”Όλ“œλ°± μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€πŸ˜Š

λŒ“κΈ€λ‚¨κΈ°κΈ°