본문 바로가기
코딩테스트(알고리즘)/baekjoon

[baekjoon] 탑 2493 (Javascript,c++)

by Cafe Mocha 2022. 6. 15.

2493번: 탑 (acmicpc.net)

 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1

www.acmicpc.net


접근 방법

알고리즘 : 스택

 

c++ stack으로 무식하게 구현했더니 시간초과 발생.

바킹독 님의 풀이를 참고하여 Javascipt로 직접 문제풀이 완료.

 


Javascript

function solution() {
  let input = require("fs")
    .readFileSync("input.txt") //"/dev/stdin"
    .toString()
    .trim()
    .split("\n")
    .map((val) => val.trim());

  let n = +input[0];
  let arr = input[1].split(" ").map((v) => +v);
  let tower = [[100000001, 0]];
  let ans = [];

  for (let i = 1; i <= n; i++) {
    while (tower[tower.length - 1][0] < arr[i - 1]) {
      tower.pop();
    }

    ans.push(tower[tower.length - 1][1]);
    tower.push([arr[i - 1], i]);
  }

  console.log(ans.join(" "));
}

solution();

 


C++

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second

int N;
stack<pair<int,int>> tower;

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  cin >> N;  
  tower.push({100000001, 0});
  for (int i = 1; i <= N; i++) {
    int height;
    cin >> height;
    while (tower.top().X < height)
      tower.pop();    
    cout << tower.top().Y << " ";
    tower.push({height, i});      
  }
}