Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • KMP
  • 누적합
  • 이분탐색
  • 수학
  • 유니온 파인드
  • 백트래킹
  • 조합론
  • 최소 스패닝 트리
  • 정수론
  • LCA
  • 큐
  • 분할정복
  • 투포인터
  • C++
  • 위상 정렬
  • 기하
  • 스택
  • 브루트포스
  • UC++
  • 우선순위큐
  • 정렬
  • SCC
  • 트라이
  • 그래프
  • 세그먼트 트리
  • 구현
  • 문자열
  • 백준
  • 동적계획법
  • 트리

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++]백준 - 17298번 문제
공부 및 정리/백준 코드

[C++]백준 - 17298번 문제

2021. 6. 10. 18:30

17298번: 오큰수 (acmicpc.net)

 

17298번: 오큰수

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

www.acmicpc.net

 

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)을 공백으로 구분해 출력한다.

 

 


 

생각해 볼 점


입력값의 마지막부터 역순으로 진행될 내용이므로, 입력을 Input 스택에 받습니다.

 

오큰수를 담는 OKS 스택과 결과를 담은 Result 스택을 더 준비합니다.

 

예시)

입력 : {3 5 2 7}

 

1. Input 스택에 3,5,2,7을 차례로 담습니다.

2. Input 스택의 top을 확인하고 OKS 스택 중 top보다 큰 숫자가 나올 때까지 pop을 진행합니다.

3. OKS 스택에서 큰 숫자를 발견하지 못했다면 -1을 result에 담고, 있다면 해당 숫자를 담습니다.

4. OKS 스택에 Input 스택의 top을 담고, Input 스택의 pop을 진행합니다.

 

5. Input 스택이 빌 때까지 2~4를 반복합니다.

 

코드


#include <iostream>
#include <stack>
using namespace std;

int main()
{
    int N;
    cin >> N;
    stack<int> st, oks, result;		//스택, 오큰수, 결과
    for(int i = 0; i < N; i++)
    {
        int input;
        cin >> input;
        st.push(input);				//입력 값 스택에 담기
    }
    while(!st.empty())				//스택이 빌 때까지
    {
        while(!oks.empty() && oks.top() <= st.top()) oks.pop();	//오큰수 찾기
        if(oks.empty()) result.push(-1);		//없으면 -1
        else result.push(oks.top());			//있으면 오큰수
        oks.push(st.top());				//오큰수 새로 담기
        st.pop();
    }
    while(!result.empty())
    {
        cout << result.top() << " ";
        result.pop();
    }
    return 0;
}

 

그 외


 

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 11866번 문제  (0) 2021.06.10
[C++]백준 - 2164번 문제  (0) 2021.06.10
[C++]백준 - 1874번 문제  (0) 2021.06.10
[C++]백준 - 2004번 문제  (0) 2021.06.10
[C++]백준 - 1676번 문제  (0) 2021.06.10
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 11866번 문제
    • [C++]백준 - 2164번 문제
    • [C++]백준 - 1874번 문제
    • [C++]백준 - 2004번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바