문제
https://school.programmers.co.kr/learn/courses/30/lessons/154539
풀이(40분)
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
Stack<Integer> stack = new Stack<>();
int[] answer = new int[numbers.length];
Arrays.fill(answer, -1);
for (int i = 0; i < numbers.length; i++)
while (!stack.isEmpty() && numbers[stack.peek()] < numbers[i]) {
answer[stack.pop()] = numbers[i];
}
stack.push(i);
}
return answer;
}
}
초기 뒤에 있는 것중 자기보다 큰 수 중 가장 작은 것을 찾는 문제인줄 알고 이분탐색으로 풀었으나 아니었고, 스택을 사용했다.
스택을 사용하면서 쓴 가장 중요한 아이디어는 일반적으로 스택에 값을 직접 넣지만 이번엔 인덱스를 넣는다는 것!
문제의 예시인 2 3 3 5로 입력이 들어왔을 때를 생각해보자.
1. 처음에 2가 들어온다. 스택이 비어있기 때문에 일단 넣는다. 이 때 값을 넣는 것이 아닌 인덱스인 0을 넣는다.
2. 3이 들어온다. 스택은 차있고, peek인덱스는 0이고, 값은 2다. 자기 자신은 3이고 인덱스는 1이다.
2-1. 2 < 3이 되므로 스택을 팝하고, 값을 numbers[i]인 3으로 넣어준다.
이 과정을 반복하면 된다.
'문제 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 마법의 엘레베이터(JAVA) (0) | 2025.01.21 |
---|---|
[프로그래머스] 숫자 변환하기(JAVA) (0) | 2025.01.19 |
[프로그래머스] 택배 배달과 수거하기(JAVA) (0) | 2024.11.21 |
[프로그래머스] 연도별 대장균 크기의 편차 구하기(SQL) (1) | 2024.11.21 |
[프로그래머스] 석유 시추(JAVA) (1) | 2024.11.21 |