본문 바로가기
알고리즘/이분탐색

[백준][JAVA] 3020번 개똥벌레

by 박뀨뀨 2024. 2. 19.

 

 

3020번: 개똥벌레

개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이

www.acmicpc.net

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(st.nextToken()); // 동굴의 길이
		int H = Integer.parseInt(st.nextToken()); // 동굴의 높이
		
		long[] stalagmite = new long[H + 1]; // 석순 
		long[] stalactite = new long[H + 1]; // 종유석
		long[] sum = new long[H + 1]; // 누적합 배열

		for (int i = 1; i <= N; i++) {
			int h = Integer.parseInt(br.readLine()); // 장애물 높이
			if (i % 2 == 1) {
				stalagmite[h]++; // 석순
			} else {
				stalactite[h]++; // 종유석
			}
		}
		
		// 누적합 계산 1
		for (int i = H - 1; i >= 1; i--) {
			stalagmite[i] += stalagmite[i + 1];
			stalactite[i] += stalactite[i + 1];
		}
		
		// 누적합 계산 2
		sum[1] = stalagmite[1];
		sum[H] = stalactite[1];
		
		for (int i = 2; i <= H - 1; i++) {
			sum[i] = stalagmite[i] + stalactite[H - i + 1];
		}
		
		// 정렬
		Arrays.sort(sum);
		
		// 이분 탐색
		long min = sum[1];
		int left = 1, right = H;
		while (left <= right) {
			int mid = (left + right) / 2;
			
			if (sum[mid] <= min) {
				left = mid + 1;
			} else {
				right = mid - 1;
			}
		}
		
		System.out.println(sum[1] + " " + right);
	}

}
728x90

'알고리즘 > 이분탐색' 카테고리의 다른 글

[백준][JAVA] 6236번 용돈 관리  (0) 2024.02.23
[백준][JAVA] 2343번 기타 레슨  (0) 2024.02.16
[백준][JAVA] 2467번 용액  (1) 2023.12.18
[백준][JAVA] 2776번 암기왕  (1) 2023.12.17