<풀기 전 생각>

각 문자 하나씩에 접근을 해야함 -> 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

+ Recent posts