프로그래밍/Algorithm

[프로그래머스] 대충 만든 자판

일단개그하다 2023. 5. 6. 12:16

문제

https://school.programmers.co.kr/learn/courses/30/lessons/160586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

접근 방법 및 풀이

keymap에서 각 알파벳을 입력 하기 위한 버튼의 최소 입력 횟수를 Map에 구하고, targets에 할당된 문자열을 입력하기 위한 버튼의 최소 입력 횟수를 위에서 구한 Map에서 구하여 합산

입력 할 수 없는 알파벳이 있는 경우 -1로 설정

import java.util.HashMap;
import java.util.Map;

/**
 * https://school.programmers.co.kr/learn/courses/30/lessons/160586
 */
public class Q30_160586 {
    public int[] solution(String[] keymap, String[] targets) {
        // 입력 가능한 키와 입력하기 위한 최소 버튼 입력 횟수
        Map<Character, Integer> keyCountMap = new HashMap<>();
        for (String keys : keymap) {
            int keyLength = keys.length();
            for (int i = 0; i < keyLength; i++) {
                char key = keys.charAt(i);
                int min = Math.min(i + 1, keyCountMap.getOrDefault(key, Integer.MAX_VALUE));
                keyCountMap.put(key, min);
            }
        }

        // 입력 해야 하는 문자열에 대한 최소 버튼 입력 횟수 구하기
        int[] answer = new int[targets.length];
        for (int targetIndex = 0; targetIndex < targets.length; targetIndex++) {
            String target = targets[targetIndex];
            int targetLength = target.length();

            int count = 0;
            for (int i = 0; i < targetLength; i++) {
                char text = target.charAt(i);
                int value = keyCountMap.getOrDefault(text, -1);
                if (value == -1) { // 입력이 불가능한 문자가 포함된 경우
                    count = -1;
                    break;
                } else {
                    count += value;
                }
            }
            answer[targetIndex] = count;
        }

        return answer;
    }
}