아이디어 : 특정 가격을 기준으로 각각 수익권인지 아닌지를 묻는거라고 이해하면 쉬울 것 같다. 가격이 떨어지지 않은 기간은 그 다음 가격이 바로 떨어지더라도 1초는 기본으로 준다.(마지막 가격의 경우 무조건 0이 되는 것 같다)
# 첫 번째 시도
def solution(prices):
times = [0] * len(prices)
idx_list = []
for i in range(len(prices)):
times[i]+=1
idx_list.append(i)
for j in idx_list:
try:
if prices[j]<=prices[i+1]:
times[j]+=1
else:
idx_list.remove(j)
except:
break
times = [x-1 if x!= 1 else x for x in times]
times[-1]=0
return times
테스트 케이스만 통과할뿐 나머지는 줄줄이 실패라서 좀 더 잘 생각해봐야 할 것 같다.
# 두 번째 시도
가격이 떨어지지 않는다=더 작은 수가 나오지 않았다.
def solution(prices):
count_list = [0]*len(prices)
idx_list = []
flag = prices[0]
idx_list.append(0)
for i in range(1,len(prices)):
if flag > prices[i]:
count_list[i-1]+=1
idx_list.remove(i-1)
flag = prices[i]
for j in idx_list:
count_list[j]+=1
idx_list.append(i)
count_list[-1]=0
return count_list
뭐가 문제일까? -> 바로 앞의(i-1) 케이스만 비교해서 그런 것 같다. 즉, 모든 앞쪽의 케이스에 대해서 비교를 해봐야 할 것 같다.
테스트케이스 [2, 4, 6, 4, 2] -> [4, 2, 1, 1, 0]
# 세 번째 시도
def solution(prices):
count_list = [0]*len(prices)
idx_list = []
flag = prices[0]
idx_list.append(0)
for i in range(1,len(prices)):
flag = prices[i]
for k in idx_list:
if flag < prices[k]:
if count_list[k]==0:
count_list[k]+=1
idx_list.remove(k)
for j in idx_list:
count_list[j]+=1
idx_list.append(i)
return count_list
왜... 틀린거지?
# 네 번째 시도
def solution(prices):
count_list = [0]*len(prices)
idx_list = []
flag = prices[0]
idx_list.append(0)
for i in range(1,len(prices)):
flag = prices[i]
for k in range(len(idx_list)-1,-1,-1):
if flag < prices[idx_list[k]]:
count_list[idx_list[k]]+=1
del idx_list[k]
for j in idx_list:
count_list[j]+=1
idx_list.append(i)
return count_list
아무래도 list remove 하는 부분에서 같은 요소이면 다른 인덱스가 삭제될 수도 있어서 이런 경우가 생긴 것 같아 del로 바꾸었다. 또한, del을 사용할때 인덱스가 달라질까봐 거꾸로 for문을 돌았다.
'✨ 공부 기록 > 알고리즘' 카테고리의 다른 글
[프로그래머스 lv 2] 구명보트 (탐욕법(Greedy)) (0) | 2025.03.03 |
---|---|
[프로그래머스 lv 1] 체육복 (탐욕법(Greedy)) (0) | 2025.03.02 |
[프로그래머스 lv 2] 프로세스 (스택/큐) (0) | 2025.02.28 |
[프로그래머스 lv 2] 올바른 괄호 (스택/큐) (0) | 2025.02.28 |
[프로그래머스 lv 2] 기능개발 (스택/큐) (0) | 2025.02.28 |