From 25aa806dd159bfc8fadcc463b8e0167400e115b4 Mon Sep 17 00:00:00 2001 From: Ukj0ng <90972240+Ukj0ng@users.noreply.github.com> Date: Mon, 15 Dec 2025 11:22:29 +0900 Subject: [PATCH] =?UTF-8?q?[20251215]=20BOJ=20/=20G3=20/=20=EB=B2=8C?= =?UTF-8?q?=EB=A0=88=EC=BB=B7=20/=20=ED=95=9C=EC=A2=85=EC=9A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3 \353\262\214\353\240\210\354\273\267.md" | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 "Ukj0ng/202512/15 BOJ G3 \353\262\214\353\240\210\354\273\267.md" diff --git "a/Ukj0ng/202512/15 BOJ G3 \353\262\214\353\240\210\354\273\267.md" "b/Ukj0ng/202512/15 BOJ G3 \353\262\214\353\240\210\354\273\267.md" new file mode 100644 index 00000000..05b7fcbe --- /dev/null +++ "b/Ukj0ng/202512/15 BOJ G3 \353\262\214\353\240\210\354\273\267.md" @@ -0,0 +1,79 @@ +``` +import java.io.*; +import java.util.*; + +public class Main { + private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + private static int[] arr; + private static long[] sum; + private static int N; + private static long answer; + + public static void main(String[] args) throws IOException { + init(); + for (int i = 0; i < N-1; i++) { + int max = upperBound(i); + int min = lowerBound(i); + + if (max != -1 && min != -1 && min <= max) { + answer += (max-min+1); + } + } + + bw.write(answer + "\n"); + bw.flush(); + bw.close(); + br.close(); + } + + private static void init() throws IOException { + N = Integer.parseInt(br.readLine()); + arr = new int[N]; + sum = new long[N]; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + if (i == 0) sum[i] = arr[i]; + else sum[i] = sum[i-1]+arr[i]; + } + } + + private static int upperBound(int head) { + int left = head+1; + int right = N-2; + int result = -1; + + while (left <= right) { + int mid = left + (right-left)/2; + + if (sum[head] < (sum[N-1]-sum[mid])) { + result = mid; + left = mid+1; + } else { + right = mid-1; + } + } + return result; + } + + private static int lowerBound(int head) { + int left = head+1; + int right = N-2; + int result = -1; + + while (left <= right) { + int mid = left + (right-left)/2; + + if ((sum[N-1]-sum[mid]) < (sum[mid]-sum[head])) { + result = mid; + right = mid-1; + } else { + left = mid+1; + } + } + return result; + } +} +```