문제 설명
정수로 이루어진 배열 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]이 됩니다.
파라미터로 받은 사이즈만큼 크기를 정하기 위해
초기설정 값인 int[] answer = {}; 을 수정했다.
원인이 무엇일까 고민하다
제한사항때문일까싶어 if문 추가
if( numbers.length >=4 && numbers.length <= 1000000)
if( numbers[i] >=1 && numbers[i] <= 1000000)
결과는 같았다.
다음은 중첩 for문
2개를 1개로 만들 방법은 고민을 해봐야겠다.
제한사항에서
4 ≤ numbers의 길이 ≤ 1,000,000
길이가 최대치인 1,000,000이라면
2중첩 for문을 돌렸을때 1,000,000의 제곱인 1,000,000,000,000가 나오는데
1조로 이 문제인것같다.
Stack을 이용한 방법
println은 주석처리해야 에러 없이 채점됨
설명
public static int[] solution(int[] numbers) {
// 입력받은 배열의 크기와 같은 배열 선언(결과 담을 배열)
int[] answer = new int[numbers.length];
// 해당 배열의 모든 값을 -1로 채움
Arrays.fill(answer, -1);
// stack 선언
Stack<Integer> stack = new Stack<>();
// 배열 크기만큼 반복
for (int i = 0; i < numbers.length; i++) {
while (!stack.isEmpty() && numbers[i] > numbers[stack.peek()]) {
System.out.println("i : " + i + " st : " + stack.peek() + " num : " + numbers[i]);
// 뒤 큰수가 있는 인덱스 i에 해당 값을 set하고, i는 pop하여 stack에서 제거
answer[stack.pop()] = numbers[i];
}
// 다음 인덱스와 비교 위해 i값 stack에 set
stack.push(i);
}
for(int i=0;i<numbers.length;i++) System.out.println(answer[i]);
return answer;
}
i=0
stack = 0
answer = {-1, -1, -1, -1, -1, -1}
i=1
stack = 0, 1
answer = {-1, -1, -1, -1, -1, -1}
i=2 (while 1회)
stack = 0, 1 -> 0, 2
answer = {-1, 5, -1, -1, -1, -1}
i=3
stack = 0, 2, 3
answer = {-1, 5, -1, -1, -1, -1}
i=4 (while 2회)
stack = 0, 2, 3 -> 0, 2 -> 0, 4
answer = {-1, 5, -1, -1, -1, -1} -> {-1, 5, -1, 6, -1, -1} -> {-1, 5, 6, 6, -1, -1}
i=5
stack = 0, 4, 5
answer = {-1, 5, 6, 6, -1, -1}
자료구조별 시간복잡도가 달라 공부해두면 좋을것같다.
'코딩테스트 > JAVA' 카테고리의 다른 글
[프로그래머스/JAVA] 특수문자 출력하기 (1) | 2024.04.17 |
---|---|
[프로그래머스/JAVA] 푸드 파이트 대회 (1) | 2024.04.17 |
[프로그래머스/JAVA] 크기가 작은 부분문자열 (1) | 2024.04.17 |
[프로그래머스/JAVA] 소수 만들기 (1) | 2024.04.17 |
[프로그래머스/JAVA] 없는 숫자 더하기 (1) | 2024.04.17 |