본문 바로가기
코딩테스트/자바 Level 0

[Java] 글자 지우기

by onggury 2023. 7. 26.

문제

문자열 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