본문 바로가기

학습 노트/알고리즘 (Python)

99클럽 - 기능개발, 대충 만든 자판

기능개발

 

프로그래머스

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

programmers.co.kr

아이디어

풀이 초반에는 남은 일수의 규칙성을 가지고 풀이를 시도했었다.

제시된 보기와 간단한 데이터 조작으로 규칙성이 보였기 때문인데 코테는 항상 보기만 만족해서는 답이 없다.
이후에는 예전에 풀었던 SK의 문제 중 하나인 트랙데이 문제가 생각이 나서 데이터를 과감히 음수로 보내버려 기한이 얼마나 지났는지를 하나씩 체크하는 것으로 전략을 바꿨다.

이를테면 위와 같은 방식이다.
어차피 앞의 작업이 완료되지 못하면 뒤의 작업을 먼저 내보낼 수 없으므로 가장 앞의 작업이 0 이하로 변하는 순간에 뒤완료된 작업들을 함께 세서 넘겨주면 된다.

아무래도 선입선출 구조 때문에 queue나 stack을 사용하면 조금 더 편할 것 같다는 생각이 드는데 개인적으로는 코딩테스트에서 import 하는 것을 별로 좋아하지 않아서 재귀법으로 풀었다.

풀이

def solution(progresses, speeds):
    answer = []
    remain_time = []
    
    for val in progresses:
        remain_time.append(100 - val)
        
    while remain_time:
        cnt = 0
        for idx, val in enumerate(remain_time):
            remain_time[idx] = val - speeds[idx]
        
        for val in remain_time:
            if val <= 0:
                cnt += 1
            else:
                break
        
        if cnt > 0:
            for i in range(cnt):
                remain_time.pop(0)
                speeds.pop(0)
            answer.append(cnt)\
                
    return answer

 

대충 만든 자판

 

프로그래머스

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

programmers.co.kr

아이디어

개인적으로는 기능개발 문제 보다는 해당 문제가 난이도가 많이 낮았다고 생각한다.
그저 총 합만 구하면 되는 문제로 대충 해당 문자가 map에 존재하는지 체크하고, 존재한다면 최소 값을 더해준다.

풀이

def solution(keymap, targets):
    answer = []
    
    for target in targets:
        cnt = 0
        
        for cha in target:
            map_check = []
            
            for k_map in keymap:
                temp = k_map.find(cha)
                
                if temp != -1:
                    map_check.append(temp + 1)
                else:
                    map_check.append(temp)
            
            map_check = list(set(map_check))
            
            if -1 in map_check:
                map_check.remove(-1)
            
            if map_check:
                cnt += min(map_check)
            else:
                answer.append(-1)
                cnt = 0
                break
        
        if cnt != 0:
            answer.append(cnt)
    
    return answer

판단하기 귀찮기도 하고, 의미 없는 중복 데이터는 set으로 바꿔 제거해 주는데 이렇게 되면 keymap이 100000개가 들어와도 필요한 유효 데이터를 순식간에 추출할 수 있다.
배열 검색에 사용한 find 메서드는 검색 실패 시 -1을 반환하는데 이것만 체크해서 배열의 유효성을 검사하면 최솟값도 간단히 구할 수 있다.
주의할 점은 예외처리해서 for문을 찢고 나올 때 cnt를 초기화하는 것을 잊지 말아야 한다는 것이다.

14번 케이스부터 에러가 발생한다면 예외처리시 초기화에 문제가 있는 것이니 잘 확인해 볼 것.

'학습 노트 > 알고리즘 (Python)' 카테고리의 다른 글

99클럽 - JadenCase 문자열 만들기  (0) 2024.04.15
99클럽 - 모음사전  (0) 2024.04.13
99클럽 - 이진 변환 반복하기  (0) 2024.04.11
Stack #2  (0) 2022.06.23
Stack #1  (0) 2022.06.04