mojo's Blog

[백준 19539] 사과나무 본문

백준/Greedy

[백준 19539] 사과나무

_mojo_ 2021. 7. 17. 09:03

문제 링크 => 19539번: 사과나무 (acmicpc.net)

 

19539번: 사과나무

첫 번째 줄에 모든 나무가 갊자가 바라는 높이가 되도록 물뿌리개를 통해 만들 수 있으면 “YES”를, 아니면 “NO”를 따옴표를 제외하고 출력한다.

www.acmicpc.net


그리디 알고리즘 문제이다.

 

1과 2를 동시에 사용하여 나열된 나무의 높이를 만들어 내도록 하는 문제이다.

 

이때 다음과 같은 예는 성립하지 않는다.

 

[1 1 2 2 2] => 마지막에 2만 남으므로 성립하지 않음

 

[1 1 1 2 2 2 2] => 이 또한 마지막에 2만 남으므로 성립하지 않음

 

즉, 합이 3의배수가 아닌 경우는 무조건 "NO" 이다.

 

그리고 합이 3의 배수일때의 예를 살펴보도록 한다.

 

[1 1 2 2] => 1, 2를 모두 사용하여 만들어낼 수 있으므로 성립함 (1, 2를 총 2번 사용하고 총 합이 6이다.)

 

[100, 1000, 10000] => 1, 2를 모두 사용하여 만들어낼 수 있으므로 성립함 (1, 2를 총 11100/3 번 사용하고 총 합이 11100 이다.)

 

[1, 3, 1, 3, 1] => 합이 3의 배수이지만 1, 2를 모두 사용하여 만들어낼 수 없으므로 성립하지 않음 (2를 총 2번 사용하고 나머지 1을 독립적으로 제거할 수 없음)

 

위의 규칙성을 보아하니 2를 사용한 총 횟수를 op 라 하고 총 합을 sum 이라고 했을때 op >= sum/3 일 경우 성립함을 알 수 있다.

 

풀이 code

#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <time.h>
#define INF 100000000
#define endl '\n'
#define ll long long

using namespace std;

map<int, int> m;

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	int n, sum=0, op=0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		sum += x;
		op += x / 2;
	}
	
	if (sum % 3 == 0) {
		if (op >= sum / 3) cout << "YES";
		else cout << "NO";
	}
	else {
		cout << "NO";
	}

	return 0;
}

 

 

 

 

'백준 > Greedy' 카테고리의 다른 글

띄어쓰기를 포함한 문자열을 입력  (0) 2022.01.05
[백준 1744] 수 묶기  (0) 2021.11.12
[백준 1339] 단어 수학  (0) 2021.11.11
[백준 19541] 역학 조사  (0) 2021.07.17
Comments