[Java] 프로그래머스(level-1) - 가장 가까운 같은 글자

문제 풀이
이번 문제는 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을 활용하여 검증하고 삽입하면 된다.
- 먼저 s의 문자가 HashMap에 존재하지 않는다면, HashMap에 s의 문자와 인덱스 값을 삽입한 후 answer 배열에 -1을 삽입한다.
- 만약 s의 문자가 HashMap에 존재하는 값이라면, answer 배열에
[s의 인덱스 - 먼저 삽입된 s 문자의 인덱스(값)]
을 통해 가장 가까운 글자와의 인덱스의 차를 구한다. - 이 후 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을 활용하여 삽입된 키에 따른 값을 변경하는 메커니즘을 도입할 수 있었다.