Skip to main content

28. [Java] 글자지우기

https://school.programmers.co.kr/learn/courses/30/lessons/181900

  • 문자열 my_string과 정수 배열 indices가 주어질 때,
  • my_string에서 indices의 원소에 해당하는 인덱스의 글자를 지우고
  • 이어 붙인 문자열을 return

  • 1 ≤ indices의 길이 < my_string의 길이 ≤ 100
  • my_string은 영소문자로만 이루어져 있다.
  • 0 ≤ indices의 원소 < my_string의 길이
  • indices의 원소는 모두 서로 다르다.

image.png

image.png

`indices`에 있는 인덱스의 글자들을 지우고 이어붙이면 "programmers"가 되므로 이를 return 한다.


정답코드 (HashSet)

문자열 my_string에서 indices에 들어있는 위치의 문자를 제외하고, 나머지를 이어붙인 문자열을 리턴해야 하므로, 매 반복마다 현재 인덱스 iindices에 있는지 검사해야 한다. indices에 있는 값들을 반복적으로 검색 할 때, HashSet은 빠르게 포함 여부를 판단할 수 있기 때문에 성능상 압도적으로 유리하다.

import java.util.*;

class Solution {
    public String solution(String my_string, int[] indices) {
        // 인덱스 빠르게 검사하기 위해서 Set을 씀
        Set<Integer> indexSet = new HashSet<>();
        for (int idx : indices) {
            indexSet.add(idx);
        }
        
        StringBuilder sb = new StringBuilder();
        
        for(int i = 0; i < my_string.length(); i++) {
            if (!indexSet.contains(i)) { // 제외할 인덱스가 아니라면
                sb.append(my_string.charAt(i));
            }
        }
        return sb.toString();
    }
}
!indexSet.contains(i)
  • indexSet.contains(i)i라는 값이 Set 안에 있는지 확인 (즉, 제외할 인덱스인지 확인)
  • !indexSet.contains(i)iSet에 없다 → 즉, 제외 대상이 아님남겨야 할 문자

단순 배열 사용한 코드

  • my_string 길이가 작고, indices도 작다면 성능상 큰 부담이 없으므로
  • boolean[] 배열을 만들어 제외할 인덱스를 표시하는 방식으로 구현해도 된다.
class Solution {
    public String solution(String my_string, int[] indices) {
        boolean[] toRemove = new boolean[my_string.length()]; // 제거할 인덱스를 true로 표시

        for (int idx : indices) {
            toRemove[idx] = true;
        }

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < my_string.length(); i++) {
            if (!toRemove[i]) { // 제거 대상이 아니면 추가
                sb.append(my_string.charAt(i));
            }
        }

        return sb.toString();
    }
}
  • boolean[] toRemove = new boolean[my_string.length()]
    → 문자열 길이만큼 배열 생성, 전부 false로 초기화됨
  • toRemove[idx] = true;
    indices에 있는 위치는 제거 대상 표시
  • if (!toRemove[i])
    → 제거 대상이 아니면 문자 추가