문제 설명 :
https://school.programmers.co.kr/learn/courses/30/lessons/154539
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 요약 :
- 배열의 각각의 수에 대해, 더 큰 수 이면서 가장 가까운 수 구하기
문제 풀이 시간 : 20분
문제 성공 여부 : 성공
접근 방법(실패) :
- 배열의 뒤에서부터 접근
- 뒤에서부터 가장 큰 수를 저장
- 배열을 앞으로 탐색하며, 가장 큰 수와 비교
- 가장 큰 수보다 클 경우, 더 큰 수는 뒤에 없기 때문에 -1
- 가장 큰 수보다 작을 경우, 가장 큰 수 사이를 탐색하며 가장 가깝고 더 큰 수 찾기
제한 사항이 최대 1,000,000까지라 5번 상황에서 시간 초과가 발생했다.
900, 800, 300, 200,..................................................................., 1000000
이런 경우에서, 최대 100만 * 100만의 시간 복잡도가 발생하게 된다.

접근 방법(성공) :
- 실패한 접근 방법에서 1,2,3,4번은 그대로 진행하였다.
- 5번에서, 각 배열의 수를 탐색하는 것이 아닌, 각 수의 "뒤에 있는 큰 수" 값을 탐색하였다.
무슨 말이냐면,
9 1 2 5 2 3 7 9 2
위와 같은 입력이 주어질 경우 3번째 인덱스의 5는 max 값인 9보다 작으면서 5보다 큰 수를 찾기 위해 2, 3, 7까지 탐색을 해야한다.
그럴 필요 없이 2의 "뒤에 있는 큰 수"인 3과 5를 비교하고, 3의 "뒤에 있는 큰 수"인 7을 5와 비교하면,
7까지 갈 필요없이 "뒤에 있는 큰 수"를 구할 수 있다.
전체 코드(성공) :
class Solution {
public int[] solution(int[] numbers) {
int max = -1;
int[] ans = new int[numbers.length]; // 정답 배열
for(int i = numbers.length-1; i>=0; i--){ // 뒤에서 부터 탐색
int num = numbers[i]; // 현재 인덱스의 수
if(num >= max){ // -1인 경우
ans[i] = -1;
max = num; // max값 최신화
continue;
}
if(num < numbers[i+1]){ // 다음 인덱스의 수가 더 큰 수일 경우
ans[i] = numbers[i+1];
continue;
}
// 뒤에 있는 각 인덱스의 "더 큰 수"를 num과 비교
for(int j = i+1; j<numbers.length; j++){
if(num < ans[j]){ // num보다 클 경우, ans[j]는 가장 가깝고 큰 수이다.
ans[i] = ans[j];
break;
}
}
}
return ans;
}
}
백준의 오큰수와 동일한 문제이고, 스택을 사용하면 더 간단하게 풀이할 수 있다.
지피티로 오큰수를 시각화해봤다.

'코테 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 리코쳇 로봇 - Javascript (6) | 2025.07.31 |
|---|---|
| [프로그래머스] 주식가격 - java (2) | 2025.05.21 |
| [프로그래머스] 섬 연결하기 - java (3) | 2025.05.14 |
| [프로그래머스] 튜플 - java (1) | 2025.05.10 |
| [프로그래머스] n^2 배열 자르기 - java (2) | 2025.05.06 |