코딩테스트

[프로그래머스][Python] 대충 만든 자판

yeeejji 2024. 4. 28. 15:44
728x90

Lv. 1

⌨️

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

 

프로그래머스

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

programmers.co.kr

 

 

내 풀이

def solution(keymap, targets):
    answer = []
    
    for T in targets:
        ans = 0 # 눌려야 하는 키의 수
        exist = 0 # 찾는 문자가 없는 경우 -1
        for t in T:
            indexes = [] # 찾는 문자가 저장되어 있는 위치들 저장
            for k in keymap:
                indexes.append(k.find(t)) # 찾는 문자의 인덱스 저장
            index = set(indexes) # 중복 제거
            if -1 in index: # 못 찾은 케이스가 있는 경우
                index.remove(-1) # -1 삭제
            if len(index) == 0: # 못 찾은 케이스 밖에 없었던 경우 (찾는 문자가 어디에도 없음)
                answer.append(-1)
                exist = -1 # 찾는 문자가 없음을 표시
                break
            ans += min(index) + 1 # 눌러야 하는 최소 횟수 더하기
        if exist == 0: # 찾는 문자가 있는 경우에만 answer에 ans 추가
            answer.append(ans)
        
    return answer

 

 

코드 설명

 

keymap: 1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자열 리스트

targets: 입력하려는 문자열들이 담긴 문자열 배열

 

입력하려는 현재 문자열을 모두 검사한다.

for T in targets:

 

ans: 현재 문자열을 입력하기 위해 눌려야 하는 키의 수를 저장하는 변수. 현재 문자열의 모든 문자를 돌며 수를 증가시킨다.

exist: 현재 문자열의 문자들 중에 어디에도 존재하지 않는 문자가 있는지 식별하는 변수

(찾는 문자가 있는 경우: 0 (default), 찾는 문자가 없는 경우: -1)

ans = 0 # 눌려야 하는 키의 수
exist = 0 # 찾는 문자가 없는 경우 -1

 

현재 문자열의 모든 문자를 검사한다.

for t in T:

 

indexes: 찾는 문자가 저장되어 있는 위치를 모두 저장하는 리스트

keymap의 모든 요소를 돌면서, 현재 찾고 있는 문자가 위치해있는 인덱스를 저장한다.

index: indexes의 집합 (중복 제거를 위함)

indexes = [] # 찾는 문자가 저장되어 있는 위치들 저장
for k in keymap:
    indexes.append(k.find(t)) # 찾는 문자의 인덱스 저장
index = set(indexes) # 중복 제거

 

index에 -1이 존재한다? ➡ 현재 문자를 못 찾은 케이스가 있다.

index에서 -1(못 찾은 케이스)을 삭제한다.

if -1 in index: # 못 찾은 케이스가 있는 경우
    index.remove(-1) # -1 삭제

 

-1을 삭제하니 아무것도 남아있지 않음 찾는 문자가 어디에도 없음을 의미한다.

정답 리스트에 -1을 추가해준 뒤, exist 변수를 -1로 변경해 찾는 문자가 없음을 표시하고, break문으로 for문을 탈출한다.

if len(index) == 0: # 못 찾은 케이스 밖에 없었던 경우 (찾는 문자가 어디에도 없음)
    answer.append(-1)
    exist = -1 # 찾는 문자가 없음을 표시
    break

 

현재 문자열을 입력하기 위해 눌려야 하는 키의 수(ans)에 찾는 문자의 위치 리스트 중 최솟값 + 1을 더한다.

ans += min(index) + 1 # 눌러야 하는 최소 횟수 더하기

 

for문이 끝나고 나면, 현재 문자열들의 모든 문자가 찾아진 경우에만 정답리스트에 눌려야 하는 키의 수를 추가해준다.

찾는 문자가 없는 경우는 이미 for문 안에서 -1을 추가해줬기 때문!

if exist == 0: # 찾는 문자가 있는 경우에만 answer에 ans 추가
    answer.append(ans)

 

쉽지 않았따,,! 👽