

<풀기 전 생각>
각 문자 하나씩에 접근을 해야함 -> toCharArray() 사용
indexOf() 함수를 통해 만들어야 하는 문자열의 문자의 수가 -1이 아닌 가장 작은수 구하기
target 문자열배열의 문자열 수(반복)
target 문자열의 char 타입의 수 (반복)
keymap 문자열배열의 문자열 수(반복)
indexOf() 함수를 통해 만들어야 하는 문자열의 문자의 수가 -1이 아닌 가장 작은수 구하기 O(n)
도출된 값을 저장
시간복잡도가 약 O(n^4)은 되는 과정을 처음에는 생각했으나
keymap배열을 indexOf함수를 사용해 일일이 탐색 하는 것을 바깥으로 따로 빼내
나온 값들을 어느 자료구조에 저장해두고 빠르게 불러온다면 더 효율적인 코드가 되지 않을까 하는 생각이들어
해당 값을 빠르게 접근 할때 사용하는 자료구조 Map 을 생각할 수 있었고
미리 Map에다가 모든 정보를 다 저장해 두고 그 정보를 가져오기 만약 해당 정보가 없으면 -1로 처리 하는 방식으로 코드를 짜야겠다 판단하여
결과적으로 시간복잡도를 O(n^2)으로 줄이는 코드를 생각할 수 있었다.
<최종 코드>
import java.util.HashMap;
class Solution {
// 시간 복잡도 O(mn) 공간 복잡도 O(n)
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[targets.length];
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
// 시간 복잡도 O(keymap.length()*keymap[n].length)
for (String keyUnit: keymap) {
for(int i=0;i<keyUnit.length();i++) {
char key = keyUnit.charAt(i);
int value = i+1;
if(map.containsKey(key))
value = Math.min(value, map.get(key));
map.put(key,value);
}
}
// 시간 복잡도 O(targets.length()*targets[n].length)
for(int i=0;i<targets.length;i++){
char[] alphas = targets[i].toCharArray();
int tmp = 0;
for (char alpha: alphas) {
if(!map.containsKey(alpha)){
tmp = -1;
break;
}
tmp += map.get(alpha);
}
answer[i] = tmp;
}
return answer;
}
}
public class ARoughKeyboard {
public static void main(String[] args) {
Solution s = new Solution();
String tmp1[] = {"AA"};
String tmp2[] = {"B"};
int nums[] = s.solution(tmp1,tmp2);
for (int num: nums) {
System.out.print(num);
}
}
}'PS > Level1' 카테고리의 다른 글
| 당구 연습 (1) | 2023.03.18 |
|---|---|
| 둘만의 암호 (0) | 2023.02.19 |
| 자연수를 뒤집어 배열로 만들기 (0) | 2023.02.18 |
| 크레인 인형뽑기 게임 (0) | 2023.02.06 |
| 로또의 최고 순위와 최저 순위 (3) | 2023.02.04 |