[BOJ] 2805: 나무 자르기 (JAVA)

2024. 6. 21. 11:02·코테/Algorithm
728x90

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

 

풀이

 

이분탐색을 잘 못하는 것 같아서 시도해본 문제.

슬라이딩 윈도우처럼 left++ right--로 풀었더니 바로 시간초과가 발생했다ㅎㅎ

 

나무를 자르기 위해, 높이를 설정해줘야 하는데 초기 mid값은 가장 높은 나무의 절반으로 설정해준다.

그리고 중간값 mid로 자른 나무가 내가 잘라야하는 나무보다 적을 경우

mid값을 낮춰줘야 하는데, 낮출 때는 right 값을 mid -1로 설정해주면

나머지 오른쪽 절반은 볼 필요가 없어진다.

 

 

전체코드
package CodingTest;

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

public class 실버2_2805_나무자르기 {
	static int N, M, left, right;
	static int arr[];
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		
		left = 0; right = -1;
		arr = new int[N];
		st = new StringTokenizer(br.readLine());
		for(int i=0; i<N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
			//현재 가지고 있는 나무의 최대 높이
			right = Math.max(right, arr[i]);
		}
		
		Check();
		
		sb.append(right);
		bw.write(sb.toString());
		bw.close();
	}
	public static void Check() {
		while(left <= right) {
			//내가 가져갈 수 있는 상한선 높이
			int mid = (left+right)/2;
			//내가 총 가져갈 수 있는 나무의 길이
			long tree = 0;
			
			for(int i=0; i<N; i++) {
				if(arr[i] > mid) {
					tree += (arr[i]-mid);
				}else {
					continue;
				}
			}
			
			//아직 부족하면, 높이를 더 낮춰야 함.
			if(tree < M) {
				right = mid -1;
			//이미 충분하면, 높이를 더 높여야 함.
			}else if(tree >= M) {
				left = mid +1 ;
			}
			
			System.out.println(left+" "+right);
		}
	}
}
728x90

'코테 > Algorithm' 카테고리의 다른 글

[Programmers] 괄호 회전하기 (JAVA)  (0) 2024.06.21
[BOJ] 2512: 예산 (JAVA)  (0) 2024.06.21
[BOJ] 6593: 상범 빌딩 (JAVA)  (1) 2024.06.20
[BOJ] 2668: 숫자 고르기 (JAVA)  (0) 2024.06.20
[Programmers] 최솟값 만들기 (JAVA)  (0) 2024.06.19
'코테/Algorithm' 카테고리의 다른 글
  • [Programmers] 괄호 회전하기 (JAVA)
  • [BOJ] 2512: 예산 (JAVA)
  • [BOJ] 6593: 상범 빌딩 (JAVA)
  • [BOJ] 2668: 숫자 고르기 (JAVA)
DROPDEW
DROPDEW
💻 Developer | 기록하지 않으면 존재하지 않는다
  • DROPDEW
    제 2장 1막
    DROPDEW
  • 전체
    오늘
    어제
    • Dev (418) N
      • App·Android (1)
      • BE (44)
        • HTTP 웹 기본 지식 (8)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (12)
        • 스프링부트와 JPA 활용 (11)
        • 스프링부트 시큐리티 & JWT (0)
        • PHP (6)
      • FE·Client (23)
        • HTML (1)
        • React (19)
        • Unity (1)
      • Data (17)
        • AI (7)
        • Bigdata (6)
        • Database (1)
        • 빅데이터분석기사 (2)
      • Infra (0)
      • Activity (1) N
        • Education (0)
        • Intern (0)
        • 리모트 인턴십 6기 (1) N
        • 구름톤 유니브 4기 (0)
        • SW교육기부단 15기 (0)
      • CS (8)
      • 취준 (13)
        • 자격증 (4)
        • 인적성·NCS (6)
        • 코테·필기·면접 후기 (3)
      • 코테 (270)
        • Algorithm (222)
        • SQL (35)
        • 정리 (13)
      • 인사이트 (27)
        • 회고 (0)
        • 금융경제뉴스 (7)
        • 금융용어·지식 (2)
        • 북마크 (7)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    수학
    이분탐색
    너비우선탐색
    티스토리챌린지
    브루트포스 알고리즘
    백준
    구현
    다이나믹프로그래밍
    그래프탐색
    최단경로
    누적합
    문자열
    그래프이론
    자료구조
    시뮬레이션
    오블완
    그리디알고리즘
    투포인터
    매개변수탐색
    정렬
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
DROPDEW
[BOJ] 2805: 나무 자르기 (JAVA)
상단으로

티스토리툴바