All :L
[BOJ/Java] 사과나무 (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