문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/154539
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코딩테스트 > 연습 연습문제 > 뒤에 있는 큰 수 찾기
문제 설명
정수로 이루어진 배열 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]이 됩니다.
나의 코드
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
int[] answer = new int[numbers.length];
Stack<Integer> stack = new Stack<>();
for(int i=numbers.length-1; i>=0; i--) {
while(!stack.isEmpty() && numbers[i] >= stack.peek()) {
stack.pop();
}
if(stack.isEmpty())
answer[i] = -1;
else
answer[i] = stack.peek();
stack.push(numbers[i]);
}
return answer;
}
}
풀이
- numbers에서 자기보다 큰 값을 가진 가장 근처에 있는 인덱스를 구하는 것이므로 거꾸로 뒤에서부터 Stack에 담겨있는 값과 비교하여 numbers[i]보다 큰 값이 나올때까지 찾으면 numbers[i]보다 큰 값이 없다면 Stack은 비어있게 되고 numbers[i]보다 큰 값이 있다면 numbers[i]보다 큰 값 중 가장 가까운 인덱스의 값이 제일 앞에 나오게 된다.
- 따라서 Stack에는 현재 numbers[i]보다 작으면 사라지고 현재 numbers[i]보다 크면 살아남은 후에 현재 numbers[i]가 추가되며 비교하게 된다.
- 우선 numbers를 담기 위해 Integer를 선언타입으로 Stack을 생성한다.
- 그리고 numbers의 인덱스 끝에서 부터 반대로 for문을 돌린다.
- for문 내부에서 while문을 생성하여 Stack이 비어있지 않고 numbers[i]가 Stack의 가장 최근 값보다 같거나 크다면 반복해서 pop()을 이용해 Stack의 값을 꺼낸다.
- 그러다 while문을 나왔을 때 Stack이 비어있다면 numbers[i]보다 큰 값이 없는 것이므로 answer[i]에는 -1을 저장하고 Stack이 비어있지 않다면 numbers[i]보다 큰 값이 Stack에 있는 것이므로 peek()을 이용하여 Stack의 가장 최근 값을 answer[i]에 저장한다.
- 그리고나서 numbers[i]를 Stack에 push()를 이용하여 담는다.
'Programmers' 카테고리의 다른 글
[프로그래머스 Level.2] 무인도 여행 (연습문제) (Java) (0) | 2023.02.03 |
---|---|
[프로그래머스 Level.2] 숫자 변환하기 (연습문제) (Java) (0) | 2023.02.02 |
[프로그래머스 Level.2] 시소 짝꿍 (연습문제) (Java) (0) | 2023.01.31 |
[프로그래머스 Level.4] [3차] 자동완성 (2018 KAKAO BLIND RECRUITMENT) (Java) (0) | 2023.01.30 |
[프로그래머스 Level.2] 배달 (Summer/Winter Coding(~2018)) (Java) (0) | 2023.01.27 |