https://programmers.co.kr/learn/courses/30/lessons/42586
스택/큐 탭에 있어서 그렇게 풀고자 노력했는데
한시간 반 동안 헤매다 풀었다!! 넘 뿌듯하다
import queue, math
def solution(p, s):
q = queue.Queue()
answer = []
length = len(p)
# 계산하기 - 며칠 째에 배포가 가능한지?
t = [(math.ceil(((100-p[i])/s[i]))) for i in range(length)]
print(t)
# 큐를 이용하여
# 1. 이전 리스트 값보다 크면 큐 길이를 세주고, 큐 초기화
# 2. 이전 리스트 값보다 작으면 큐에 붙여줌
temp = t[0]
for i in range(1, length):
# 앞 원소가 작은 경우 : 큐에다 붙여줌
if temp >= t[i]:
q.put(t[i])
else:
# 뒤 원소가 큰 경우
q.put(t[i])
answer.append(q.qsize())
q.queue.clear()
temp = t[i]
if q.qsize() != 0:
q.put(t[i])
answer.append(q.qsize())
else:
answer.append(1)
return answer
python에는 queue모듈을 사용할 수 있으므로 이 모델을 사용했다.
큐는 FIFO(First In First Out)으로 먼저 들어온 친구부터 나가게 되는 자료구조를 의미한다.
우선 큐 모델 사용방법을 간단히 알아보자면
import queue
# 선언해주기
q = queue.Queue()
# 값 추가하기
q.put(1)
# 값 제거하기
q.get()
# 큐 길이 확인하기
q.qsize()
# 큐 안에 있는 원소 전부 초기화하기
q.queue.clear()
이렇게 되어있다.
나의 로직은
- 남은 작업률을 t라는 배열에 계산하여 저장해준다.
- 이 t라는 배열에서 현재값과 이전 값을 비교하여
2-1. 현재 값이 이전 값보다 크거나 같으면 현재 값을 큐에다 붙여줌
2-2. 현재 값이 이전 값보다 작으면 현재 값을 큐에다 붙여주고, answer에 답을 넣어주며 큐를 초기화해줌
이렇게 구현해봤는데
마지막 값이 제대로 넣어지지 않는 것을 확인했다.
그래서 만약 큐 사이즈가 0이라면 1개의 작업이 있다는 뜻이므로 1을 넣어주고
0보다 크다면 qsize만큼 배열을 붙여준다!
이전에 프로그래머스에서 풀이 된 내용을 보니 큐로 구현을 하지 않았는데 이번에 구현을 하게 되어서 너무나 뿌듯하다!