일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- BFS
- 자바 #java
- css #웹 #생활코딩
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- css #생활코딩 #웹
- 코딩테스트
- Dijkstra
- DFS
- java #자바 #나동빈
- 프로그래머스
- PYTHON
- 투포인터
- 알고리즘
- 백준
- 파이썬 #백준 #알고리즘 #코딩테스트
- react #리액트 #동빈나
- 백트랙킹
- 백준 #파이썬 #알고리즘 #코딩테스트
- dp
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- java #자바 #생활코딩
- 백준 #알고리즘 #파이썬 #코딩테스트
- 재귀
- java #자바
- 다익스트라
- java #자바 #동빈나
- 다이나믹프로그래밍
- 파이썬
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
Archives
- Today
- Total
커리까지
[프로그래머스] 뒤에 있는 큰 수 찾기 본문
728x90
SMALL
문제 설명
정수로 이루어진 배열 numbers
가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.
정수 배열 numbers
가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.
제한사항
- 4 ≤
numbers
의 길이 ≤ 1,000,000
- 1 ≤
numbers[i]
≤ 1,000,000
입출력 예
numbers | result |
---|---|
[2, 3, 3, 5] | [3, 5, 5, -1] |
[9, 1, 5, 3, 6, 2] | [-1, 5, 6, 6, -1, -1] |
입출력 예 설명
입출력 예 #1
2의 뒷 큰수는 3입니다. 첫 번째 3의 뒷 큰수는 5입니다. 두 번째 3 또한 마찬가지입니다. 5는 뒷 큰수가 없으므로 -1입니다. 위 수들을 차례대로 배열에 담으면 [3, 5, 5, -1]이 됩니다.
입출력 예 #2
9는 뒷 큰수가 없으므로 -1입니다. 1의 뒷 큰수는 5이며, 5와 3의 뒷 큰수는 6입니다. 6과 2는 뒷 큰수가 없으므로 -1입니다. 위 수들을 차례대로 배열에 담으면 [-1, 5, 6, 6, -1, -1]이 됩니다.
틀린 제출 답안
- 먼저 max 값을 계속 갱신해나가면서 진행하였다.
- 하지만 이렇게 되면 모든 max가 아닐 경우 계속 2중 for loop를 돌아야 하기 때문에 시간 초과가 발생하였다.
def solution(numbers):
leng= len(numbers)
dp = [-1] * leng
max_val = max(numbers)
numbers2 = sorted(numbers)
max_idx = len(numbers2) -1
for i, val in enumerate(numbers):
if val == max_val:
max_idx -= 1
max_val = numbers2[max_idx]
continue
for j in range(i+1, leng):
if val < numbers[j]:
dp[i] = numbers[j]
break
return dp
테스트 1 〉 | 통과 (0.01ms, 10.3MB) |
---|---|
테스트 2 〉 | 통과 (0.01ms, 10.2MB) |
테스트 3 〉 | 통과 (0.01ms, 10.3MB) |
테스트 4 〉 | 통과 (0.07ms, 10.3MB) |
테스트 5 〉 | 통과 (0.86ms, 10.4MB) |
테스트 6 〉 | 통과 (12.44ms, 11.4MB) |
테스트 7 〉 | 통과 (16.09ms, 11.5MB) |
테스트 8 〉 | 통과 (78.48ms, 17MB) |
테스트 9 〉 | 통과 (43.60ms, 17.2MB) |
테스트 10 〉 | 통과 (88.38ms, 19.9MB) |
테스트 11 〉 | 통과 (88.65ms, 19.9MB) |
테스트 12 〉 | 통과 (196.56ms, 25.5MB) |
테스트 13 〉 | 통과 (200.19ms, 25.3MB) |
테스트 14 〉 | 통과 (598.74ms, 43.3MB) |
테스트 15 〉 | 통과 (1021.02ms, 75.4MB) |
테스트 16 〉 | 통과 (1139.67ms, 75.5MB) |
테스트 17 〉 | 통과 (1241.03ms, 75.5MB) |
테스트 18 〉 | 통과 (1238.73ms, 75.4MB) |
테스트 19 〉 | 통과 (1201.24ms, 75.4MB) |
테스트 20 〉 | 실패 (시간 초과) |
테스트 21 〉 | 통과 (135.34ms, 72.3MB) |
테스트 22 〉 | 실패 (시간 초과) |
테스트 23 〉 | 통과 (127.71ms, 72.2MB) |
찾은 정답 코드
- stack에 쌓인 인덱스를 기준으로 계속 비교가 가능하다.
- 이렇게 하면 모든 값을 비교하지 않아도 된다는 장점이 있다.
- 예를 들어 문제에서
2
보다 큰 값을 찾을 때 맨 처음에 stack가 비어 있으니 0번째 인덱스가 stack에 저장된다.- 그 다음에는
3
이 오고 stack에 값이 있으니 while문 조건이 충족되면서 numbers[0]
값과 현재3
과 비교했을 때3
이 크니 stack에 있던0
인덱스를 pop하고answer[0]
을 3으로 업데이트 한다.
- 그 다음에는
- 이런식으로 계속 비교해 나가면 된다.
def solution(numbers):
answer = [-1]*(len(numbers))
stack = []
for i, val in enumerate(numbers):
while stack and numbers[stack[-1]] < val:
answer[stack.pop()] = val
stack.append(i)
return answer
728x90
LIST
'알고리즘 > 풀이' 카테고리의 다른 글
[프로그래머스] 시소 짝꿍 (0) | 2023.03.08 |
---|---|
[프로그래머스] 호텔 대실 파이썬 (0) | 2023.03.07 |
[백준] 11722번 가장 긴 감소하는 부분 수열 (0) | 2023.02.22 |
[백준] 11055번 가장 큰 증가 부분 수열 파이썬 (0) | 2023.02.21 |
[백준] 11057번 오르막 수 파이썬 (0) | 2023.02.20 |
Comments