프로그래머스 Level 1 대충 만든 자판 파이썬 문제 풀이 입니다.
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/160586
✅ Python3 답안 입니다 더보기 클릭!
NOT_FOUND = 999999999999999999
def find(keymap,c):
arr = []
for key in keymap:
if c in key:
arr.append(key.find(c)+1)
else:
arr.append(NOT_FOUND)
return min(arr) # keymap 에서 찾은 최소 누름 횟수
def solution(keymap, targets):
answer = []
for target in targets:
sum = 0 # targets 총 눌러야 하는 횟수 합
for t in target:
x = find(keymap,t)
if x == NOT_FOUND:
answer.append(-1)
break
else:
sum += x
else:
answer.append(sum)
return answer
📌 해설
어렵지 않은 구현문제 입니다. 다른 사람의 풀이를 보니 효율적인 방법이 많더라구요! dict 나 ord 를 이용해 푼 방법들이 기억에 남습니다.
시간, 메모리 측면에서 더 효율적이고 아름다운 방법들을 고민해보면 추후에 더 어려운 문제를 풀 때 많은 도움이 될 듯합니다!
def solution(keymap, targets):
answer = []
for target in targets:
sum = 0 # targets 총 눌러야 하는 횟수 합
for t in target:
x = find(keymap,t)
처음 시작은 targets 를 이중 for 문으로 순회하면서 시작합니다.
sum 에는 각 targets (타겟이 되는 문자열) 을 총 key 몇번을 눌러야 하는지 횟수의 합을 저장할 것 입니다.
0으로 시작하여 sum 에 넣어둡니다.
그리고 find 라는 함수를 하나 정의하여 target 의 각 문자 하나씩 넣습니다.
find 에서는 keymap 을 돌게 해서 keymap을 몇번 눌러야 할지 정해 x에 담을 것입니다.
NOT_FOUND = 999999999999999999
def find(keymap,c):
arr = []
for key in keymap:
if c in key:
arr.append(key.find(c)+1)
else:
arr.append(NOT_FOUND)
return min(arr) # keymap 에서 찾은 최소 누름 횟수
NOT_FOUND 라는 상수를 정의합니다.
저는 크다고 생각하는 숫자를 대충 집어넣었습니다.
float("inf")
9999... 대신 float("inf")를 써도 괜찮을 듯 합니다.
그리고 find 는 keymap을 for문으로 순회하면서
문자 c 가 있는지 없는지 확인합니다.
keymap 에 문자 c가 존재하지 않으면 NOT_FOUND를 arr에 담습니다.
keymap 에 문자 c가 존재하면 인덱스를 찾아 arr 에 담습니다.
그리고 keymap을 모두 돌았으면 min(arr) 을 반환시켜서
문자 c를 keymap 에 따라 눌렀을때 모든 케이스 중 가장 적은 횟수를 반환 할 수 있습니다.
def solution(keymap, targets):
answer = []
for target in targets:
sum = 0 # targets 총 눌러야 하는 횟수 합
for t in target:
x = find(keymap,t)
if x == NOT_FOUND:
answer.append(-1)
break
else:
sum += x
else:
answer.append(sum)
return answer
다시 원래 함수로 돌아와서 for 문을 보면
만약 find 로 구한 최소횟수가 NOT_FOUND 이면, answer 에 -1 을 append 하고 break 합니다.
NOT_FOUND 가 아닌 최소 횟수를 구했다면, sum 에 최소횟수 x 를 합산합니다.
만약 안쪽 for 문 안에서 한번도 break에 걸리지 않았다면 answer 에 sum 을 append 해줍니다.
targets 를 도는 for 문이 모두 끝났다면 answer 을 반환하고 끝납니다.
::
다소 효율적인 풀이는 아니지만 빠르게 풀고 이해하기에는 위 풀이 방법도 나쁘지 않을 듯 합니다~
시간, 메모리 등이 고려된 다른 풀이도 많이 보면 좋을 듯 합니다!
'✅ 문제풀이' 카테고리의 다른 글
프로그래머스 조건에 맞는 도서와 저자 리스트 출력하기 MySQL (0) | 2023.10.15 |
---|---|
프로그래머스 Level 1 문자열 나누기 Javascript (0) | 2023.10.14 |
프로그래머스 - 공원산책 파이썬 python (0) | 2023.10.03 |
[그리디 알고리즘] 이코테 - 1이 될 때까지 (0) | 2021.12.01 |
프로그래머스 - 괄호변환 파이썬 python (0) | 2021.11.18 |