

문제 분석
- 제한 시간 1초: Big-O기준 약 1억 연산
- 인구수 100,000 , 뿅망치 횟수 제한 100,000 -> 모든 인구에게 망치질 하는 거 불가능
- 가장 큰 놈이 센티 보다 작으면 YES다.
- 망치 다써도 센티 보다 큰 놈이 하나라도 있으면 NO다.
풀이 방식
- priority_queue(pq) 사용
- 아래 행위를 망치 제한 만큼 반복
- 가장 큰 거인 을 망치로 때려 다시 pq에 삽입
- 가장 큰 거인이 센티 보다 작으면 "YES"출력 후 프로그램 종료
- 제한이 끝났는데 "YES" 출력 못했으면 "NO" 출력
주의 사항
- 거인의 키가 1이면 더이상 줄일 수 없다
- 센티가 처음부터 거인들 보다 더 클수도 있다.
priority_queue<int> giants;
int n, h, t;
int tmp;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> h >> t;
while (n--) { //거인들 키 pq에 삽입
int H;
cin >> H;
giants.push(H);
}
if (h > giants.top()) { //망치 안쓰고도 센티가 제일 큰 경우
cout << "YES\n0";
return 0;
}
for (int i = 1; i <= t; i++) {
if (giants.top() != 1) { //거인 키가 1이면 못때림
tmp = giants.top() / 2; //거인 키를 줄여서
giants.pop();
giants.push(tmp); //다시 pq에 삽입
}
if (h > giants.top()) { //가장 큰 거인보다 센티가 크게되면
cout << "YES\n" << i; //"YES"출력 후
return 0; //프로그램 종료
}
}
//망치 다썼으면
cout << "NO\n" << giants.top();
return 0;
}
느낀 점
- priority_queue를 써야한다는 생각이 든 후에는 금방 풀었다.
- 거인 키가 1인 경우엔 줄이지 못한다는 점 이나, 센티가 처음부터 거인들 보다 클 수 있다는 생각은 좀 나중에 들어 그 부분이 아쉽다.
- 이제 pq사용이 조금은 익숙해 진거 같아 뿌듯하다.
시간복잡도
- while문 : O(n)
- pq.push : O(logn)
- pq.top : O(1)
- pq.pop : O(logn)
- for문 : O(n)
➣ O(nlogn)
'Algorithm > baekjoon' 카테고리의 다른 글
[BOJ 17299] 오등큰수 (0) | 2022.07.26 |
---|---|
[BOJ 17298] 오큰수 (0) | 2022.07.26 |
[BOJ 25192] 인사성 밝은 곰돌이 (0) | 2022.07.26 |
[BOJ 17952] 과제는 끝나지 않아! (0) | 2022.07.25 |
[BOJ 12789] 도키도키 간식드리미 (0) | 2022.07.25 |