본문 바로가기
알고리즘

백준 g5 2493 탑 c++

by kyj0032 2024. 1. 10.

풀이

역순으로 맨 뒤에서부터 시작 <- cur

stack의 top과 cur을 비교해서 cur이 더 크면, top은 cur로 신호가 간다

그렇지 않으면, cur의 신호 역시 stack에 쌓이고 다음으로 넘어간다

예시)

6 9 5 7 4 이렇게 있을 때, 4부터 시작

  • 4와 7 비교, 7이 더 크므로 4의 신호는 7로 간다 / 4 pop
    • 7 push
  • 7(스택의 top) 과 5 비교, 5가 더 작으므로 7의 신호는 그 다음으로 넘어간다
    • 5 push
  • 5(top) 과 9 비교, 9가 더 크므로 5는 9로 간다 / 5 pop
  • 다음 top인 7과 9 비교, 9가 더 크므로 7은 9로 간다 / 7 pop
    • 9 push

...

고려했던 것

  • 수도코드랑 다르게 실제로는 stack에 쌓여있는 값들의 index도 필요했기에 stack<pair<int, int>>로 선언
  • 2년 전에 풀었던 풀이는 역순이 아닌 정방향으로 풀이, 생각해보면 굳이 역순으로 풀 필요는 없음
    • 그렇지만 문제가 복잡해질수록 특히 시뮬레이션 같은 경우는 괜히 다르게 풀었다가 틀리는 경우가 많으므로 웬만하면 문제 그대로 따라가는 게 나음
/*boj g5 2493 탑*/
#include <iostream>
#include <stack>
#define MAXN 500005
using namespace std;

int N;
int tower[MAXN];
int answer[MAXN];
stack<pair<int, int>> S; // index, height
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;

    for (int i = 1; i <= N; i++)
    {
        cin >> tower[i];
    }

    for (int i = N; i >= 1; i--)
    {
        int cur = tower[i];

        while (!S.empty() && S.top().second < cur)
        {
            answer[S.top().first] = i;
            S.pop();
        }

        S.push({i, cur});
    }

    for (int i = 1; i <= N; i++)
    {
        cout << answer[i] << " ";
    }
    cout << "\n";
}

 

2년 전에 풀었던 풀이

정방향으로 풂, 높았던 탑들을 stack에 쌓아가며 푸는 방식

초기값으로 max_height를 넣고 시작

예시) 6 9 5 7 4

{max_height, 6}

{max_height, 9} 6보다 9가 더 크므로 6 삭제, 뒤에 오는 탑들은 9로 신호가 간다 9가 제일 크니까

{max_height, 9, 5}

{max_height, 9, 7} 5보다 7이 더 크므로 5 삭제, 뒤에 오는 탑들은 7로 신호가 간다

...

 

/*g5 2493 탑*/

#include <bits/stdc++.h>
using namespace std;

stack<pair<int, int>> tower;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n;
	stack <pair<int,int>> tower;
	tower.push({ 100000001, 0 });
	
	for (int i = 1; i <= n; i++) {
		int num;
		cin >> num;

		while (tower.top().first < num) {
			tower.pop();
		}
		cout << tower.top().second << " ";
		tower.push({ num, i });
	}
}

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

백준 g5 5430 AC c++  (0) 2024.01.11
백준 s4 1021 회전하는 큐 c++  (0) 2024.01.11
백준 s4 2164 카드2 c++  (0) 2024.01.10
백준 s2 1874 스택수열 c++  (0) 2024.01.10
c++ 4. 연결리스트 연습문제  (0) 2024.01.10