[백준] 오큰수 - Java

2025. 2. 10. 17:51·알고리즘

문제 출처

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

문제

크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다.

예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1이다.

입력

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

출력

총 N개의 수 NGE(1), NGE(2), ..., NGE(N)을 공백으로 구분해 출력한다.

예제 입력 1

4
3 5 2 7

예제 출력 1

5 7 7 -1

예제 입력 2

4
9 5 4 8

예제 출력 2

-1 8 8 -1

풀이 방법

  • 초기에는 2중 반복문으로 큰 숫자를 만나자마자 break 걸면 되지 않을까 했는데, 최악의 수는 언제나 존재했고 시간초과가 나타났다.
  • 그래서 Stack을 활용하였다
    1. 인덱스를 stack에 넣고, 해당 인덱스에 있는 배열의 값과 현재 반복문의 값을 비교하여 순차적으로 값을 추가해준다.
    2. 만약 현재 A[i]값 보다, A[stack.peek()]이 더 클경우, 그냥 인덱스를 저장한다.
    3. 아니라면, 2번이 성립할 때 까지 result에 해당 숫자(stack.peek())를 저장한다.
    4. 마지막에 남은 인덱스는 오른쪽에 큰 숫자가 없다는 의미이므로, -1로 추가해준다.

풀이 코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        int[] A = new int[N]; 
        int[] result = new int[N]; 
        Stack<Integer> stack = new Stack<>();

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            A[i] = Integer.parseInt(st.nextToken());
        }

        // 오른쪽에서 왼쪽으로 탐색 (반대 방향)
        for (int i = 0; i < N; i++) {
            while (!stack.isEmpty() && A[stack.peek()] < A[i]) {
                result[stack.pop()] = A[i];
            }
            // 현재 인덱스를 스택에 push
            stack.push(i);
        }

        // 아직 남아있는 인덱스는 오큰수가 없으므로 -1
        while (!stack.isEmpty()) {
            result[stack.pop()] = -1;
        }

        // 출력
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) {
            sb.append(result[i]).append(" ");
        }
        System.out.println(sb);
    }
}

결과

회고

  • 스택을 써도 시간초과가 날 수 있으므로 주의하자... 
저작자표시 비영리 동일조건 (새창열림)

'알고리즘' 카테고리의 다른 글

[프로그래머스] 보행자천국 - Java  (2) 2025.02.13
[프로그래머스] 풍선 터트리기 - Java  (1) 2025.02.11
[백준] 시그널 - Java  (3) 2025.02.05
[백준] 채굴 - Java  (2) 2025.02.03
[프로그래머스] 단속카메라 - Java  (4) 2025.02.03
'알고리즘' 카테고리의 다른 글
  • [프로그래머스] 보행자천국 - Java
  • [프로그래머스] 풍선 터트리기 - Java
  • [백준] 시그널 - Java
  • [백준] 채굴 - Java
BGK97
BGK97
사용자 입장에서 한번 더 생각하는 개발자로 성장하고 싶은 사람입니다.
  • BGK97
    꾸준히, 열심히
    BGK97
  • 전체
    오늘
    어제
    • 분류 전체보기 (111)
      • 알고리즘 (73)
      • 컴퓨터 구조와 운영 체제(책) (8)
      • 네트워크 (5)
      • React (10)
      • 경험한 에러들 (3)
      • HTML, CSS, JavaScript (8)
      • 자료구조 (1)
      • 이것이 컴퓨터 과학이다(책) (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BGK97
[백준] 오큰수 - Java
상단으로

티스토리툴바