반응형
💡문제 분석 요약
- 주식가격이 담긴 배열 prices가 주어진다.
- 각 원소별로 몇초간 떨어지지 않았는지 구한다. 1 2 3이라고 하면 순서대로 2초, 1초, 0초간 가격이 떨어지지 않은 것으로 본다.
💡알고리즘 설계
- 이중 for문을 사용해서 첫번째 원소를 나머지 원소와 쭉 비교하는데, 만약 가격이 떨어지는 순간이 나오면 break하고 그때까지의 time을 기록하면 된다고 생각했다. 그런데 이중 for문을 쓰면 시간이 초과될 것 같아서 해보고 오버되면 다르게 하려 했는데 오버되지 않았다.
- 생각해보면, 일단 prices 길이가 10만이었기 때문에 이중for문이면 100억번 계산되는 건가 싶었다.
- 그런데 중간에 자기보다 큰 수가 나오면 바로 break되기 때문에 저정도로 큰 계산이 되지는 않을 것으로 생각했다.
💡코드
def solution(prices):
lst = []
for i in range(len(prices)):
ans = 0
for j in range(i+1, len(prices)):
if prices[i] <= prices[j]:
ans += 1
else:
ans += 1
break
lst.append(ans)
return lst
print(solution([1, 2, 3, 2, 3]))
💡시간복잡도
- 이중 for문을 사용해서 O(N^2)이 될 것으로 예상된다.
💡 틀린 이유
- 안쪽에 있는 for문에서 시작 지점을 i가 아니고 i+1부터 시작했어야하는데 i부터 비교해서 return 값이 더 크게 나오는 오류가 있었다.
💡 틀린 부분 수정 or 다른 풀이
- 앞서 팀원분이 푼 풀이를 보았는데 나의 풀이와 똑같았지만 if 처리가 더 간결해서 좋았다. 나는 if, else 둘 다 했는데 사실 코드를 보면 if든 else든 ans에는 1을 더해줘야함을 알 수 있다. 따라서 더 쉽게 하려면 처음부터 ans에 1을 더해주고, 앞의 가격이 뒤의 가격보다 클 때만 break해주는 식으로 하면 코드가 더 깔끔해질 것이다.
- 그리고 ans도 사실 time같은 변수명으로 해줬어야 더 직관적이고 좋았을 것 같다.
def solution(prices):
lst = []
for i in range(len(prices)):
time = 0
for j in range(i+1, len(prices)):
time += 1
if prices[i] > prices[j]:
break
lst.append(time)
return lst
print(solution([1, 2, 3, 2, 3]))
💡 느낀점 or 기억할정보
- 변수명 항상 깔끔하고 직관적으로 짓기
- if-else에서 합칠 수 있는 건 합치기
- 시간복잡도 고려, O(N^2)은 지양하기
반응형
'알고리즘 > 코테 스터디 (2024)' 카테고리의 다른 글
2667 단지번호붙이기 (0) | 2024.07.16 |
---|---|
1260 DFS와 BFS (0) | 2024.07.15 |
9093 단어 뒤집기 (0) | 2024.07.13 |
1966 프린터 큐, Programmers 프로세스 (0) | 2024.07.12 |
9012 괄호 (0) | 2024.07.11 |