코테/백준

[백준/JAVA] 1863번: 스카이라인 쉬운거

imname1am 2024. 8. 13. 17:15
반응형

📖 문제

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

 

 

 

💡  풀이 방식

• 스택

. 건물의 높이(y)가 달라지는 걸 확인하기 위해 스택을 활용한다.

 

- 건물의 높이가 낮아진 경우           > 뒤에 있는 건물이 끝났다는 의미. 스택이 비지 않을 때까지 한 빌딩과 해당 빌딩과 같은 높이의 빌딩을 같은 빌딩으로 취급하며 제거

- 건물의 높이가 같은 빌딩인 경우  > skip

- 건물의 높이가 높아진 경우           > 스택에 push해 최고층 높이의 건물 갱신

 

 

💥 유의사항

- 입력을 다 받았는데 스택에 값이 남아있다면, 건물이 남아있는 것과 마찬가지이므로 남아있는 값의 갯수만큼 하나의 건물로 취급해 건물 갯수를 센다.

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        int N = Integer.parseInt(br.readLine());
        int ans = 0;
        Stack<Integer> stack = new Stack<>();   // 건물 높이가 달라지는 걸 확인하고자 Stack 사용
        
        for(int i = 0 ; i < N ; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            
            // 높이가 낮아지면, 뒤에 있는 건물이 끝났다는 의미
            while(!stack.isEmpty() && stack.peek() > y) {
                ans++;
                stack.pop();
            }
            
            // 높이가 같은 빌딩인 경우 skip
            if(!stack.isEmpty() && stack.peek() == y) {
                continue;
            }
            
            // 높이가 높아진 경우, stack에 push해 최고층 높이의 건물 갱신
            stack.push(y);
        }
        
        // 스택이 비지 않은 경우
        while(!stack.isEmpty()) {
            // 남은 건물이 있는 경우
            if(stack.peek() > 0) {
                ans++;
            }
            stack.pop();
        }
        
        System.out.println(ans);
    }
}
cs

 

 

 

 

➕ 다른 풀이 방식

조금 다르다.

 

[백준/java] 1863. 스카이라인 쉬운거

문제 링크 - https://www.acmicpc.net/problem/1863어떻게 풀어야 할지 막막해서 백준 힌트를 통해 스택으로 푸는 것이라는걸 알아냈지만 그 이후에도 감이 안와서 구글링을 참고 하였다.다음과 같은 규칙

velog.io


💦 어려웠던 점

- 스택을 사용할 생각조차 하지 못 했다.ㄴㅇㄱ 2차원 배열 안에 값들을 넣어놓고 직사각형 갯수를 직접 만들어 셀 생각을 했다.ㅋ

 

 

🧐 새로 알게 된 내용

- 스택 활용 아이디어

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 정답 제출 시 참고한 풀이

 

백준 1863 - 스카이라인 쉬운거 Java

https://www.acmicpc.net/problem/1863 1863번: 스카이라인 쉬운거 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 50,000) 다음 n개의 줄에는 왼쪽부터 스카이라인을 보아 갈 때 스카이라인의 고도가 바뀌는 지점의 좌표 x

dhelloper.tistory.com

 

- 풀이가 약간 다르지만 이해할 때 참고한 풀이

 

백준 1863 - 스카이 라인 쉬운거

1863번: 스카이라인 쉬운거현재까지의 건물 높이값보다 낮은 높이가 들어올 경우 무조건 스카이라인이 바뀐다.따라서 낮은 높이가 들어올 경우스택이 비지 않을 때까지 한 빌딩과 해당 빌딩과

velog.io

 

반응형