J 크 2023. 9. 10. 14:21
728x90
반응형

https://www.acmicpc.net/problem/17298

 

17298번: 오큰수

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.

www.acmicpc.net

오감자 먹고 싶다


※  문제를 요약하면 아래와 같습니다.

N개의 수가 수열( A1, A2, ... Ai)로 주어질 때 각 수의 오큰수(NGE) 그하기 

오큰수란 수열을 나열했을 때, Ai를 기준으로 오른쪽의 수들 중에, Ai보다 큰 수이며 가장 왼쪽에 있는 수

 오큰수가 존재하지 않을 때는 -1로 저장

     ex) A=[3,5,2,7] 의 경우 3의 오큰수는 5, 5의 오큰수는 7, 2의 오큰수는 7, 7의 오큰수는 없으므로 -1

  Input : 첫째 줄에 수열의 갯수 N, 둘째 줄에 수열 A의 원소가 공백을 구분으로 주어짐

  Output : 총 N개의 수의 각각의 오큰수를 출력


◈ Input - 1

4
3 5 2 7

◈ Output - 1

5 7 7 -1

◈ Input - 2

4
9 5 4 8

◈ Output - 2

-1 8 8 -1

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

 각 수열의 번호와 값을 클래스 형태로 정의

Stack에 클래스 형태로 정의한 수열의 정보를 저장

 수열의 값이 주어질 때마다 스택의 마지막 값과 비교 작업 후 주어진 값을 스택에 저장

스택의 마지막 값 < 주어진 값 == 오큰수

      ex) 3이 저장되어 있는 스택에서 5가 들어올 경우 5 == 3의 오큰수

 오큰수일 경우, 해당 스택의 마지막 값을 제거한 뒤, 제거한 인덱스 번호에 오큰수 값을 저장

 오큰수일 경우, 위의 작업을 스택이 비었거나 주어진 값이 크지 않을 때 까지 반복 (오큰수가 아닐 때까지 반복)

 위의 탐색이 모두 끝난 후 스택에 남아있는 값들은 오큰수가 없다고 판정, 해당 인덱스들은 -1로 저장


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;

class NGE{
	int m_nNumber = 0;
	int m_nValue = 0;
	
	public NGE(int m_nNumber, int m_nValue) {
		this.m_nNumber = m_nNumber;
		this.m_nValue = m_nValue;
	}
}

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(bReader.readLine());
		Stack<NGE> stNGE = new Stack<>();
		int[] narrResult = new int[N];
		
		StringTokenizer st = new StringTokenizer(bReader.readLine());

		for(int i = 0; i < N; i++) {
			int nNumber = Integer.parseInt(st.nextToken());
			// 스택 맨 마지막 값보다 큰값이 들어 왔다??
			// 오큰수니까 다 저장해버려
			while(!stNGE.isEmpty() && stNGE.peek().m_nValue < nNumber) {
				narrResult[stNGE.pop().m_nNumber] = nNumber;
			}
			
			// 인덱스와 값을 저장해
			stNGE.add(new NGE(i, nNumber));
		}
		
		// 오큰수가 없는 것만 남아있다아
		while(!stNGE.isEmpty()) {
			narrResult[stNGE.pop().m_nNumber] = -1;
		}
		
		// 출력해
		for(int i = 0; i < N; i++)
			bWriter.write(narrResult[i] + " ");
		
		bWriter.flush();
		bWriter.close();
	}
}

으헝 주말인데 술도 못먹구22,,,

Good Luck! (피드백 감사합니다!)