누룽지맛치킨
어미새의 개발일지
누룽지맛치킨
전체 방문자
오늘
어제
  • 분류 전체보기 (86)
    • 코틀린 (8)
    • 안드로이드 (5)
      • 디자인 (2)
      • 개발 (2)
      • 도구 (1)
    • 피그마 (1)
    • 대외활동 (0)
    • 프로젝트 (0)
    • 백준 (55)
      • JAVA (55)
    • 알고리즘 (3)
    • 클라우드 (5)
    • 스터디 (2)
      • 코테 (2)
    • 자료구조 (5)
    • 컴퓨터 기술 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 코틀린
  • 백준 자바 2559번
  • 알고리즘 조합
  • 코틀린 인 액션
  • 안드로이드 디자인
  • 클라우드 컴퓨팅
  • 코틀린 runBlocking
  • 백준 자바 정렬
  • 백준 자바 누적합
  • 자바 Priority Queue
  • 백준 자바
  • 안드로이드
  • 백준 자바 다이나믹 프로그래밍
  • 백준 자바 벌집
  • 백준 자바 수열
  • 클라우드
  • Room version 올리기
  • Room Migration
  • 자료구조
  • 백준 자바 2292번

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
누룽지맛치킨

어미새의 개발일지

백준/JAVA

[백준/JAVA] 17298번 오큰수

2023. 2. 10. 14:31
  • 스택으로 풀 수 있는 꽤 어려운 문제
    https://www.acmicpc.net/problem/17298

1. 문제

크기가 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이다.

2. 문제 접근

1) 첫째 줄에 수열 A의 크기 N을 입력받는다.
2) N의 크기만큼 스택 배열 하나와 출력을 할 배열 하나를 선언하고 출력을 할 배열은 모두 -1로 초기화한다.
3) N만큼 반복하면서 수열 A의 원소를 입력받는다.
4) 원소를 입력받을 때 스택에 있는 수를 하나씩 꺼내 비교하면서 입력받은 수가 스택에서 꺼낸 수보다 클경우 출력 배열에 스택에서 꺼낸 원소의 인덱스에 입력받은 수를 저장한다.
5) 입력받은 수가 더이상 크지 않을 때까지 반복한 후에 스택에 입력받은 원소를 저장한다.
6) N 반복이 끝난 후 출력 배열의 수들을 출력한다.

3. 코드

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
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 stack[] = new int[N];
        int result[] = new int[N];
        StringBuilder sb = new StringBuilder();
        for(int i =0;i<N;i++) {
            result[i] = -1;
        }
        int top = -1;
        StringTokenizer st = new StringTokenizer(br.readLine());

        for(int i=0;i<N;i++) {
            int input = Integer.parseInt(st.nextToken());
            int t= i-1;
            while(top>=0 && stack[top] < input) {
                if(result[t]==-1) {
                    result[t]= input;
                    top--;
                    t--;
                }
                else {
                    t--;
                }
            }
            stack[++top] = input;
        }
        for(int i=0;i<N;i++) {
            sb.append(result[i]).append(" ");
        }
        System.out.println(sb);
    }
}

'백준 > JAVA' 카테고리의 다른 글

[백준/JAVA] 14888번 연산자 끼워넣기  (0) 2023.02.10
[백준/JAVA] 15650번 N과 M(2)  (0) 2023.02.10
[백준/JAVA] 1021번 회전하는 큐  (0) 2023.02.10
[백준/JAVA] 10866번 덱  (0) 2023.02.10
[백준/JAVA] 1966번 프린터 큐  (0) 2023.02.10
    '백준/JAVA' 카테고리의 다른 글
    • [백준/JAVA] 14888번 연산자 끼워넣기
    • [백준/JAVA] 15650번 N과 M(2)
    • [백준/JAVA] 1021번 회전하는 큐
    • [백준/JAVA] 10866번 덱
    누룽지맛치킨
    누룽지맛치킨

    티스토리툴바