티스토리 뷰

알고리즘/백준

백준 11509 (풍선 맞추기) - java

김다미김태리신시아 2023. 11. 1. 19:00

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

 

11509번: 풍선 맞추기

첫 번째 예제 에서 [5,4,3] 을 터트리고 [2,1]을 터트리면 모든 풍선을 터트릴 수 있으므로 최소한 2개의 화살을 필요로 한다.

www.acmicpc.net

 

문제

큰 방에 N개의 풍선이 떠있다. 풍선들은 왼쪽부터 오른쪽까지 일렬로 있다. 진솔이는 화살 가지고 노는 것과 사냥 연습하는 것을 좋아한다. 진솔이는 화살을 왼쪽에서 오른쪽으로 쏜다. 높이는 임의로 선택한다. 화살은 선택된 높이 H에서 풍선을 마주칠 때까지 왼쪽에서 오른쪽으로 이동한다. 화살이 풍선을 마주치는 순간, 풍선은 터지고 사라진다. 화살은 계속해서 가던길을 가는데 높이는 1 줄어든다. 그러므로 만약 화살이 높이 H에서 이동 중이었다면 풍선을 터트린 후에는 높이가 H-1이 된다.

우리의 목표는 모든 풍선을 터트리되 가능한한 적은 화살을 사용하는 것이다.

 

유형 : 그리디

 

접근 방식

  • 생각해보면 간단한 문제이다. 화살이 풍선을 맞출 때마다 해당 i높이에서 1을 뺀 i-1의 위치에 화살을 저장해놓으면 된다.
  • 그리고 선형 탐색을 진행하면서 해당 위치에 저장된 화살이 있는지 확인하여 연산하면 된다.

전체 코드

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

public class Main {
    static int n = 0;
    static int[] board;
    static int[] count;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        n = Integer.parseInt(st.nextToken());
        board = new int[n+1];
        count = new int[1000001];

        st = new StringTokenizer(br.readLine(), " ");
        for(int i=1;i<=n;i++){
            board[i] = Integer.parseInt(st.nextToken());
        }

        int num = 0;

        for(int i=1;i<=n;i++){
            if(count[board[i]] == 0){
                num = num + 1;
            }
            else{
                count[board[i]]-= 1;
            }

            if(board[i] - 1 >= 1)
                count[board[i]-1] += 1;
        }

        System.out.println(num);

        br.close();
    }
}