티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/154539
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
처음 문제를 봤을 때 중첩된 반복문으로 해결할 수 있을 거라 생각함.
코드 해설
첫 번째 반복문에서 각 요소를 순회하고, 두 번째 반복문에서 해당 요소의 뒤에 있는 값들과 비교하여 첫 번째로 큰 값을 찾습니다. "다음 큰 수"를 찾을 때마다 두 번째 반복문을 종료하고, 결과를 저장합니다.
작성했던 코드
class Solution {
public int[] solution(int[] numbers) {
int[] answer = new int[numbers.length];
for(int i = 0; i < numbers.length; i++) {
answer[i] = -1;
for(int j = i + 1; j < numbers.length; j++) {
if (numbers[i] < numbers[j]) {
answer[i] = numbers[j];
break;
}
}
}
return answer;
}
}
결론적으로 실패했다. 이유는 주어진 제한 사항을 잘 읽지 않았기 때문...
제한 사항에서 numbers의 길이가 최대 1,000,000까지 될 수 있다. 시간 복잡도가 O(N^2)인 위 코드에서는 최악의 경우 최대 1,000,000^2 = 1,000,000,000,000번의 비교가 발생하여 실패..
이제 실패했으니 문제를 해결해 보자..
"질문하기"를 보니 스택이라는 키워드를 확인 발견💡
스택을 활용하여 아래 코드로 수정!
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
int[] answer = new int[numbers.length];
Stack<Integer> stack = new Stack<>();
stack.push(0);
for(int i = 1; i < numbers.length; i++) {
while(!stack.isEmpty() && numbers[stack.peek()] < numbers[i]) {
answer[stack.pop()] = numbers[i];
}
stack.push(i);
}
while(!stack.isEmpty()) {
answer[stack.pop()] = -1;
}
return answer;
}
}
코드 해설
각 인덱스를 스택에 넣고, 스택에 들어있는 인덱스들의 값이 현재 값보다 작은 경우, 해당 인덱스에 대해 다음 큰 수를 기록하고 스택에서 제거합니다.
전체 배열을 한 번만 순회하면서 값을 비교해서 각 요소가 스택에 들어가고 나오는 횟수는 최대 1번이므로 O(N)의 시간 복잡도를 가집니다.
제한 사항을 잘보자..!
끝.
'Java' 카테고리의 다른 글
우선순위 큐(Priority Queue) with 백준 1715 (0) | 2025.01.03 |
---|---|
[Algorithms] 탐욕법 (Greedy) with 프로그래머스 (0) | 2024.12.30 |
[Algorithms] 최대공약수, 최소공배수 with 프로그래머스 (0) | 2024.11.19 |
[프로그래머스] 휴대폰 번호 가리기 - Java (0) | 2024.11.11 |
[프로그래머스] 자릿수 더하기 - Java (0) | 2024.11.11 |
- Total
- Today
- Yesterday
- counter
- Lower
- index
- bool
- Python
- permutations
- find
- isdigit
- operators
- Method
- If
- zip
- function
- isalpha
- combinations
- Built-in Functions
- Lambda
- Upper
- for
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |