ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 19539(사과나무)
    전공/알고리즘 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";
    	}
    }

     

     

     

     

     

    댓글

Designed by Tistory.