기능개발
아이디어
풀이 초반에는 남은 일수의 규칙성을 가지고 풀이를 시도했었다.
제시된 보기와 간단한 데이터 조작으로 규칙성이 보였기 때문인데 코테는 항상 보기만 만족해서는 답이 없다.
이후에는 예전에 풀었던 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
대충 만든 자판
아이디어
개인적으로는 기능개발 문제 보다는 해당 문제가 난이도가 많이 낮았다고 생각한다.
그저 총 합만 구하면 되는 문제로 대충 해당 문자가 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 |