cording test

LV.1 대충 만든 자판

JM Lee 2023. 5. 31. 03:17
728x90

코딩테스트 연습 - 대충 만든 자판 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

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