오늘도 코트카타 TIL~ 다 즐찾 되어있던 문제다.
나에게 즐찾이란? 한 번에 풀지 못해서 나중에 또 풀어야집! 하고 찜해놨던 문제
역시나 다시 풀었더니 못풀었다ㅋㅋ

import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
int[] answer = new int[numbers.length];
for(int i=0; i<numbers.length; i++) {
if(numbers[i] == 9) {
answer[i] = -1;
}
for(int j=i+1; j<numbers.length; j++) {
if(numbers[i] < numbers[j]) {
answer[i] = numbers[j];
break;
}
}
//answer이 비어있다면 더 큰 숫자가 없다는 뜻 = -1
if(answer[i] == 0) {
answer[i] = -1;
}
}
return answer;
}
}
테스트 코드는 통과하였지만 시간 초과!
아무래도 numbers의 길이가 백만이여서 그런가 보다...
다른 방법 도전!!!
했지만 실패한 코드
//이중 for문은 효율성 초과
//스택 사용
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
int[] answer = new int[numbers.length];
for(int i=0; i<numbers.length-1; i++) {
Stack<Integer> stack = new Stack<>();
if(numbers[i]<numbers[i+1]) {
answer[i] = numbers[i+1];
}
else {
int idx = i+1;
while(numbers[i]>numbers[idx]) {
stack.push(numbers[idx]);
idx++;
}
answer[i] = numbers[idx];
}
}
//비어있다면 -1
for(int j=0; j<numbers.length; j++) {
if(answer[j] == 0) {
answer[j] = -1;
}
}
return answer;
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
at Solution.solution(Unknown Source)
at SolutionTest.lambda$main$0(Unknown Source)
at SolutionTest$SolutionRunner.run(Unknown Source)
at SolutionTest.main(Unknown Source)
막연하게 죽죽 썼더니 오류 남
틀린 이유(GPT야 고마워) -> while(numbers[i] > numbers[idx])에서 idx++를 계속 증가시키는데, 만약 끝까지 큰 수가 없다면 ArrayIndexOutOfBoundsException이 발생할 수 있습니다.
사실 이 코드는 stack을 쓴 의미가 없는 그런 말도 안되는 코드...!!!!
//이중 for문은 시간 초과
//stack에 인덱스 넣기
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
int[] answer = new int[numbers.length];
Stack<Integer> stack = new Stack<>();
for(int i=0; i<numbers.length; i++) {
while(!stack.isEmpty() && numbers[stack.peek()] < numbers[i]) {
answer[stack.pop()] = numbers[i];
}
stack.push(i);
}
//빈 곳에 -1 넣어주기
for(int j=0; j<numbers.length; j++) {
if(answer[j] == 0) {
answer[j] = -1;
}
}
return answer;
}
}
stack에 인덱스를 넣는다
i=0일때 stack은 비어있으므로 0을 stack에 넣어준다.
while문에서 numbers[stack.peek(=인덱스)]과 numbers[i]의 값을 비교해준다.
while문의 조건을 충족하면 stack.peek()을 answer인덱스로 설정하여 큰 값(numbers[i])를 넣어준다. 이때, stack.peek의 값은 비교가 끝났으므로 stack.pop()을 해준다.
빈 곳은 뒷 큰수가 없다는 뜻이므로 -1
쉽게 말해보자면
i -> 지금 비교해 볼 뒷 큰수
stack -> 뒷 큰수와 비교해 볼 앞의 수들
이것두 어렵고~ 저것도 어렵고~
stack 쓰는 건 알았지만 인덱스를 넣어야 하는 건.... 또 까먹은...
제출내역 보니 10개던데.. 못해도 4번은 풀었을텐데 또 까먹은게 신기하다.
이렇게 자세히 정리했으니 이젠 안까먹겠지!
금붕어 아니잖아....ㅜ