1 minute read




문제 풀이


이번 문제는 HashMap을 활용한다면 간단하게 풀 수 있다.


아이디어 도출

주어진 s의 각 문자별로 HashMap에 존재여부를 검증하도록 구현하면 된다.

  • HashMap에 존재하지 않는 문자라면, HashMap에 현재 문자와 인덱스 값을 집어넣고 answer 배열에 -1을 삽입한다.
  • HashMap에 존재하는 문자라면, 가장 가까운 글자의 인덱스가 HashMap에 삽입되어 있을 테니 [현재 문자의 인덱스 - 가장 가까운 문자의 인덱스]의 결과를 answer 배열에 삽입한 후, HashMap의 현재 문자와 인덱스 값을 집어넣는다.


아이디어를 토대로 바로 코드를 작성해보자.

1
2
int[] answer = new int[s.length()];
HashMap<String, Integer> hm = new HashMap<>();

가장 가까운 글자의 위치를 담을 answer 배열을 만들고 s의 길이를 가지도록 초기화한다.
그리고 s의 문자와 인덱스 값을 담을 HashMap을 생성하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
for(int i=0; i<s.length(); i++) {
    String str = Character.toString(s.charAt(i));
    if(hm.get(str) == null) {
        hm.put(str, i);
        answer[i] = -1;
    }
    else {
        answer[i] = i - hm.get(str);
        hm.put(str, i);
    }
}
System.out.println(Arrays.toString(answer));
return answer;

다음으로 s의 각 문자들을 순회하면서 HashMap을 활용하여 검증하고 삽입하면 된다.

  1. 먼저 s의 문자가 HashMap에 존재하지 않는다면, HashMap에 s의 문자와 인덱스 값을 삽입한 후 answer 배열에 -1을 삽입한다.
  2. 만약 s의 문자가 HashMap에 존재하는 값이라면, answer 배열에 [s의 인덱스 - 먼저 삽입된 s 문자의 인덱스(값)] 을 통해 가장 가까운 글자와의 인덱스의 차를 구한다.
  3. 이 후 HashMap에 현재 인덱스 위치를 삽입하여 최신화한다.

여기서는 s의 각 문자를 Character.toString(s.charAt(i)); 구문과 같이 String 타입으로 활용했지만 Character 타입을 바로 사용해도 무방하다.



작성 코드


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
import java.util.*;

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        HashMap<String, Integer> hm = new HashMap<>();

        for(int i=0; i<s.length(); i++) {
            String str = Character.toString(s.charAt(i));
            if(hm.get(str) == null) {
                hm.put(str, i);
                answer[i] = -1;
            }
            else {
                answer[i] = i - hm.get(str);
                hm.put(str, i);
            }
        }
        System.out.println(Arrays.toString(answer));
        return answer;
    }
    
    public static void main(String[] args){
        Solution sol = new Solution();
        String s = "banana";
        sol.solution(s);
    }
}

회고

  • 문자열의 인덱스 값이 고정되는 것이 아니라 중복 문자가 발생할 경우 최신화 해야 하기 때문에 HashMap을 활용하여 삽입된 키에 따른 값을 변경하는 메커니즘을 도입할 수 있었다.