본문 바로가기
알고리즘 문제풀이/프로그래머스 고득점 Kit

[프로그래머스] 고득점 Kit - 스택/큐

by summer_light 2023. 6. 13.

# 내 풀이
def solution(arr):
    answer = []
    for x in arr:
        if answer == [] or answer[-1] != x:
            answer.append(x)
    return answer
# 참고 풀이
# 빈 배열일 가능성이 있는 경우 슬라이싱 활용
# answer[-1] 은 빈 배열일 때 오류가 나지만, answer[-1:]은 오류가 나지 않는다.
def solution(arr):
    answer = []
    for x in arr:
        if answer[-1:] == [x]: continue
        answer.append(x)
    return answer

# 내 풀이
def solution(progresses, speeds):
    time = []
    for i, x in enumerate(progresses):
        time.append((100 - x) // speeds[i] + (((100 - x) % speeds[i]) and 1))

    i = 0
    temp = []
    ret = []
    for x in time:
        if temp == []:
            temp.append(x)
        if temp[-1] < x:
            ret.append(i)
            i = 0
            temp.append(x)
        i += 1
    return ret + [i]

# 참고 풀이
# zip을 이용해서, p와 s를 간단하게 표현.
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]

[내 풀이]
def solution(s):
    stk = []
    for x in s:
        if x == '(':
            stk.append(x)
        else: 
            if stk == []:
                return False
            else:
                stk.pop()
    return True if len(stk)==0 else False

# 실제 stk에 무슨 값이 있나보다는, 개수가 중요하기 때문에 cnt를 기준으로 생각하는 게 효율적이다. 
# 더 깔끔하게 표현할 수 있는 방법 존재: 같은 cnt 변수를 쓰기 때문에 cnt = ~ if else ~ if ~ 와 같이 쓸 수 있었다. 
# 변수 = 값1 if 조건1 else 값2 if 조건2 else 값3 

[참고 풀이]
def solution(s):
    cnt = 0
    for x in s:
        cnt = cnt+1 if x=='(' else cnt-1 
        if cnt < 0:
            break
    return cnt == 0

# 내 풀이
# if any(x<y for x, y in (zip([p]*len(pri_loc), [x[0] for x in pri_loc]))):
# if any(p < x[0] for x in pri_loc): 이렇게 표현해도 되는 것이었다.
from collections import deque
def solution(priorities, location):
    pri_loc = deque([(x ,i) for i, x in enumerate(priorities)])
    cnt = 0
    while pri_loc:
        p, l = pri_loc.popleft()
        if any(x<y for x, y in (zip([p]*len(pri_loc), [x[0] for x in pri_loc]))):
            pri_loc.append((p, l))
        else:
            cnt += 1
            if l == location:
                return cnt

# 참고풀이
# cur[1] 은 상수고, q[1] for q in queue 는 literable 인데도 any( )로 비교가 된다. (굳이 나 처럼 자료형 맞출 필요가 없었다.)
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

# 내 풀이
from collections import deque
def solution(bridge_length, weight, truck_weights):
    current_weight = 0
    time = 0
    truck_weights = deque(truck_weights)
    trucks = deque()
    while True:
        if truck_weights:
            if current_weight + truck_weights[0] <= weight:
                current_weight += truck_weights[0]
                trucks.append((truck_weights.popleft(), time + bridge_length))
        time += 1
        if trucks and time == trucks[0][1]:
            current_weight -= trucks.popleft()[0]
        if not trucks and not truck_weights:
            return time + 1

# 참고풀이
# [0000] [0007] 이렇게 다리 위의 값을 가시화 하는 방법. 훨씬 직관적이다.
# 리스트를 reverse 해서 pop() 효율을 높이는 방법, 한 쪽으로만 값이 나오는 경우 그냥 stk 인 채로 pop만 사용해도 된다. (굳이 deque X)
from collections import deque

def solution(bridge_length, weight, truck_weights):
    total_weight = 0
    step = 0
    bridge = deque(0 for _ in range(bridge_length))
    truck_weights.reverse()

    while truck_weights:
        total_weight -= bridge.popleft()
        if total_weight + truck_weights[-1] > weight:
            bridge.append(0)
        else:
            truck = truck_weights.pop()
            bridge.append(truck)
            total_weight += truck
        step += 1

    step += bridge_length

    return step

 

# 내 풀이 O(n^2)
# i번째 원소를 기준으로 나머지 값들을 전부 비교 
# O(n^2)라서, 비효율적 
def solution(prices):
    answer = []
    for i in range(len(prices)):
        t = 0
        for j in range(i+1, len(prices)):
            t += 1
            if prices[j]<prices[i]:
                break
        answer.append(t)
    return answer

# 참고풀이 O(n)
# 값이 떨어지는 것이 발견 된 시점'에서만' 스택을 최근값 부터 확인 후 결론 내기
# 스택 안의 값들은 모두 오름 차순인 것이 확실하기 때문에 가능한 것. 마지막 값만 확인하면 된다.
def solution(prices):
    stack = []
    answer = [0] * len(prices)
    for i in range(len(prices)):
        while stack != [] and stack[-1][1] > prices[i]:
            past, _ = stack.pop()
            answer[past] = i - past
        stack.append([i, prices[i]])
    for i, s in stack:
        answer[i] = len(prices) - 1 - i
    return answer

댓글