본문 바로가기

코딩테스트/백준

[백준-자바] 10539번 사과나무 / 2022.05.17

 

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

 

19539번: 사과나무

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

www.acmicpc.net

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader((new InputStreamReader(System.in)));
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        int N = Integer.parseInt(stringTokenizer.nextToken()); // 수의 개수
        ArrayList<Integer> tree = new ArrayList<>();
        stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        int hap = 0; // 나무 길이의 합
        int count = 0; // 2를 뿌릴 수 있는 횟수

        for(int i=0; i<N; i++){
            int water = Integer.parseInt(stringTokenizer.nextToken());
            count += water/2; // 2로 나눈 몫은 2로 뿌릴 수 있는 횟수를 말함
            hap += water; // 나무 길이의 합
        }

        if(hap%3!=0){ // 나무 길이의 합이 3으로 나누어 떨어지지 않으면
            System.out.println("NO"); // 만들 수 없음
        } else { // 나무 길이의 합이 3으로 나누어 떨어지고
            hap = hap / 3; // 3으로 나눈 몫을 3으로 뿌릴 수 있는 횟수
            if(count>=hap) // 2를 뿌릴 수 있는 횟수가 3으로 뿌릴 수 있는 횟수 이상이여야 함
                System.out.println("YES");
            else
                System.out.println("NO");
        }
    }
}

 

풀이 :

원하는 높이가 되도록 물뿌리개를 뿌리려면? 

1) 나무 길이의 합이 3으로 나누어 떨어져야 함

2) 2를 10번 뿌리면 1도 10번 뿌려야 함 -> 각 길이를 입력받을 때 2를 뿌릴 수 있는 수를 count 해준다.

3) 이 count 값이 나무 길이의 합을 3으로 나눈 몫보다 크거나 같아야 한다. (2를 적어도 hap/3 이상 뿌려야된다는 뜻)

4) 만약 count값이 나무 길이의 합을 3으로 나눈 몫보다 크다면? 넘치는 값은 자동으로 1로 나누어서 뿌려짐