문제
문자열 my_string과 정수 배열 indices가 주어질 때, my_string에서 indices의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤ indices 의 길이 < my_string 의 길이 ≤ 100
- my_string 은 영소문자로만 이루어져 있습니다.
- 0 ≤ indices 의 원소 < my_string 의 길이
- indices 의 원소는 모두 서로 다릅니다.
import java.util.Arrays;
import java.util.HashMap;
class Solution {
public String solution(String my_string, int[] indices) {
String answer = "";
String[] my_string_arr = my_string.split("");
for(int ind : indices) {
my_string_arr[ind] = "";
}
answer = String.join("", my_string_arr);
return answer;
}
}
위 방법은 주어진 문자열을 배열로 만든 후, 주어진 인덱스 번호를 빈 문자열로 만들고 최종 결과를 합치는 방법이다.
그런데 뭔가 뭔가 나누고 합치는 이 방법보다 빠른 방법이 있을 것 같았다.
그래서 나는 HashMap과 StringBuilder 객체를 사용했다.
import java.util.Arrays;
import java.util.HashMap;
class Solution {
public String solution(String my_string, int[] indices) {
StringBuilder sb = new StringBuilder();
HashMap<Integer, Integer> indicesMap = new HashMap<Integer, Integer>();
for(int ind : indices) {
indicesMap.put(ind, 0);
}
for(int i = 0; i < my_string.length(); i++) {
if(indicesMap.get(i) == null) {
sb.append(my_string.charAt(i));
}
}
return sb.toString();
}
}
먼저 hashMap 객체에 주어진 인덱스를 key 값으로 넣었다. 그 이유는 나중에 주어진 문자열을 순회할 때, 현재 인덱스가 주어진 인덱스에 있는지를 찾기 위함이다.
그냥 List 를 쓴다면 처음부터 순회하며 찾아야 하겠지만, HashMap 을 씀으로써 찾고자 하는 값에 바로 접근할 수 있다.
즉, 있는지 없는지를 바로 찾을 수 있다.
그런데 이 문제는 주어진 인덱스의 문자를 삭제하는 문제이기 때문에 HashMap에서 해당 key 가 없다면 StringBuilder 객체에 값을 append 해나가는 방식으로 풀었다.
그 결과는 아래와 같다.
그리고 아래 결과는 문자를 배열로 나누고 합치는 과정을 한 첫 코드이다.
확실이 전체적으로 HashMap을 쓴 결과가 빠른 것을 볼 수 있었다.
아마 더 빠른 방법이 있겠지?
출처
https://school.programmers.co.kr/learn/courses/30/lessons/181900