코딩테스트/PYTHON

[프로그래머스][PYTHON] Lv. 1 대충 만든 자판

_알파카 2024. 8. 5. 15:53
728x90

문제 설명

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

 

프로그래머스

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

programmers.co.kr

 

이 문제는 풀다가 잘 안되는 부분이 있어서 다른 사람의 풀이를 보고 푼 문제이다. 

"입출력 예 설명"에 나온대로 구현하면 되는 문제이다. 

 

 

풀이

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