# 내 풀이
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
'알고리즘 문제풀이 > 프로그래머스 고득점 Kit' 카테고리의 다른 글
[프로그래머스 고득점 Kit - 해시] 1. 폰켓몬 (0) | 2023.09.29 |
---|---|
[프로그래머스] 고득점 Kit - 완전 탐색 (0) | 2023.06.22 |
[프로그래머스] 고득점 Kit - 힙 (0) | 2023.06.15 |
[프로그래머스] 고득점 Kit - 정렬 (1) | 2023.06.06 |
[프로그래머스] 고득점 Kit - 해시 (2) | 2023.06.04 |
댓글