일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- placement new
- virtual function
- c++ multi chatting room
- suffix return type
- base from member
- delete function
- discord bot
- member function pointer
- C++
- c++ basic practice
- vector size
- std::cout
- virtual destructor
- return by reference
- new&delete
- increment operator
- std::vector
- virtual inheritance
- 더 지니어스 양면포커
- std::endl
- pointer to member data
- conversion constructor
- this call
- diamond inheritance
- operator overloading
- constructor
- dynamic_cast
- vector capacity
- virtual function table
- std::ostream
- Today
- Total
I'm FanJae.
[BOJ] 17298 오큰수 (C++) 본문
1. 문제 링크
https://www.acmicpc.net/problem/17298
2. 문제 접근
- 왼쪽에서 오른쪽으로 볼때, 자신보다 큰 수 중에서 가장 가까운(왼쪽에 있는 수)를 구하면 된다.
- 어떤 수를 기준으로 자신보다 큰 수가 등장했다는 건 그 수의 정답이 확정된다.
- 즉, 큰 값이 나타날때까지 stack에 넣어주고 대기한다. 자신보다 큰 수가 등장하면 그 수가 정답이 된다.
- 3을 처음 넣을때는 아무것도 없으므로, 바로 넣어준다. 이후 들어오는 값인 5는 스택에 있던 값인 3보다 크므로 오큰수다.
- 이에 따라서, 3을 빼주고, 3에 대한 오큰수는 5임을 알 수 있다.
- 2의 경우는 5에 대한 오큰수가 될 수 없기 때문에 그대로 넣는다.
- 마지막으로 들어오는 7은 2보다 크기 때문에 2의 오큰수가 성립하므로, stack에서 빼준다.
- 7은 5보다 더 크기 때문에 5의 오큰수가 성립하므로, stack에서 빼준다.
3. 문제 풀이
- stack이 비어있는 경우엔 그냥 넣는다.
- stack에 있는 수보다 현재 넣으려는 수가 크다면, 그 안에 있는 수들은 모두 pop 한다.
- pop되는 값의 오큰수는 결정되기 때문에 이를 바로 출력해주거나, 해당 수의 인덱스에 해당하는 값에 답을 적어준다.
- 마지막까지 스택에 남아있는 답이 존재했다면, 그 수는 오큰수가 없으므로 -1을 적어주면 된다.
- 본인의 경우 이 문제를 풀때, 스택을 pair<int,int> 형태로 만들어서 값과 인덱스 값을 같이 넣어서 처리했다.
4. 소스 코드(C++)
#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
int value[1000005];
int answer[1000005];
stack <pair<int,int>> stk;
int main(void)
{
int n;
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> value[i];
}
for (int i = 1; i <= n; i++)
{
while (!stk.empty() && stk.top().first < value[i]) // 나보다 큰 수가 등장했다면, 그 수는 나의 오큰수이다.
{
answer[stk.top().second] = value[i]; // 해당 인덱스의 오큰수로 갱신.
stk.pop(); // 스택에서 꺼낸다.
}
stk.push({ value[i], i }); // 해당값은 스택에 넣는다.
}
while (!stk.empty()) // 끝까지 탐색 후 오큰수를 찾지 못했다면 모두 -1로 갱신.
{
answer[stk.top().second] = -1;
stk.pop();
}
for (int i = 1; i <= n; i++)
{
cout << answer[i] << " ";
}
}
'Algorithm' 카테고리의 다른 글
[BOJ] 3015 오아시스 재결합 (C++) (0) | 2024.11.01 |
---|---|
[BOJ] 6198 옥상 정원 꾸미기 (C++) (0) | 2024.10.29 |
[BOJ] 2493 탑 (C++) (0) | 2024.10.29 |
[BOJ] 1874 스택 수열 (C++) (0) | 2024.10.29 |
[BOJ] 10773 제로 (C++) (0) | 2024.10.28 |