알고리즘
[백준 6198 JAVA] 옥상 정원 꾸미기
begong
2024. 2. 11. 15:50
반응형
Stack을 활용하는 문제
한 방향으로만 건물을 볼수있다 => 이미 앞에있는 건물들은 신경안써도 된다.
이미 stack안에 존재하는 건물들이 새로 들어온 건물을 볼수 있냐 없냐에만 신경쓰면됨
=> 이미 stack에있는 건물보다 큰 건물이 들어왔을때는 stack에서 제거 : stack에 있는 건물들은 이 건물을 볼 수 없기 때문에
=> stack에 있는 건물보다 작은 건물이 들어왔을때 : stack에 push
이 로직으로 진행한다면 stack안에는 새로 들어오는 건물을 볼 수 있는 건물만 남게 된다.
새로 들어온 건물을 몇개가 볼수있느냐? 로 이해하면 금방 풀리는 문제
단 건물의 크기가 10억까지 존재함으로 long타입을 써야 overflow가 나지 않는다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Stack<Integer> st = new Stack<>();
long answer = 0;
for (int i = 0; i < N; i++) {
int building = Integer.parseInt(br.readLine());
// stack 이 비었을때는 Pass
if (st.isEmpty()) {
st.add(building);
continue;
}
//stack이 비지않았고 stack의 꼭대기에 있는 building이 새로들어오는 building의 크기보다 작거나같을때 stack에서 제거
//새로들어오는애보다 낮은 building은 어쩌피 들어오는 building들을 못봄
while(!st.isEmpty() && st.peek()<=building){
st.pop();
}
//stack에 있는 애들은 새로 들어오는 building을 볼수있는 building들
answer +=st.size();
st.add(building);
}
System.out.println(answer);
}
}
반응형