본문 바로가기

알고리즘/백준

백준 - 6198 옥상정원꾸미기

728x90

 

https://www.acmicpc.net/problem/6198

 

6198번: 옥상 정원 꾸미기

문제 도시에는 N개의 빌딩이 있다. 빌딩 관리인들은 매우 성실 하기 때문에, 다른 빌딩의 옥상 정원을 벤치마킹 하고 싶어한다. i번째 빌딩의 키가 hi이고, 모든 빌딩은 일렬로 서 있고 오른쪽으��

www.acmicpc.net

 

 

스택에 아이템을 한 개씩 push하면서 스택의 top()과 비교한다.

push 한 아이템의 높이가 스택의 top() 보다 작다면 스택의 모든 원소들은 그 아이템을 볼 수 있다는 뜻이다.

그러므로 답에 스택의 크기만큼 더해준다.

아이템의 크기가 스택의 값보다 크거나 같다면 스택의 top() 더이상 아이템 오른쪽에 있는 것들을 보지 못하므로 pop 시켜주고 이를 모든 아이템에 대해서 반복하면 된다.

 

시간복잡도는 O(N)이다.

 

 

 

 

import java.io.*;
import java.util.*;
public class Main {
	static class MyScanner {
		StringTokenizer st;
		BufferedReader bf;

		MyScanner() {
			bf = new BufferedReader(new InputStreamReader(System.in));
		}

		String next() {
			while (st == null || !st.hasMoreTokens()) {
				try {
					st = new StringTokenizer(bf.readLine());
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			return st.nextToken();
		}

		int nextInt() {

			return Integer.parseInt(next());
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyScanner sc = new MyScanner();
		int N = sc.nextInt();
		int bld[] = new int[N];
		for(int i =0 ;i < N;i++) {
			bld[i] = sc.nextInt();
		}
		long answer = 0;
		Stack <Integer> stack = new Stack<>();
		stack.add(bld[0]);
		
		for(int i =1 ;i < N ;i++) {

			while(!stack.isEmpty() && stack.peek()<=bld[i]) {
				stack.pop();
			}
			answer+=stack.size();
			stack.add(bld[i]);
		}
		System.out.println(answer);
		
		
		
		
	}

}

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 16934 게임 닉네임  (0) 2020.08.26
JAVA 8 - (1) 람다 함수  (0) 2020.07.03
백준 세부 13905  (0) 2020.05.29
백준 15961 회전초밥  (0) 2020.05.27
백준 2458 키 순서  (0) 2020.05.14