문제

https://programmers.co.kr/learn/courses/30/lessons/42586

풀이

def solution(progresses, speeds):
    import math
    answer = []
    Q = []

    for p, s in zip(progresses, speeds) :
        day = math.ceil((100-p)/s)

        if not Q :  # 큐가 비어있으면 그냥 추가
            Q = [day]

        else :      # 큐에 한 개 이상 있을 때
            if day > Q[0] :  # 현재 값이 큐 내부의 가장 큰 값보다 크면
                answer.append(len(Q))
                Q = [day]
            else :           # 현재 값이 큐 내부의 갖아 큰 값보다 작거나 같다면
                Q.append(day)

    answer.append(len(Q))    # 루프를 나온 후 마지막 값
    return answer

저번 문제에서 배웠던 zip을 잘 활용한 것 같다. 뿌듯!
나머진 문제가 쉬웠다.
더 나은 풀이나 구경하자.

더 나은 풀이

def solution(progresses, speeds):
    Q=[]
    for p, s in zip(progresses, speeds):
        if len(Q) == 0 or Q[-1][0] < -((p-100)//s):
            Q.append([-((p-100)//s),1])
        else:
            Q[-1][1]+=1
    return [q[1] for q in Q]

해시처럼 구성해서 풀어낸 답변.
len(Q)를 이용해서 비어있는 리스트를 잡아낼 수 있구나.
Q[-1][0]은 가장 마지막 해시의 키.

-((p-100)//s) 이게 진짜 미쳤다 싶었는데,
그냥 (p-100)/s 를 진행하면 나머지가 남아 올림이 필요하다.
근데 math 라이브러리 쓰기 싫어서 음수로 계산해버림.
양수에서 소수점 올림 == 음수에서 소수점 버림 이니까.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

그 후에 작거나 같으면 해시의 값 증가시키고…
해시의 값들만 리스트로 반환!

음수로 나누는 건 진짜 깜짝 놀랐다.
두고두고 써먹자.

댓글남기기