728x90
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/160586
이 문제는 풀다가 잘 안되는 부분이 있어서 다른 사람의 풀이를 보고 푼 문제이다.
"입출력 예 설명"에 나온대로 구현하면 되는 문제이다.
풀이
keymap 안에는 여러 개의 키가 존재한다.
첫 번째 입출력 예에 따라 알아보자면, ABACD는 1번, BCEFD는 2번으로 잡을 수 있다.
이제 ABCD라는 문자열을 만들어보자.
- 1번 키에서 1번을 눌러 A 작성
- 2번 키에서 1번을 눌러 B 작성 (1번 키에서 2번 누르면 B가 가능하지만, 키를 최대한 적게 눌러야 하기 때문에 2번 키에서 1번 누르기)
- 2번 키에서 2번을 눌러 C 작성
- 2번 키에서 5번을 눌러 D 작성
따라서 1 + 1 + 2 + 5 = 9 번을 누르면 "ABCD"를 만들 수 있다!
def solution(keymap, targets):
answer = []
for word in targets: # targets에 있는 한 단어에 대해서
times = 0 # 누른 키 총합
for char in word: # 한 단어의 개별 문자에 대해
flag = False # 목표 문자열을 작성할수 있는지 없는지 판단하기 위함
time = 101 # keymap의 원소의 길이가 최대 100이기 때문에 101로 설정
# keymap에 있는 모든 원소를 반복하면서 가장 적게 누를수 있는 char(문자)를 찾음
for key in keymap:
if char in key: # key(문자열)안에 char(문자)가 존재하면
time = min(key.index(char)+1, time)
flag = True # 목표 문자열을 작성할 수 있음
if not flag: # 만약 keymap을 전부다 돌았는데도 문자를 찾지 못하면
times = -1;break # 목표 문자열을 작성할 수 없음
times += time # 하나의 문자에 대해 누른 키를 총합(키)에 더해줌
answer.append(times)
# targets에 있는 하나의 단어에 대해 수행이 끝났으면 answer에 누른 키 총합을 넣어줌
return answer
차근차근 구현하면 된다!
flag 변수의 경우 문자열을 작성할 수 있는지 없는지 판단하기 위한 판단 변수이다.
times 변수는 누른 키의 총 합을 나타내는 변수이며, 각 문자에 대해 누른 키는 time에 저장한다.
이후, 주어진 keymap에서 각 key에 대한 누름 횟수를 파악한다.
만약 개별문자가 key안에 존재하면
해당 문자를 작성하기 위해 필요한 키 누름 횟수를 계산한다 (key.index(char)+1)
이 값이 현재까지의 최소 키 누름 횟수 (time)과 비교하여 더 작은 값을 개별 문자에 대한 time 값으로 저장한다.
마지막으로 flag를 True로 설정하며, 문자 작성 가능을 나타낸다.
for문을 다 순회했지만, flag가 false라면
times를 -1로 설정하고 for문을 종료한다.
728x90
'코딩테스트 > PYTHON' 카테고리의 다른 글
[프로그래머스][PYTHON] Lv. 1 행렬의 덧셈 (0) | 2024.08.05 |
---|---|
[프로그래머스][PYTHON] Lv. 1 정수 제곱근 판별 (0) | 2024.08.05 |
[프로그래머스][PYTHON] Lv. 1 둘만의 암호 (0) | 2024.07.31 |
[프로그래머스][PYTHON] Lv. 1 카드 뭉치 (0) | 2024.07.31 |
[프로그래머스][PYTHON] Lv. 1 가장 가까운 같은 글자 (0) | 2024.07.30 |