코딩 테스트 연습/[프로그래머스] Python

[LV.4] 연습문제 > 대충 만든 자판

duswjd_data 2025. 8. 27. 10:09

 

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명

  • keymap[i]: (i+1)번 키에 할당된 문자들
    예: keymap[0] = "ABACD" → 1번 키를 누르면 순서대로 A(1번), B(2번), A(3번), C(4번), D(5번)
  • targets: 만들고 싶은 문자열들
  • 목표: 각 문자열을 만들기 위해 키를 최소 몇 번 눌러야 하는지 계산
    → 특정 문자를 만들 수 없으면 -1 반환
  • 예시


풀이 흐름

  1. 문자별 최소 누름 수 기록
    → 모든 키(keymap)를 돌며 각 문자에 대해 가장 적은 누름 수를 저장
  2. target 문자열 분석
    → 각 target의 문자를 하나씩 보며 최소 누름 수를 합산
  3. 못 누르는 문자 처리
    → 어떤 문자가 keymap에 아예 없다면 → 해당 문자열은 -1

정답 코드

def solution(keymap, targets):
    min_press = {}

    # 각 문자에 대해 최소 누름 횟수를 계산
    for key in keymap:
        for idx, char in enumerate(key):
            press_count = idx + 1
            if char not in min_press or press_count < min_press[char]:
                min_press[char] = press_count

    result = []

    # 각 타겟 단어별로 계산
    for word in targets:
        total = 0
        for char in word:
            if char in min_press:
                total += min_press[char]
            else:
                total = -1  # 해당 문자를 입력할 수 없음
                break
        result.append(total)

    return result

코드 설명

def solution(keymap, targets):
    min_press = {}
  • 문자(char) 에 대해 해당 문자를 입력하기 위한 최소 누름 수를 저장할 딕셔너리
  • 예: {'A': 1, 'B': 2, 'C': 2} 처럼 저장됨
    for key in keymap:
        for idx, char in enumerate(key):
            press_count = idx + 1
            if char not in min_press or press_count < min_press[char]: # 그 문자가 아직 저장되지 않았거나, 현재 누름 수가 이전보다 작다면 → 최소값으로 갱신
                min_press[char] = press_count
  • 동작 요약
    • keymap은 예를 들어 ["ABACD", "BCEFD"] 같은 리스트
    • key는 각 키에 할당된 문자열이며, 이중 반복을 통해 각 문자의 위치(=눌러야 하는 횟수)를 파악
  • 예시: "ABACD"
    • A → 1번 누름 (인덱스 0 + 1)
    • B → 2번 누름
    • A → 3번 누름 → 이미 1번 누름으로 저장되어 있어 무시
    • C → 4번 누름
    • D → 5번 누름
    result = []
  • 결과를 저장할 리스트. 각 target 문자열에 대한 최소 누름 수 합을 저장
    for word in targets:
        total = 0
        for char in word:
            if char in min_press:
                total += min_press[char]
            else:
                total = -1
                break
        result.append(total)

    return result
  • 동작 설명
    • targets는 예: ["ABCD", "AABB"]
    • 각 word(입력해야 할 단어)를 하나씩 처리
    • total은 해당 단어를 입력하기 위한 총 누름 수
  • 내부 로직
    • 각 문자를 하나씩 검사:
      • min_press에 해당 문자가 있다면 → 최소 누름 수를 더함
      • 없다면 → 입력이 불가능하므로 -1로 설정 후 중단
    • 처리 후 result 리스트에 총합 또는 -1 추가
  • 모든 targets에 대한 처리 결과를 리스트 형태로 반환