Algorithm/programmers.co.kr

프로그래머스 고득점 kit 풀기 #스택/큐

winney916 2022. 3. 12. 19:54
728x90

1. 기능개발

큐를 사용하면 충분히 해결할 수 있는 문제이다. 다른 사람의 코드를 보다보면, 극단적으로 짧은 코드가 많은 추천 수를 받는걸 확인할 수 있다.

너무 좋은 코드이지만 이해가 어려워 나는 아래와 같은 형태의 조금 더 직관적인 코드를 선호하는 편이다. (컴팩트하게 못짜서 그러는거 맞음ㅋㅋ)

 

내 코드

from collections import deque
def solution(progresses, speeds):
    answer = []
    progresses = deque(progresses)
    speeds = deque(speeds)
    while progresses:
        result = 0
        while len(progresses) > 0 and progresses[0] >= 100:
            progresses.popleft()
            speeds.popleft()
            result += 1
        if result > 0:
            answer.append(result)
        
        for i in range(len(progresses)):
            progresses[i] += speeds[i]
        
    return answer

 

2. 프린터

중요도를 기준으로 프린트를 진행했을 때 지정된 문서가 출력되는 순서를 구하면 된다.

이런 문제를 해결할 때에는 데이터의 구조를 바꾸는 편이다.

 

내 코드

from collections import deque
def solution(priorities, location):
    answer = 0
    printer = deque()
    for p in range(len(priorities)):
        if p == location:
            printer.append([priorities[p],1])
        else:
            printer.append([priorities[p],0])
    priorities = sorted(priorities, reverse=True)
    print(printer, priorities)
    while printer:
        p, t = printer.popleft()
        if p == priorities[answer]:
            answer += 1
            if t:
                break
        else:
            printer.append([p,t])
    
    return answer

que상에 저장할 때 1과 0을 함께 저장한다. 1이 저장된 데이터가 출력될 때까지 count를 해주면 된다.

 

다른 코드

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

논리 자체는 비슷하지만 훨씬 깔끔하다고 느낀 코드이다.

 

3. 다리를 지나는 트럭

집중력이 떨어져 문제 이해에 많은 시간이 소요됐다. 제대로 이해하지 못한 채 진행하면 엄청 버거워진다. 제발 집중좀 하자. (아침 일찍 일어나자마자 공부를 진행해야한다!)

 

내 코드

from collections import deque
def get_2D(l):
    result = 0
    for i in l:
        result += i[0]
    return result
def solution(bridge_length, weight, truck_weights):
    answer = 0
    on_bridge = deque() # (w,on)
    truck_weights = deque(truck_weights)
    answer += 1
    on_bridge.append([truck_weights.popleft(), bridge_length])
    
    while on_bridge:
        answer += 1
        if len(on_bridge) > 0:
            # 시간 지연
            for c in on_bridge:
                c[1] -= 1
            while len(on_bridge) > 0 and on_bridge[0][1] == 0:
                on_bridge.popleft()
            # print(on_bridge)
            if len(truck_weights) > 0 and get_2D(on_bridge) + truck_weights[0] <= weight:
                on_bridge.append([truck_weights.popleft(), bridge_length])
        
    return answer

다른 문제들과 비슷하게 접근했다. 큐에 저장할 때 다리를 건너는 정도를 의미하는 정수를 추가로 저장한다. while문을 돌 때마다 필요한 변수들을 조절하고 조건을 만족할 때 pop하면 된다.

 

4. 주식 가격

쉬운 문제인데, 문제의 예시가 날 헷갈리게 했다.

 

[1,2,3,2,3] 일 경우에

1은 끝까지 가격이 떨어지지 않았다 -> 4 (1 이후의 숫자가 4개)

2는 끝까지 가격이 떨어지지 않았다 -> 3 (2 이후의 숫자가 3개)

3은 1초 뒤 가격이 떨어졌다 -> 1 ? 뒤에 크거나 같은 숫자 없는데?

 

이래서 조금 어려줬는데, 작은 숫자가 나올 때 1을 더해서 return했더니 통과했다.

 

내 코드

from collections import deque
def solution(prices):
    answer = []
    prices = deque(prices)
    while prices:
        n = prices.popleft()
        result = 0
        for p in prices:
            if p >= n:
                result += 1
            else:
                result += 1
                break
        answer.append(result)
        
    return answer

깔끔했다.

 

다 풀긴 했는데 약간 이상한 부분은

분명 스택/큐 인데 큐 하나로 다 풀었다.

 

뭐지? 스택은 잘 안나오나?