전공/알고리즘

백준 19539(사과나무)

xkdlaldfjtnl 2020. 7. 30. 20:08

ㅜhttps://www.acmicpc.net/problem/19539

 

19539번: 사과나무

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

www.acmicpc.net

2020ucpc H번 문제 

 

쉬는데 갑자기 계속 생각이 나길래 좀 더 생각을 해보니깐 알것 같다. 

 

일단 문제는 단순하다. 

 

2만큼 자라게 하는 물과

1만큼 자라게 하는 물을 무조건 하루에 다 써야 한다. 

 

주어진 나무의 길이를 모두 어떤 하루가 지났을 때에 도달할 수 있느냐

 

물을 한 나무에 모두 부어도 괜찮다.

 

 

 

그러면 하루에 3만큼 자라게 해주어야하고 특정일이 도달했을때에는 3*n만큼의 길이가 된다. 

 

따라서 만약에 목표 나무길이들의 합이 3의 배수가 아니라면 실패. 

 

(조건1)

 

결과를 봤을때로 가자 

 

2와 1은 동일 갯수로 쓰인다. 

 

며칠을 부어야 완성되는지 알면 2와 1이 얼마나 쓰이는지 쉽게 알 수 있다. 

 

총 나무의 길이 / 3 이 걸리는 일수이고, 

 

따라서 2를 붓는 횟수도 위의 일수와 동일하다

 

그런데 여기서 2를 부울수 있는 횟수만 확인하면 되는데 그 이유는 1은 어떤 높이여도 상관없는 그러니깐 나무 길이의 최소단위와 같으므로 2를 부울수 있는 횟수가 전체를 지배한다. 

 

따라서 2를 부울수 있는 전체횟수가 일수보다 크거나 같으면 만들 수 있게된다. 

 

 

 

만약 여기서 물이 2와 1이 아닌 3과 2라고 한다면 

 

훨씬 생각할게 많아지는 것 같다. 그래서 생각을 깊게 해보지는 않았다.

 

 

여기서 중요했던 포인트는 주어진 직접정보를 우리가 더 쉽게 인지할 수 있는 정보로 바꾸는 과정이다. 

 

총 걸리는 일수가 2를 붓는 횟수이고, 2를 부울 수 있는 횟수가 총 걸리는 일수보다 크거나 같다는게 이 문제의 풀이 과정이니깐.

 

머신러닝에서도 이런 과정을 거친다. 우리가 직접 모델을 선정하기 앞서서 정보들을 시각화하고, 합치고, 값을 조정하고 함으로써 우리에게 또 다른 새롭게 다가오는 정보를 만들 수 있는 것이다. 

 

 

 

#include<iostream>
using namespace std;

int N, sum, sum_2;

int main() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;
		sum += a;
		sum_2 += (a / 2);

	}
	if (sum % 3 == 0) {
		if (sum_2 >= (sum / 3)) {
			cout << "YES\n";
			return 0;
		}
		else {
			cout << "NO\n";
			return 0;
		}
	}
	else {
		cout << "NO\n";
	}
}