728x90
코딩테스트 연습 - 대충 만든 자판 | 프로그래머스 스쿨 (programmers.co.kr)
카카오 문제답게 역시 지저분하다.
문제를 제대로 읽지 않으면 수많은 에러에 갇히기 때문에 반드시 조건들을 잘 읽어볼 것.
솔직히 빨리 풀어보고 싶었는데,
도저히 for 문 말고는 생각나는 게 없다.
그 안에서 함수에 따라 리팩토링하는 방법밖에 존재하지 않아서..
조건이 많기 때문에 조건의 순서를, 조건의 방식을 어떻게 풀어낼지가 큰 관건이다.
def solution(keymap, targets):
answer = []
for target in targets: # target의 각 인덱스
result = 0 # target을 작성하기 위한 총 횟수
for i in target: # target 문자열 하나씩 눌러야하는 횟수 계산하기
c = 101 # 100번까지 가능하므로 101을 max로 초기화
flag = False # 문자열을 숫자로 변환하는 과정에서 변환 중 에러가 발생한 경우 처리
for k in keymap:
key = k.find(i)
if key == -1: # k에 존재하지 않으면 continue
continue
c = min(key+1, c) # k에 존재하면 key+1과 c 중 작은 값으로 c 설정
flag = True # 해당 문자열 존재함으로 flag 표시
if flag: # True이면 result에 누적
result += c
else: # 그렇지 않으면 keymap에 없는 문자이므로 answer에 -1 추가
answer.append(-1)
break
else: # for-else 구문: for문이 온전하게 종료되면 result를 answer에 추가
answer.append(result)
return answer
플래그를 False로 설정함으로써 식의 종료를 정해주는 것과
find함수를 사용하는 것이 풀이의 특징이 된다.
# 다른 사람의 코드
def solution(keymap, targets):
answer = []
hs = {}
for k in keymap:
for i, ch in enumerate(k):
hs[ch] = min(i + 1, hs[ch]) if ch in hs else i + 1
for i, t in enumerate(targets):
ret = 0
for ch in t:
if ch not in hs:
ret = - 1
break
ret += hs[ch]
answer.append(ret)
return answer
여기서는 enumerate를 적극적으로 사용. 딕셔너리로 푸는 것이 이번 문제에선 가장 효율적인 것 같다.
결과적으로 런타임에러를 만들지 않기 위해 break 장치를 만들어줘야 함.
'cording test' 카테고리의 다른 글
LV.1 2016년 (0) | 2023.06.02 |
---|---|
Lv.2 피로도 (0) | 2023.05.31 |
Lv.2 스킬트리 (2) | 2023.05.20 |
Lv.1 시저 암호(ascii code 사용) (0) | 2023.05.20 |
Lv.0 코드 처리하기 (0) | 2023.05.20 |