티스토리 뷰
본 글은 다크모드에 최적화되어 있습니다.
Problem
keymap에는 자판기에 존재하는 문자들로 구성된 문자열이 주어지고 targets에는 입력하고자 하는 문자들로 구성된 문자열이 주어진다. targets에 저장된 문자들이 자판기에 존재하는지 확인하면 되는 문제이다
Approach
keymap 배열에 저장된 값을 하나씩 꺼내어 아래의 과정을 거친다.
- 이미 map에 저장된 문자인지 확인한다.
- 존재하지 않는다면 key:문자, value:문자의 위치를 저장한다.
- 존재한다면 key:문자, value: 기존의 값과 현재 문자의 위치를 비교하여 더 작은 값을 저장
// j + 1인 이유는 키를 1번 이상 눌러야 하기 때문이다.
if(!map.containsKey(word))
map.put(word, j+1);
else
map.put(word, map.get(word) > j + 1 ? j + 1 : map.get(word));
더 작은 값을 저장하는 이유는 목표 문자열을 작성하기 위해서는 키를 최소한으로 눌러야 하기 때문이다. 여기서 value 값은 눌러야 하는 key 횟수이다.
Code
import java.util.*;
class Solution {
static Map<String, Integer> map = new HashMap<>();
public int[] solution(String[] keymap, String[] targets) {
int[] result = new int[targets.length];
// 문자를 누르기 위한 최소 횟수 저장
for (int i = 0; i < keymap.length; i++) {
String key = keymap[i];
for (int j = 0; j < key.length(); j++) {
String word = key.charAt(j) + "";
// map에 존재하지 않는 문자일 때
if (!map.containsKey(word))
map.put(word, j + 1);
// 이미 map에 존재한다면 더 적은 횟수로 키를 누를 수 있는 값 저장
else
map.put(word, map.get(word) > j + 1 ? j + 1 : map.get(word));
}
}
// 문자를 치기위해 눌러야하는 키 횟수 구하기
for (int i = 0; i < targets.length; i++) {
String target = targets[i];
int count = 0;
for (int j = 0; j < target.length(); j++) {
String word = target.charAt(j) + "";
if (map.containsKey(word))
count += map.get(word);
// 목표 문자열을 완성할 수 없으면 다음 문자를 확인할 필요가 없다.
else {
count = 0;
break;
}
}
result[i] = count == 0 ? -1 : count;
}
return result;
}
}