Writer : Harim Kang
스택과 큐 자료구조를 사용하는 문제입니다. 파이썬에서는 리스트를 사용합니다. 스택과 큐의 파이썬 구현에 대한 내용은 아래의 포스팅에 있습니다. 문제의 코드들은 모두 다 통과를 한 코드입니다.
https://davinci-ai.tistory.com/16?category=911813
또한, 해당 포스팅에서 푸는 문제는 아래의 6가지 문제입니다.
해당 문제들은 프로그래머스의 코딩테스트 연습 > 코딩테스트 고듬적 kit > 스택/큐에 모여있는 6문제입니다.
https://programmers.co.kr/learn/courses/30/parts/12081
https://programmers.co.kr/learn/courses/30/lessons/42588
def solution(heights):
answer = [0 for _ in range(len(heights))]
for i in reversed(range(len(heights))):
cur = 0
for j in range(i):
if heights[i] < heights[j]:
cur = j + 1
answer[i] = cur
return answer
https://programmers.co.kr/learn/courses/30/lessons/42583
continue_ : 해당 리스트는 다리를 건너는 중인 트럭을 담은 리스트입니다. continue_안에는 [트럭의 무게, 다리위의 위치]의 형태로 이루어집니다.
finish : 해당 리스트는 다리를 다 건넌 트럭을 담은 리스트입니다.
timer : 시간을 재는 정수로서 반복분이 돌때마다 1초가 추가됩니다.
cur_w : 현재 다리위의 트럭 무게의 총합입니다.
num은 트럭의 총 대수이고, finish의 트럭 수가 num 이상이 되면 반복문을 종료합니다.
finish = []
continue_ = []
timer = 0
num = len(truck_weights)
while len(finish) < num:
timer = timer+1
다리 위에 트럭이 존재하면 if continue_: 안쪽의 코드로 들어가고 존재하지 않으면 else: 문으로 진행됩니다. else문에서는, 대기 트럭이 존재할 때 다리위로 옮기는 역할을 합니다.
if continue_:
# 다리 위에 트럭이 존재할 때
else:
# 다리 위에 트럭이 없으면,
if truck_weights: # 대기 중인 트럭이 있을 때,
# 맨 앞 순서의 트럭을 빼서, 다리 위로 옮긴다.
continue_.append([truck_weights.pop(0),1])
continue_ 리스트를 순회합니다.
[트럭 무게, 다리에서 위치] 중 무게가 0이면 다음 순서로 넘어갑니다.
트럭 무게가 0이상이면, 다리에서의 위치에 1을 더해서 위치를 1만큼 움직여줍니다.
1만큼 움직인 위치가 다리의 길이보다 길다면 트럭을 finish 리스트에 넣고 continue_의 원래 자리는 초기화 해줍니다.
1만큼 움직인 위치가 다리 길이보다 작다면, cur_w에 트럭 무게를 더해줍니다.
for i in range(0, len(continue_)):
if continue_[i][0] == 0:
continue
continue_[i][1] = continue_[i][1] + 1
if continue_[i][1] >bridge_length:
finish.append(continue_[i][0])
continue_[i] = [0, 0]
else:
cur_w = cur_w + continue_[i][0]
대기 중인 트럭이 존재하고, 대기 중 트럭의 맨앞 트럭의 무게 + 현재 다리위의 트럭 무게 총합이 제한 무게 이하라면, 트럭을 하나 다리 위로 올립니다.
if truck_weights and (cur_w + truck_weights[0] <= weight):
continue_.append([truck_weights.pop(0), 1])
def solution(bridge_length, weight, truck_weights):
finish = []
continue_ = []
timer = 0
num = len(truck_weights)
while len(finish) < num:
timer = timer+1
cur_w = 0
if continue_:
for i in range(0, len(continue_)):
if continue_[i][0] == 0:
continue
continue_[i][1] = continue_[i][1] + 1
if continue_[i][1] >bridge_length:
finish.append(continue_[i][0])
continue_[i] = [0, 0]
else:
cur_w = cur_w + continue_[i][0]
if truck_weights and (cur_w + truck_weights[0] <= weight):
continue_.append([truck_weights.pop(0), 1])
else:
if truck_weights:
continue_.append([truck_weights.pop(0),1])
answer = timer
return answer
https://programmers.co.kr/learn/courses/30/lessons/42586
각각의 기능들이 완성되는데에 얼마나 걸리는지에 대해 계산이 가능합니다. 기능들마다 완성에 걸리는 일수를 day라는 리스트로 저장합니다.
(100 - 현재 기능의 진도) // 개발 속도가 바로 걸리는 일수 입니다. 이때, 나머지가 있는 경우에는 1을 더해주어야 올바른 일수가 나옵니다.
n = len(progresses)
day = [0 for _ in range(n)]
for i in range(n):
day[i] = (100 - progresses[i]) // speeds[i]
if (100 - progresses[i]) % speeds[i] != 0:
day[i] += 1
stack : day의 앞쪽 순서부터 pop을 통해 값을 구해서 스택에 넣습니다. 스택은 한꺼번에 배포할 수 있는 것들을 담는 용도입니다.
이때, 다음의 day안의 값과 비교해서 기존 스택안의 값이 더 크거나 같으면 스택에 다음 값을 넣습니다.
기존 스택 안의 값이 day의 다음 값보다 낮으면, 한꺼번에 배포가 불가능한 것이 다음이라는 의미이고, 기존의 스택 안의 것들만 함께 배포한다는 의미입니다.
스택에 쌓인 개수를 answer에 넣습니다. 그리고 새로운 다음 값을 스택을 초기화하여 넣습니다.
day가 pop을 통해 모두 비워질 때까지 진행됩니다. 다 비었다면 스택안의 값 개수를 answer에 추가합니다.
stack = []
answer = []
stack.append(day.pop(0))
while day:
current = day.pop(0)
if stack[0] >= current:
stack.append(current)
else:
answer.append(len(stack))
stack = [current]
if not day:
answer.append(len(stack))
def solution(progresses, speeds):
n = len(progresses)
day = [0 for _ in range(n)]
for i in range(n):
day[i] = (100 - progresses[i]) // speeds[i]
if (100 - progresses[i]) % speeds[i] != 0:
day[i] += 1
stack = []
answer = []
stack.append(day.pop(0))
while day:
current = day.pop(0)
if stack[0] >= current:
stack.append(current)
else:
answer.append(len(stack))
stack = [current]
if not day:
answer.append(len(stack))
return answer
https://programmers.co.kr/learn/courses/30/lessons/42587
def solution(priorities, location):
seq = [i for i in range(len(priorities))]
ans = []
while priorities:
current = priorities.pop(0)
s = seq.pop(0)
if not priorities:
ans.append(s)
break
if current < max(priorities):
priorities.append(current)
seq.append(s)
else:
ans.append(s)
answer = ans.index(location) + 1
return answer
https://programmers.co.kr/learn/courses/30/lessons/42585
bar : 막대기를 저장하는 배열입니다. '('가 들어오면 막대 하나라는 뜻인 1을 추가합니다. 시작값은 항상 '('로 시작하므로, bar는 [1]로 시작합니다.
두번째 문자열의 문자부터 순회합니다.
만약 '('가 들어오면 bar 배열에 1을 추가해줍니다.
만약 ')'가 들어왔는데, '()'과 같은 형태로 이어서 나오는 것이라면 이것은 레이저를 의미합니다. 이때는 기존 bar에 들어간 것은 막대가 아니므로 pop하여 꺼내고, bar에 있는 모든 막대들을 쪼개므로 answer에 bar의 모든 값의 총합을 더합니다.
만약 '))'형태로 이어서 들어오면 이것은 막대 하나가 끝났다는 의미이므로, bar에서 가장 마지막으로 들어간 것을 pop으로 제거합니다.
def solution(arrangement):
answer = 0
bar = [1]
for i in range(1, len(arrangement)):
if arrangement[i] == '(':
bar.append(1)
elif arrangement[i] == ')':
if arrangement[i-1] == '(':
bar.pop(-1)
if bar:
answer += sum(bar)
# 이때는 레이저
else:
answer += bar.pop(-1)
return answer
https://programmers.co.kr/learn/courses/30/lessons/42584
def solution(prices):
answer = [0 for _ in range(len(prices))]
for i in range(1, len(prices)):
current = prices[i-1]
count = 0
for j in range(i, len(prices)):
comp = prices[j]
count += 1
if comp < current:
break
answer[i-1] = count
return answer
# 정확성: 66.7
# 효율성: 33.3
# 합계: 100.0 / 100.0
[파이썬] 코딩테스트 문제 풀이 - 정렬 문제 (프로그래머스) (0) | 2020.04.23 |
---|---|
[파이썬] 코딩테스트 문제 풀이 - 힙 문제 (프로그래머스) (0) | 2020.04.05 |
[파이썬] 코딩테스트 문제 풀이 - 해쉬 문제 (프로그래머스) (0) | 2020.03.22 |
파이썬으로 구현하는 자료구조 요약 정리 - 해쉬 테이블(Hash Table) (1) | 2020.01.30 |
파이썬으로 구현하는 자료구조 요약 정리 - 배열(Array), 큐(Queue), Stack, Linked List (1) | 2020.01.22 |