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의 원소는 모두 서로 다르다.
`indices`에 있는 인덱스의 글자들을 지우고 이어붙이면 "programmers"가 되므로 이를 return 한다.
정답코드 (HashSet)
문자열 my_string
에서 indices
에 들어있는 위치의 문자를 제외하고, 나머지를 이어붙인 문자열을 리턴해야 하므로, 매 반복마다 현재 인덱스 i
가 indices
에 있는지 검사해야 한다. 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)
→i
가 Set에 없다 → 즉, 제외 대상이 아님 → 남겨야 할 문자
단순 배열 사용한 코드
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])
→ 제거 대상이 아니면 문자 추가