티스토리 뷰
https://www.acmicpc.net/problem/11509
11509번: 풍선 맞추기
첫 번째 예제 에서 [5,4,3] 을 터트리고 [2,1]을 터트리면 모든 풍선을 터트릴 수 있으므로 최소한 2개의 화살을 필요로 한다.
www.acmicpc.net
처음 드는 생각은 가장 높은 높이 h를 찾고 그 이후에 h-1값이 있다면 1씩 감소시키면서 풍선을 터트리는 브루트포스 방법이다.
하지만 이방법은 가장 높은 높이 h를 찾은후에 h보다 1작은 값을 계속 찾아야하므로 O(n^2)의 시간복잡도를 갖게되고 n은 최대 1000000이므로 불가능하다.
그 후 생각해본것이 배열의 인덱스를 이용한 방법이다.
배열의 인덱스를 높이, 값을 해당하는 높이에 현재 존재하는 화살이라고 생각한다.
풍선의 높이들을 순회하면서 배열[풍선높이+1]이 0보다 크다면 해당 높이에 현재 화살이 있으므로 풍선을 터트릴수 있다. 따라서 배열[풍선높이+1]은 -1하고, 배열[풍선높이]는 +1한다.
배열[풍선높이+1]이 0보다 크지않다면 이미 쏜 화살중에 현재 풍선을 터트릴수있는 화살은 없으므로 새로운 화살을 쏴야한다. 즉 배열[풍선높이] +1 해준다.
예를들어 주어진 풍선들의 높이가 {2 1 5 4 3} 이라면 첫풍선부터 탐색을 시작한다
풍선높이: 2
arr[2+1] = 0 이므로 현재 풍선을 터트릴 이미 쏜 화살은 없다.
따라서 arr[2]++
idx (화살높이) | 1 | 2 | 3 | 4 | 5 |
화살갯수 | 0 | 1 | 0 | 0 | 0 |
풍선높이: 1
arr[1+1] = arr[2] = 1 이므로 현재 풍선을 터트릴 이미 쏜 화살이 존재한다.
따라서 arr[2]--; arr[1]++;
idx (화살높이) | 1 | 2 | 3 | 4 | 5 |
화살갯수 | 1 | 0 | 0 | 0 | 0 |
풍선높이: 5
arr[5+1] = arr[6] = 0
arr[5]++;
idx (화살높이) | 1 | 2 | 3 | 4 | 5 |
화살갯수 | 1 | 0 | 0 | 0 | 1 |
풍선높이: 4
arr[4+1] = arr[5] = 1
arr[5]--; arr[4]++;
idx (화살높이) | 1 | 2 | 3 | 4 | 5 |
화살갯수 | 1 | 0 | 0 | 1 | 0 |
풍선높이: 3
arr[3+1] = arr[4] = 1
arr[4]--; arr[3]++;
idx (화살높이) | 1 | 2 | 3 | 4 | 5 |
화살갯수 | 1 | 0 | 1 | 0 | 0 |
반복문이 끝난후 arr의 화살갯수를 새어주면 된다.
#include <iostream>
#define MAX 1000001
using namespace std;
int n;
int balloon[MAX];
int mark[MAX];
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n;
for(int i = 0; i < n; i++)
cin >> balloon[i];
for(int i = 0; i < n; i++)
{
int h = balloon[i];
if(mark[h+1] > 0)
{
mark[h+1]--;
mark[h]++;
}
else
{
mark[h]++;
}
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
ans += mark[i];
}
cout << ans;
}
'PS' 카테고리의 다른 글
백준 17615. 볼 모으기 (0) | 2021.08.26 |
---|---|
백준 5545. 최고의 피자 (0) | 2021.08.25 |
백준 1105. 팔 (0) | 2021.08.24 |
백준 1448. 삼각형 만들기 (0) | 2021.08.24 |
백준 13417. 카드 문자열 (0) | 2021.08.24 |
- Total
- Today
- Yesterday
- dfs
- Unity
- MVC
- BFS
- recursion
- greedy
- Spring
- priority queue
- Dijkstra
- Kruskal
- permutation
- 조합
- Python
- C
- CSS
- Stack
- binary search
- floyd warshall
- Brute Force
- graph
- Tree
- db
- 자료구조
- 재귀
- two pointer
- back tracking
- DP
- Implementation
- 이분탐색
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |