All :L

[BOJ/Java] 사과나무 (19539) 본문

CODING/BOJ

[BOJ/Java] 사과나무 (19539)

ofijwe 2024. 9. 1. 00:47
반응형

사과나무 (19539)

1. 문제 분석

문제 개요

  • 주어진 높이 배열을 이용해 높이를 조정하여 각 높이의 합이 3의 배수가 될 수 있는지 확인하는 문제이다.

입력 형식

  • 첫째 줄에 배열의 크기 ( N )이 주어진다.
  • 둘째 줄에 ( N )개의 정수로 이루어진 배열의 높이가 주어진다.

출력 형식

  • 높이 배열을 조정하여 3의 배수가 되는지 여부를 판단하여 "YES" 또는 "NO"를 출력한다.

2. 알고리즘 종류

  • 이 문제는 수학적 판별을 사용하는 문제이다. 주어진 높이 배열을 분석하여 총합과 나머지 값을 계산하고, 특정 조건을 만족하는지 여부를 검사해야 한다.

3. 주요 부분 및 코드 작성 방법

1. 수학적 판별 사용

  • 배열의 총합을 계산하고, 이 총합이 3으로 나누어떨어지는지 확인한다.
  • 각 높이의 값들을 2로 나누어 떨어지는 부분과 나머지 부분을 별도로 계산하여 조건을 만족하는지 판별한다.

4. 코드 설명

(1) 메인 함수 (main)

  • 입력 처리
    • 입력을 읽고 배열을 초기화하며, 각 높이 값을 배열에 저장한다.
  • BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력을 받기 위한 BufferedReader 객체 생성 N = Integer.parseInt(br.readLine()); // 배열의 크기 입력 height = new int[N]; // 높이 배열 초기화 StringTokenizer st = new StringTokenizer(br.readLine()); // 높이 값을 공백으로 구분하여 입력 받기 for(int i = 0; i < N; i++) { height[i] = Integer.parseInt(st.nextToken()); // 높이 배열에 값 저장 }
  • 총합 및 나머지 판별
    • 배열의 총합을 구한 후, 나머지 연산과 몫을 통해 조건을 검사하고 결과를 출력한다.
  • total = Arrays.stream(height).sum(); // 배열의 총합 계산 if(total % 3 != 0) { // 총합이 3의 배수가 아니면 System.out.println("NO"); // NO 출력 } else { int cnt1 = 0; // / 2 int cnt2 = 0; // % 2 for(int i = 0; i < N; i++) { cnt1 += height[i] / 2; // 각 높이의 2로 나눈 몫을 더함 cnt2 += height[i] % 2; // 각 높이의 2로 나눈 나머지를 더함 } if((cnt1 - cnt2) % 3 == 0 && cnt1 >= cnt2) // 조건을 만족하는지 확인 System.out.println("YES"); // YES 출력 else System.out.println("NO"); // NO 출력 }

5. 전체 코드

import java.io.*;
import java.util.*;

public class Main {
    static int[] height;
    static int total = 0;
    static int N;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력을 받기 위한 BufferedReader 객체 생성
        N = Integer.parseInt(br.readLine()); // 배열의 크기 입력
        height = new int[N]; // 높이 배열 초기화

        StringTokenizer st = new StringTokenizer(br.readLine()); // 높이 값을 공백으로 구분하여 입력 받기
        for(int i = 0; i < N; i++) {
            height[i] = Integer.parseInt(st.nextToken()); // 높이 배열에 값 저장
        }

        total = Arrays.stream(height).sum(); // 배열의 총합 계산
        if(total % 3 != 0) { // 총합이 3의 배수가 아니면
            System.out.println("NO"); // NO 출력
        }
        else {
            int cnt1 = 0; // / 2
            int cnt2 = 0; // % 2

            for(int i = 0; i < N; i++) {
                cnt1 += height[i] / 2; // 각 높이의 2로 나눈 몫을 더함
                cnt2 += height[i] % 2; // 각 높이의 2로 나눈 나머지를 더함
            }

            if((cnt1 - cnt2) % 3 == 0 && cnt1 >= cnt2) // 조건을 만족하는지 확인
                System.out.println("YES"); // YES 출력
            else
                System.out.println("NO"); // NO 출력
        }
    }
}
반응형

'CODING > BOJ' 카테고리의 다른 글

[BOJ/Java] 모든 순열 (10974)  (0) 2024.09.02
[BOJ/Java] 영역 구하기 (2583)  (0) 2024.09.01
[BOJ/Java] Puyo Puyo (11559)  (0) 2024.08.30
[BOJ/Java] 그림 (1926)  (0) 2024.08.30
[BOJ/Java] 봄버맨 (16918)  (0) 2024.08.30
Comments