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