본문 바로가기
✅ 문제풀이

프로그래머스 - 대충 만든 자판 파이썬 python

by dogfoot.dev 2023. 10. 9.
728x90
728x90

프로그래머스 Level 1 대충 만든 자판 파이썬 문제 풀이 입니다.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

✅ 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 을 반환하고 끝납니다.

 

 

::

다소 효율적인 풀이는 아니지만 빠르게 풀고 이해하기에는 위 풀이 방법도 나쁘지 않을 듯 합니다~ 

시간, 메모리 등이 고려된 다른 풀이도 많이 보면 좋을 듯 합니다!

 

728x90
반응형