Notice
Recent Posts
Link
반응형
All :L
[SWEA/Java] 나무 높이 (14510) 본문
반응형
1. 문제 분석
문제 개요
- 나무의 높이를 조정하여 모든 나무를 최대 높이로 맞추기 위해 필요한 최소 일수를 계산하는 문제이다.
입력 형식
- 첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
- 다음 T개의 줄 각각에는 나무의 개수 N과 N개의 나무 높이가 주어진다.
출력 형식
- 각 테스트 케이스에 대해, 모든 나무를 최대 높이로 맞추기 위해 필요한 최소 일수를 출력한다.
2. 알고리즘 종류
이 문제는 수학적 계산과 구간 탐색을 사용하여 해결하는 문제이다. 나무의 높이 차이에 따라 필요한 일수를 계산하고, 가장 많은 일수를 필요한 나무를 기준으로 최소 일수를 구한다.
3. 주요 부분 및 코드 작성 방법
1. 나무의 높이와 최대 높이 계산
- 나무의 높이를 입력받고 최대 높이를 계산한다.
2. 각 나무를 최대 높이로 맞추기 위한 최소 일수 계산
- 각 나무의 높이와 최대 높이의 차이를 계산하여, 필요한 일수를 구한다.
3. 결과 출력
- 계산된 최대 일수를 출력하여 결과를 제공한다.
4. 코드 설명
(1) 메인 함수 (main
)
입력 처리
Scanner sc = new Scanner(System.in); // Scanner 객체 생성 int T = sc.nextInt(); // 테스트 케이스 수 입력 Scanner
객체를 생성하여 입력을 처리한다.- 테스트 케이스 수 T를 입력받는다.
나무의 높이와 최대 높이 계산
for (int tc = 1; tc <= T; tc++) { // 각 테스트 케이스 처리 int N = sc.nextInt(); // 나무의 개수 입력 int[] heights = new int[N]; // 나무의 높이를 저장할 배열 생성 int maxHeight = 0; // 최대 높이 초기화 for (int i = 0; i < N; i++) { heights[i] = sc.nextInt(); // 나무의 높이 입력 if (heights[i] > maxHeight) { maxHeight = heights[i]; // 최대 높이 갱신 } } - 각 테스트 케이스마다 나무의 개수와 높이를 입력받아 최대 높이를 계산한다.
모든 나무를 최대 높이로 맞추기 위한 최소 일수 계산
int maxDays = 0; // 필요한 최대 일수 초기화 for (int i = 0; i < N; i++) { int delta = maxHeight - heights[i]; // 현재 나무의 높이와 최대 높이의 차이 계산 int days = 0; // 일수 초기화 if (delta % 3 == 0) { days = (delta / 3) * 2; // delta를 3으로 나눈 몫에 2를 곱하여 일수 계산 } else if (delta % 3 == 1) { days = (delta / 3) * 2 + 1; // delta를 3으로 나눈 몫에 2를 곱하고 나머지 1일 때 추가 1 더함 } else { days = (delta / 3) * 2 + 2; // delta를 3으로 나눈 몫에 2를 곱하고 나머지 2일 때 추가 2 더함 } if (days > maxDays) { maxDays = days; // 최대 일수 갱신 } } - 나무를 최대 높이로 맞추기 위해 필요한 일수를 계산하고, 최대 일수를 업데이트한다.
결과 출력
System.out.println("#" + tc + " " + maxDays); // 결과 출력 } sc.close(); // Scanner 객체 닫기 - 각 테스트 케이스의 결과를 출력하고,
Scanner
객체를 닫아 자원을 해제한다.
- 각 테스트 케이스의 결과를 출력하고,
5. 전체 코드
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // Scanner 객체 생성 int T = sc.nextInt(); // 테스트 케이스 수 입력 for (int tc = 1; tc <= T; tc++) { // 각 테스트 케이스 처리 int N = sc.nextInt(); // 나무의 개수 입력 int[] heights = new int[N]; // 나무의 높이를 저장할 배열 생성 int maxHeight = 0; // 최대 높이 초기화 // 나무의 높이와 최대 높이 계산 for (int i = 0; i < N; i++) { heights[i] = sc.nextInt(); // 나무의 높이 입력 if (heights[i] > maxHeight) { maxHeight = heights[i]; // 최대 높이 갱신 } } // 모든 나무를 최대 높이로 맞추기 위한 최소 일수 계산 int maxDays = 0; // 필요한 최대 일수 초기화 for (int i = 0; i < N; i++) { int delta = maxHeight - heights[i]; // 현재 나무의 높이와 최대 높이의 차이 계산 int days = 0; // 일수 초기화 // delta를 3으로 나눈 몫과 나머지를 통해 필요한 일수를 계산 if (delta % 3 == 0) { days = (delta / 3) * 2; // delta를 3으로 나눈 몫에 2를 곱하여 일수 계산 } else if (delta % 3 == 1) { days = (delta / 3) * 2 + 1; // delta를 3으로 나눈 몫에 2를 곱하고 나머지 1일 때 추가 1 더함 } else { days = (delta / 3) * 2 + 2; // delta를 3으로 나눈 몫에 2를 곱하고 나머지 2일 때 추가 2 더함 } // 최대 일수 업데이트 if (days > maxDays) { maxDays = days; // 최대 일수 갱신 } } // 결과 출력 System.out.println("#" + tc + " " + maxDays); // 결과 출력 } sc.close(); // Scanner 객체 닫기 } }
반응형
'CODING > SWEA' 카테고리의 다른 글
[SWEA/Java] 디저트 카페 (2105) (0) | 2024.09.11 |
---|---|
[SWEA/Java] 프로세서 연결하기 (1767) (0) | 2024.08.25 |
[SWEA/Java] 정사각형 방(1861) (0) | 2024.08.22 |
[SWEA/Java] 추억의 2048 게임(6190) (0) | 2024.08.22 |
Comments