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

채채·2023년 3월 4일
0

프로그래머스 Lv.1

목록 보기
2/2

✅ 문제 링크

대충 만든 자판 - 프로그래머스


✅ 문제 설명

  • 휴대폰 자판: 하나의 키에 여러 개 문자 할당
  • 동일한 키를 연속해서 누르면, 할당된 순서대로 문자가 바뀜
  • 1번 키에 A, B, C 할당되었다면 2번 누르면 B 입력 가능
  • 키의 개수는 1~100개 가능
  • 입력되는 문자는 무작위 배열
  • 같은 문자가 자판 여러개에 할당되기도 하고, 키 하나에 같은 문자가 여러 번 할당되기도 함
  • 아예 할당되지 않은 문자도 있을 수 있음 => 몇몇 문자열은 작성 불가할수도
  • 특정 문자열을 작성하고자 할 때, 키를 '최소' 몇 번 눌러야 할까? (return 값)
  • 입력값: 키마다 할당된 문자열 배열 keymap, 입력하고자 하는 문자열 배열 targets
  • 목표 문자열 작성 불가시 -1 return

✅ 제한사항

  • 1 ≤ keymap의 길이 ≤ 100
  • 1 ≤ keymap의 원소의 길이 ≤ 100
  • keymap[i]는 i + 1번 키를 눌렀을 때 순서대로 바뀌는 문자를 의미합니다.
  • 예를 들어 keymap[0] = "ABACD" 인 경우 1번 키를 한 번 누르면 A, 두 번 누르면 B, 세 번 누르면 A 가 됩니다.
  • keymap의 원소의 길이는 서로 다를 수 있습니다.
  • keymap의 원소는 알파벳 대문자로만 이루어져 있습니다.
  • 1 ≤ targets의 길이 ≤ 100
  • 1 ≤ targets의 원소의 길이 ≤ 100
  • targets의 원소는 알파벳 대문자로만 이루어져 있습니다.

✅ 나의 풀이

📌 idea : 모든 키를 검사하여 해당 문자 입력 가능한지 먼저 검사하자

  1. targets 개수만큼 반복
  2. targets 각 문자열의 문자들을 현재 할당된 keymap으로 입력이 가능한지 검사해야 함!
  3. 입력하고 싶은 문자열이 "ABCD"라면, keymap이 ["ABACD", "BCEFD"] 로 들어왔을 때 가장 첫 번째 문자 A를 입력할 수 있는 가장 최소의 수는 첫 번째 키에서는 1, 두 번째 키에서는 '없음'임
  4. 이런 식으로 문자열의 모든 문자에 대해 일단 현재의 keymap으로 입력이 가능한지 검사
  5. 입력이 안 될 경우 => 바로 -1 return하고 break
  6. 입력이 가능할 경우 => 각 키에서 몇번의 입력으로 가능한지 find 함수로 계산한 뒤 배열에 추가
  7. min 함수를 통해 해당 배열에서 최소값을 구한 뒤 총합에 더하기
  • 주의 할 점은, 해당 문자를 찾지 못한다고 판단했을 경우 바로 break해서 빠져나와야 한다는 점! 그렇지 않으면 다른 문자로 넘어가서 sum을 구해주게 된다..
  • 또 다른 주의할 점은, find 함수는 해당 문자의 index를 반환해주는데 index는 늘 그렇듯 0부터 시작한다는 점... 따라서 +1 해서 더해줘야함~

🔴 내가 만난 오류들..
'list' object cannot be interpreted as an integer
=> for문 돌릴 때 len(targets) 로 설정해야 하는데 그냥 targets로 넣음 ㅋ

min() arg is an empty sequence
=> 각 key에서 해당 문자를 입력할 수 있는 최소값을 배열 a에 추가하였으나, 모든 key에서 해당 문자를 입력할 수 없는 경우 a는 빈 배열이 됨
=> 따라서 빈 배열인 경우에는 min 함수를 처리할 수 없게 되므로, 위의 오류가 뜬다
=> 먼저 빈 배열인 경우 -1 을 반환하는 처리를 먼저 해준 뒤, 빈 배열이 아닐 경우 min 함수를 계산하는 식으로 해야함

'int' object is not iterable
정말.. 어려운 오류였다..
=> 배열 a에 저장되는 요소는 숫자임, 즉 자료형이 integer
=> 그러나 숫자 int 그 자체는 반복이 불가능함
=> 리스트 함수의 원형은 list([iterable])
=> 그러나 나는 a 를 빈 리스트로 선언
=> a에 정수 한 개만 저장된 경우 a를 정수 자체로 받아들이기 때문에 반복 불가능하다고 판단하는 듯
=> 숫자 7 자체를 len 함수 적용시키지 못하는 것과 같음!
그러나 아직도 이해는 잘 안간다.. a를 '리스트'로 선언했는데 정수 요소가 추가될지언정 len이 적용될 수 있는게 아닌지..? 아직도 헷갈림 ㅠㅠ
=> 어쨌든 len(a) 를 통해 a의 요소가 2개 이상일 경우에만 min 함수를 적용하여 구하려고 했던 건데, 이 부분을 그냥 a가 비었는가 안 비었는가 if-else문으로 바꿔서 오류 해결함


✅ CODE

def solution(keymap, targets):
    answer = []
    a = []
    sum = 0

    for i in range(len(targets)):
        for j in targets[i]:
            for km in keymap:
                if j in km:
                    a.append(km.find(j)) 
            if not a: sum = -1; break; 
            else: sum += min(a)+1 
            a = []
        answer.append(sum)
        sum = 0
            
    return answer

✅ In the End..

오류들이 생길때마다 그래도 배우는 점이 생기는 것 같다ㅎ
가끔 읭? 스럽고 이건 왜? 싶기도 하지만... 일단.. 납득하는중
얼른 Lv.1 정복하고싶다! 으쟈쟈

profile
성장하는 사람

0개의 댓글