1. 문제 링크
2. 접근 방식
백준에서 풀었던 오른쪽에서 큰 수와 같은 문제인데, 문제를 푸는 아이디어가 생각이 안나서, 저번에 풀었던 것 좀 봤다.
해당 문제는 Stack 자료구조를 이용하여 풀어야 한다.
나는 먼저 Node라는 Class를 만들었다. Node의 구조는 다음과 같다.
class Node {
int i; // 원래 index
int v; // 값
public Node (int i, int v){
this.i = i;
this.v = v;
}
}
해당 Node를 자료형으로 가진 Stack을 만든다. 그리고 답을 저장하는 배열ans을 하나 더 만든다.
배열은 index = 원래 값의 위치, value = 해당 index 값의 뒷큰수가 무엇인지 저장 한다.
Node Stack의 규칙은 다음과 같다.
- 입력으로 주어진 배열을 순회한다.
- Stack이 비어있으면 현재 조회 중인 원소의 값을 저장한다.
- Stack이 비어있지 않다면, 현재 조회 중인 값과 Stack.top을 비교한다.
(1) 만약 Top이 더 크면, Stack에 현재 조회 중인 수를 저장하고 넘어간다.
(2) 만약 반대로 현재 조회 중인 수가 더 크면 해당 수가 Top의 뒷큰수 이므로, ans의 Top 자리에 조회 중인 수를 뒷큰수로 저장한다. 그 후 Stack의 Top을 POP하고 다음 수에 대하여 3번 과정을 반복한다. - ANS가 채워졌을 것이다. 근데 ans의 값이 갱신되지 않은 녀석은 뒷큰수가 없다는 소리이므로 -1을 출력한다.
3. 코드 분석
class Solution {
public int[] solution(int[] numbers) {
// 원래의 인덱스와 값을 가진 stack
Node [] stack = new Node [numbers.length];
int top = -1;
// i = 원래 number 배열의 인덱스, value = numer[i]의 뒷큰수
int [] NGE = new int [numbers.length];
// 값 초기화
for(int i = 0; i < numbers.length; i++){
NGE[i] = -1;
}
for(int i = 0; i < numbers.length; i ++){
Node now = new Node(i ,numbers[i]);
if(top == -1){
stack[++top] = now;
}else {
while(top > -1 && stack[top].v < now.v){
NGE[stack[top--].i] = now.v;
}
stack[++top] = now;
}
}
return NGE;
}
}
class Node {
int i; // index
int v; // 값
public Node(int i, int v){
this.i = i;
this.v = v;
}
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[백준] 2075 N번째 큰 수 java 풀이 (풀이 2개) (0) | 2024.07.23 |
---|---|
99클럽 코테 스터디 2일차 TIL + Programmers 숫자 카드 나누기 풀이 java (0) | 2024.07.23 |
[프로그래머스] 이중 우선순위 큐 Java (0) | 2024.07.18 |
[백준] 1167 트리의 지름 java (0) | 2024.07.13 |
[백준] 2178 미로탐색 java (0) | 2024.07.13 |