코딩테스트 준비하기/시뮬레이션 & 자료구조
백준 - 탑(C++)
코드 살인마
2021. 9. 7. 19:37
728x90
문제 : https://www.acmicpc.net/problem/2493
[
2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
](https://www.acmicpc.net/problem/2493)
문제설명
단순 반복문을 사용한 구현문제로는 제약조건 때문에 시간초과가 날 수 있다. 1개의 for문을 사용하되 문제를 풀 수 있는 방법 하면 stack이 생각나야한다.
알고리즘
1. for문을 이용하여 앞에서 부터 스캔하며 stack에 값을 push한다.
2. 조건문안에 stack이 비었으면 자신보다 큰 탑이 없다는 것임으로 '0'을 출력한다.
3. stack의 top보다 크면 자신보다 큰 탑이 있는 것임으로 top의 인덱스를 출력한다.
4. 아닐경우 pop한다.
주의사항
- stack을 생각하기 어려운 문제이다. stack만 생각한다면 풀기 쉬운문제이다.
구현
int main() {
int N = 0;
scanf("%d", &N);
stack<pair<int,int>> s; //첫번째 값은 탑 높이, 두번째 값은 탑 인덱스
for (int i = 0; i < N; i++)
{
scanf("%d", &num[i]);
}
for (int i = 0; i < N; i++)
{
while(!s.empty())
{
if (s.top().first > num[i])
{
printf("%d ", s.top().second+1);
break;
}
s.pop();
}
if(s.empty())
{
printf("0 ");
}
s.push({ num[i] ,i});
}
}