[BOJ/Java] 1863: 스카이라인 쉬운거

2025. 6. 17. 00:54·Problem Solving/BOJ

문제

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

스카이라인은 건물의 그림자를 말한다.

스카이라인을 보고 도시에 세워진 건물이 몇 채인지 알고싶다.

정확히 몇개인지 아는 것은 대부분 불가능하고, 최소한 몇 채인지 알아내고 싶다. 

아래 스카이라인을 보자.

..........................
.....XX.........XXX.......
.XXX.XX.......XXXXXXX.....
XXXXXXXXXX....XXXXXXXXXXXX

다음 스카이라인에는 최소 6개의 건물이 있다.

..........................
.....22.........333.......
.111.22.......XX333XX.....
X111X22XXX....XX333XXXXXXX

..........................
.....XX.........XXX.......
.XXX.XX.......5555555.....
4444444444....5555555XXXXX

..........................
.....XX.........XXX.......
.XXX.XX.......XXXXXXX.....
XXXXXXXXXX....666666666666

 

n개의 건물의 높이가 바뀌는 순간의 (x, y) 좌표가 주어진다. 

  • 1 ≤ n  ≤ 50,000
  • 1 ≤ x ≤ 1,000,000
  • 1 ≤ y ≤ 500,000

 

풀이

 

  • 스택을 활용하여 이전 높이 정보를 저장하며, 현재 위치의 높이와 비교해 변화 여부를 판단한다.
  • 높이가 0인 경우, 현재 지점은 건물이 없는 공간을 의미하므로
    → 지금까지 유지된 높이(=건물)를 모두 종료시켜
    → 스택에 쌓인 높이 개수만큼 건물을 카운트하고,
    → 스택을 비운다.
  • 현재 높이가 이전보다 낮아진 경우,
    → 이전에 이어지던 높은 건물이 끝난 것으로 간주하여
    → 스택에서 높이를 하나씩 제거(pop)하면서 count를 증가시킨다.
    → 현재 높이보다 작거나 같은 높이가 나올 때까지 반복한다.
  • 현재 높이가 이전보다 높아진 경우,
    → 새로운 건물의 시작으로 판단하여
    → 현재 높이를 스택에 추가(push)한다.
  • 반복이 끝난 후에도 스택에 남아 있는 높이들은 종료되지 않은 건물들이므로
    → 그 수만큼 추가로 count한다.

 

코드

import java.io.*;
import java.util.*;

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());
        List<int[]> skylines = new 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());
            skylines.add(new int[]{x, y});
        }

        int count = 0;
        Stack<Integer> stack = new Stack<>();
        for (int[] skyline : skylines) {
            if (skyline[1] == 0) {
                count += stack.size();
                stack.clear();
                continue;
            }

            while (!stack.isEmpty() && stack.peek() > skyline[1]) {
                stack.pop();
                count++;
            }

            if (stack.isEmpty() || stack.peek() < skyline[1]) {
                stack.push(skyline[1]);
            }
        }

        System.out.println(count + stack.size());
    }

}
저작자표시 비영리 동일조건 (새창열림)

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ/JavaScript] 1541: 잃어버린 괄호  (1) 2025.06.21
[BOJ/JavaScript] 7453: 합이 0인 네 정수  (0) 2025.06.17
[BOJ/Java] 16236: 아기 상어  (1) 2025.06.14
[BOJ/Java] 16927: 배열 돌리기 2  (1) 2025.06.12
[BOJ/Java] 14891: 톱니바퀴  (1) 2025.06.11
'Problem Solving/BOJ' 카테고리의 다른 글
  • [BOJ/JavaScript] 1541: 잃어버린 괄호
  • [BOJ/JavaScript] 7453: 합이 0인 네 정수
  • [BOJ/Java] 16236: 아기 상어
  • [BOJ/Java] 16927: 배열 돌리기 2
friend5hip
friend5hip
개발 관련 지식이나 기록을 남기고 있습니다.
  • friend5hip
    friend5hip
    friend5hip
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 컴퓨터공학 (2)
        • 자료구조 (0)
        • 알고리즘 (1)
        • 데이터베이스 (1)
      • Problem Solving (42)
        • BOJ (25)
        • 프로그래머스 (15)
      • 언어 (2)
        • JavaScript (2)
      • 라이브러리 (12)
        • React (12)
      • 개발 (2)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    삼성 sw 역량테스트
    프로그래머스
    시뮬레이션
    java
    dfs
    JavaScript
    문자열
    누적 합
    N과 M
    소수 판별
    vite
    순열
    백트래킹
    react
    이분 탐색
    구간 합
    정렬
    구현
    백준
    완전 탐색
    집합
    수학
    intersection observer
    그리디
    맵
    투 포인터
    매개 변수 탐색
    코드트리
    BFS
    dp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
friend5hip
[BOJ/Java] 1863: 스카이라인 쉬운거
상단으로

티스토리툴바