
문제
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 반환 - 예시

풀이 흐름
- 문자별 최소 누름 수 기록
→ 모든 키(keymap)를 돌며 각 문자에 대해 가장 적은 누름 수를 저장 - target 문자열 분석
→ 각 target의 문자를 하나씩 보며 최소 누름 수를 합산 - 못 누르는 문자 처리
→ 어떤 문자가 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에 대한 처리 결과를 리스트 형태로 반환
'코딩 테스트 연습 > [프로그래머스] Python' 카테고리의 다른 글
| [LV.4] 연습문제 > 둘만의 암호 (0) | 2025.10.15 |
|---|---|
| -- 9월 프로젝트 집중 기간 -- (0) | 2025.08.31 |
| [LV.4] 연습문제 > 문자열 나누기 (1) | 2025.08.22 |
| [LV.3] 탐욕법(Greedy) > 체육복 (0) | 2025.08.20 |
| [LV.3] 연습문제 > 숫자 짝꿍 ⭐️ (3) | 2025.08.18 |