[프로그래머스] 스택/큐

기능개발

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

내 풀이

정확성: 100.0
합계: 100.0 / 100.0

def solution(progresses, speeds):
    ans = []
    release = []
    for i in range(len(progresses)):
        p = (100 - progresses[i])
        r = p // speeds[i]
        if p % speeds[i] != 0:
            r += 1
        release.append(r)
    
    prev = release[0]
    cnt = 0
    for r in release:
        if prev < r:
            ans.append(cnt)
            prev = r
            cnt = 1
        else:
            cnt += 1
    ans.append(cnt)
    
    return ans

잔여 업무를 속도로 나눈 값 = 배포까지 걸리는 시간을 release 에 저장

release 를 보면서 이전 값보다 큰 값이 나오면 그 사이 개수를 ans 에 저장
작은 값들은 cnt + 1 로 카운트


프린터

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

내 풀이

정확성: 100.0
합계: 100.0 / 100.0

def solution(priorities, location):
    ans = 1
    i = 0
    cnt = 0
    while priorities:
        if priorities[1:] and priorities[0] < max(priorities[1:]):
            p = priorities.pop(0)
            priorities.append(p)
            if location == 0:
                location = len(priorities)
        else:
            if location == 0:
                break
            priorities.pop(0)
            ans += 1
        location -= 1
        cnt += 1
    
    return ans

priorities 의 첫번째 값만 보면서 이후에 더 큰 값이 있으면 맨 뒤로 붙여줌
=> pop(0) & append(p)
이 때, location 에 해당되는 문서였으면 맨 뒤로 갔으니까
location = len(priorities) 로 update

이후에 더 큰 값이 없다면 출력 확정이니까 pop(0) & 출력 횟수 (ans) + 1
이 때, location 이 확정되는 거면 이후는 볼 필요가 없으니까 break

다른 사람의 풀이

정확성: 100.0
합계: 100.0 / 100.0

def solution(priorities, location):
    queue =  [(i,p) for i,p in enumerate(priorities)]
    answer = 0
    while True:
        cur = queue.pop(0)
        if any(cur[1] < q[1] for q in queue):
            queue.append(cur)
        else:
            answer += 1
            if cur[0] == location:
                return answer

queue 에 (인덱스, 우선순위) 로 묶어서 저장

처음 값을 pop 한 후 남은 queue 의 우선순위들 중에 더 높은게 있는지 확인

  • any(): 하나라도 True 가 있는지 확인

있으면 다시 queue 에 append
없으면 answer + 1 하고 location 인지 확인


다리를 지나는 트럭

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

내 아이디어

여러대의 트럭이 함께 가는 경우,
맨 앞의 트럭만 len(truck_weights) 만큼 걸리고
함께 가는 트럭들은 1 만큼 걸리는 점을 이용해서
트럭마다 걸리는 시간을 계산하려고 했으나 안됨...ㅎ

ex) 6 3 1 2 같은 경우는 6 이 먼저 도착하고 나서야 2 가 올라갈 수 있음

너무 어렵게 생각한 듯...

다른 사람의 풀이

def solution(bridge_length, weight, truck_weights):
    q = [0] * bridge_length
    sec = 0
    
    while q:
        sec += 1
        q.pop(0)
        if truck_weights:
            if sum(q) + truck_weights[0] <= weight:
                q.append(truck_weights.pop(0))
            else:
                q.append(0)
                
    return sec

q 를 다리라고 생각하고 다리 길이만큼의 리스트 생성

while 문이 돌아가는 동안 sec + 1 & q.pop(0)

현재 트럭이 다리 위에 올라가도 된다면 q 에 append
무게가 안된다면 0 append

반복문이 돌아가면서 실제로 트럭이 지나가듯이 q 가 변화함


주식가격

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

내 풀이

정확성: 66.7
효율성: 33.3
합계: 100.0 / 100.0

def solution(prices):
    ans = []
    for i in range(len(prices)):
        cnt = 0
        for j in range(i+1, len(prices)):
            cnt += 1
            if prices[i] > prices[j]:
                break
        ans.append(cnt)
    
    return ans

각 숫자마다 자기 자신 이후에 자신보다 작은 값이 나올때까지 cnt + 1
작은 값이 나오거나 끝까지 다 봤으면 ans 에 append

좋은 웹페이지 즐겨찾기