728x90
💡문제
[level 2] 뒤에 있는 큰 수 찾기 - 154539
성능 요약
메모리: 206 MB, 시간: 259.36 ms
🤔접근법
주어진 정수 배열을 순회하면서 본인보다 오른쪽에 있는 수들 중에서 본인보다 크지만 가장 가까이 있는 수 찾기
범위 체크 및 시간복잡도 예상
- 1 ≤ N ≤ 1,000,000
- O($NlogN$) 보다 더 작아야 한다.
풀이법
❌ 접근 방법. 완탐
- 주어진 정수 배열을 인덱스 0 ~ N 까지 반복
- 가르키는 정수로부터 오른쪽에 존재하는 모든 정수를 탐색
- 만약 본인보다 큰 정수가 나오면 answer에 저장하고 정지
➡️ 해당 풀이법의 시간 복잡도 : $O(N^2)$ → 시간 초과
⭕ 접근 방법. stack을 사용하자 !
스택에는 정수배열의 인덱스와 값을 넣는다.
스택은 top 보다 값이 작을때만 쌓을 수 있다.
- 주어진 정수 배열을 인덱스 0 ~ N 까지 반복
- 스택의 top의 값이 배열의 값보다 크다면 answer 배열에 top 위치에 가르키는 값을 넣는다. → top보다 오른쪽에 있으면서 top보다 크고 가장 가까이 있는 수 찾음!
- 스택의 top의 값이 배열의 값보다 작다면 스택에 쌓는다. → 스택에 쌓여있는 값들은 찾고자 하는 값 즉, 본인보다 오른쪽에 있고, 본인보다 크고, 가장 가까이 있는 수를 찾지 못한 수들이다.
- 배열에 가르키고 있는 값을 스택에 쌓고 다음으로 넘어간다.
➡️ 해당 풀이법의 시간 복잡도 : $O(N)$
🤯FAIL
답을 봐서 문제를 푼 경우
- 스택 자료구조를 사용해야 한다는 아이디어를 떠올리지 못했다.
- 다양한 자료구조를 사용할 수 있도록 노력해보자.
👩💻 코드
import java.io.IOException;
import java.util.Arrays;
import java.util.Stack;
class Number {
int idx;
int num;
public Number(int idx, int num){
this.idx = idx;
this.num = num;
}
}
class Solution {
public int[] solution(int[] numbers) {
int[] answer = new int[numbers.length];
Arrays.fill(answer, -1);
Stack<Number> st = new Stack<>();
for(int i = 0; i < numbers.length; i++){
while (true){
if(st.size() == 0 || st.peek().num >= numbers[i]){
break;
}else{
answer[st.pop().idx] = numbers[i];
}
}
st.push(new Number(i,numbers[i]));
}
return answer;
}
}
반응형
'Algorithm > 99클럽 코테 스터디' 카테고리의 다른 글
99클럽 코테 스터디 6일차 TIL + Arrays.sort/[프로그래머스] 테이블 해시 함수 (0) | 2024.07.27 |
---|---|
99클럽 코테 스터디 5일차 TIL + HashMap/[프로그래머스] 베스트앨범 (0) | 2024.07.27 |
99클럽 코테 스터디 4일차 TIL + 문자열/[프로그래머스] 문자열 압축 (0) | 2024.07.25 |
99클럽 코테 스터디 3일차 TIL + [프로그래머스] 숫자 문자열과 영단어 (0) | 2024.07.24 |
99클럽 코테 스터디 2일차 TIL + 유클리드호제법/GCD (1) | 2024.07.23 |