URL : https://programmers.co.kr/learn/courses/30/lessons/42584
문제 설명
- 초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
제한 사항
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
문제 풀이
- 문제 설명이 너무 대충(?) 되어있어서 이해하는데 더 오래걸린듯 하다.
- 일단, 가장 마지막은 0이될수밖에 없다. 마지막 주식가격은 가격이 0초동안 안떨어졌으니 그래서 return 위에 append(0)을 해줌
- i와 j로 prices의 index를 돌면서 서로 가격 비교를 해주고 떨어지지 않은 시간이니, 기존의(i) 주식가격이 비교할(j) 주식가격보다 작거나 같으면 answer에 +1를 하게 하였다.
- 그 외에 j가 i보다 크면 for문이 break 걸리게 해두었는데, 해당 지문이 이해되지 않아서 좀 오래걸렸다.
- break를 거는 이유는
'3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.'
라는 지문인데, 가격이 떨어지면 거기서 끝나는 것이다. - 그래서 [1, 2, 3, 2, 3, 1] -> [5, 4, 1, 2, 1, 0]이 나오게 된다.
- 처음 1초는 뒤로 쭉 가격이 떨어지지 않음 총 5초
- 두번째 2는 4초쨰에 가격이 떨어짐 2->3 (1초), 3->2 (2초), 2->3 (3초), 3->1 (4초)
- 문제는 2->3 (3초) 부분인데 기준점이되는 2초때의 가격인 2로 생각하면 가격이 떨어진게 아님
- 세번째 3은 3->2 로 떨어지며 여기서 끝이지만, 위의 내용인 1초 뒤에 가격이 떨어지니 1초간 가격이 떨어지지않는것으로 보는것.
- 위의 방식 떄문에 기준가격이 비교 가격보다 커지면 for문을 break를 해야함
- 빈 리스트를 만들고 append 하기도하고 빈 리스트에 [0]을 을 넣고, 해당 인덱스에 +1를 하는 방법도 있음
- 원래는 2중 for문을 쓰라는 의도는 아닌거같은데, 이렇게 해도 효율성은 통과됨..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 빈리스트 append
def solution(prices):
ls = []
for i in range(len(prices) - 1):
answer = 0
for j in range(i, len(prices) - 1):
# print(prices[i], prices[j])
if prices[i] <= prices[j]:
answer += 1
else:
break
ls.append(answer)
ls.append(0)
return ls
1
2
prices = [1, 2, 3, 2, 3]
solution(prices)
1
[4, 3, 1, 1, 0]
1
2
prices = [1, 2, 3, 2, 3, 1]
solution(prices)
1
[5, 4, 1, 2, 1, 0]
1
2
3
4
5
6
7
8
9
10
11
12
# index +
def solution(prices):
answer = len(prices) * [0]
for i in range(len(prices) - 1):
for j in range(i, len(prices) - 1):
# print(prices[i], prices[j])
if prices[i] <= prices[j]:
answer[i] += 1
else:
break
return answer
1
2
prices = [1, 2, 3, 2, 3]
solution(prices)
1
[4, 3, 1, 1, 0]
1
2
prices = [1, 2, 3, 2, 3, 1]
solution(prices)
1
[5, 4, 1, 2, 1, 0]
1