프로그래머스 대충 만든 자판 JAVA 풀이 (HashMap, 구현)

2026. 6. 26. 18:25·코테(Solved.ac + Programmers)
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
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 프로그래머스 동영상 재생기 JAVA 풀이 (구현, 시뮬레이션)
  • 프로그래머스 햄버거 만들기 JAVA 풀이 (스택, 구현)
  • 프로그래머스 정수를 나선형으로 배치하기 JAVA 풀이 (구현, 시뮬레이션)
  • 프로그래머스 신호등 정전 JAVA 풀이 (시뮬레이션, 최소공배수)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN N
      • 코테(Solved.ac + Programmers) N
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    브루트포스
    기출문제
    Level2
    정보처리기사
    백준
    수학
    level0
    정처기오답노트
    정렬
    완전탐색
    자료구조
    알고리즘
    dp
    코딩테스트
    프로그래머스
    java
    실기
    정처기실기
    정보처리기사 실기 기출문제
    자바
    백엔드개발자
    solved.ac
    문자열
    정처기
    배열
    level1
    구현
    피보나치
    시뮬레이션
    springboot
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
프로그래머스 대충 만든 자판 JAVA 풀이 (HashMap, 구현)
상단으로

티스토리툴바