728x90
🔗 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 개요
휴대폰 자판에서 각 문자를 입력하기 위해 필요한 최소 입력 횟수를 구한 뒤, targets의 각 문자열을 입력하기 위한 최소 버튼 입력 횟수를 구하는 문제이다.
같은 문자가 여러 키에 존재하거나 같은 키에 여러 번 등장할 수 있으므로, 항상 가장 적게 눌러 입력할 수 있는 횟수를 사용해야 한다.
또한 자판에 존재하지 않는 문자가 포함되어 있다면 해당 문자열은 입력할 수 없으므로 -1을 반환한다.
📌 접근 방법
먼저 keymap을 순회하며 문자별 최소 입력 횟수를 HashMap<Character, Integer>에 저장한다.
이후 targets를 순회하면서 각 문자의 입력 횟수를 HashMap에서 조회하여 합산한다.
만약 HashMap에 존재하지 않는 문자를 만나면 해당 문자열은 입력이 불가능하므로 -1을 저장한다.
📌 핵심 아이디어
1. 문자별 최소 입력 횟수 저장
각 문자열을 순회하면서 문자와 입력 횟수(j + 1)를 저장한다.
map.merge(ch, j + 1, Math::min);
merge()를 사용하면
- 처음 등장한 문자라면 그대로 저장
- 이미 존재한다면 기존 값과 현재 값을 비교하여 더 작은 값을 저장
예시
A → 3
A → 1
A → 1
2. target 문자열 계산
각 문자를 하나씩 확인한다.
char ch = targets[i].charAt(j);
HashMap에 존재하는 경우, 입력 횟수를 누적한다.
sum += map.get(ch);
3. 입력 불가능한 문자 처리
HashMap에 존재하지 않는 문자는 입력 자체가 불가능하므로 -1을 저장하고 해당 문자열의 탐색을 종료한다.
if (!map.containsKey(ch)) {
sum = -1;
break;
}
📌 전체 코드
import java.util.Arrays;
import java.util.HashMap;
public class No63 {
public static void main(String[] args) {
String[] keymap = {"AGZ", "BSSS"};
String[] targets = {"ASA","BGZ"};
HashMap<Character, Integer> map = new HashMap<>();
for(int i = 0; i < keymap.length; i++){
for(int j = 0; j < keymap[i].length(); j++){
char ch = keymap[i].charAt(j);
map.merge(ch, j + 1, Math::min);
}
}
int[] result = new int[targets.length];
for(int i = 0; i < targets.length; i++){
int sum = 0;
for(int j = 0; j < targets[i].length(); j++){
char ch = targets[i].charAt(j);
if(!map.containsKey(ch)){
sum = -1;
break;
}
sum += map.get(ch);
}
result[i] = sum;
}
System.out.println(Arrays.toString(result));
}
}
📄 정리
- HashMap을 이용해 문자별 최소 입력 횟수를 저장한다.
- merge()와 Math.min()을 사용하면 최소값 갱신을 간결하게 구현할 수 있다.
- targets는 HashMap 조회만 수행하므로 빠르게 계산할 수 있다.
- 존재하지 않는 문자는 containsKey()로 확인하여 -1을 반환한다.
728x90
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 프로그래머스 동영상 재생기 JAVA 풀이 (구현, 시뮬레이션) (0) | 2026.06.28 |
|---|---|
| 프로그래머스 햄버거 만들기 JAVA 풀이 (스택, 구현) (0) | 2026.06.27 |
| 프로그래머스 정수를 나선형으로 배치하기 JAVA 풀이 (구현, 시뮬레이션) (0) | 2026.06.26 |
| 프로그래머스 신호등 정전 JAVA 풀이 (시뮬레이션, 최소공배수) (0) | 2026.06.25 |
| 프로그래머스 창고 정리 JAVA 풀이 (0) | 2026.06.24 |