문제설명
길이 N의 수열을 입력받고 수열의 각 원소에 대해 자신보다 오른쪽에 있으면서 자신보다 큰 수들 중 가장 오른쪽에 있는 수들을 출력하는 문제입니다.
작동 순서
1. 수열의 길이 N을 입력받습니다.
2. 수열을 스택에 입력합니다.
3. 결과값을 저장할 길이 N의 배열과 오른쪽수들을 저장하는 스택을 생성합니다.
4. 스택의 가장 오른쪽에 있는 수는 자신보다 오른쪽에 있는 수가 없으므로 결과값을 저장하는 배열의 마지막 자리에 -1을 삽입하고 그 수를 오른쪽수들을 저장하는 스택에 저장합니다.
5. 스택의 마지막 값을 가져와서 오른쪽 수들의 스택에 있는 수들중 자신보다 큰 값이 나올때 까지 pop하고 자신보다 큰 수가 있는 경우 결과값을 저장하는 배열의 N-i번째에 저장합니다.
6. 모든 연사이 끝나면 배열에 저장된 값들을 출력합니다.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N=Integer.parseInt(br.readLine());
int[] num=new int[N];
String[] input=br.readLine().split(" ");
Stack<Integer> stackLeft=new Stack<>();
Stack<Integer> stackRight=new Stack<>();
for(int i=0;i<N;i++){
stackLeft.push(Integer.parseInt(input[i]));
}
stackRight.push(stackLeft.pop());
num[N-1]=-1;
int now;
for(int i=2;i<N+1;i++) {
now=stackLeft.pop();
while(stackRight.peek()<=now) {
stackRight.pop();
if(stackRight.empty()) break;
}
if(stackRight.empty()) num[N-i]=-1;
else num[N-i]=stackRight.peek();
stackRight.push(now);
}
for(int i=0;i<N;i++) sb.append(num[i]+" ");
System.out.println(sb);
}
}
후기
골드4 문제치고는 굉장히 쉬웠던것 같고 별 어려움 없이 풀 수 있었습니다.