From c31a7708b3e42c7ac8b77f548787e14c9def3214 Mon Sep 17 00:00:00 2001 From: yoondahn Date: Sat, 10 Aug 2024 12:12:30 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[1806=20-=20solve]=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yoondahn/1806.java | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 yoondahn/1806.java diff --git a/yoondahn/1806.java b/yoondahn/1806.java new file mode 100644 index 0000000..f53affb --- /dev/null +++ b/yoondahn/1806.java @@ -0,0 +1,40 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +// 1806 - 부분합 +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 s = Integer.parseInt(st.nextToken()); + int[] arr = new int[n]; + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + // 투 포인터 + int min = n + 1; + int right = 0; + int currSum = arr[0]; + for (int i = 0; i < n; i++) { + // 현재 탐색하는 구간합이 s보다 크거나 같을 때까지 j 이동 + while (currSum < s && right < n - 1) { + currSum += arr[++right]; + } + + // 합이 s 이상이면 경우의 수 증가 + if (currSum >= s) { + int length = right - i + 1; + if (length < min ) min = length; + } + // 현재 구간합이 s보다 크므로 i 이동 + currSum -= arr[i]; + } + System.out.println(min == n + 1 ? "0" : min); + } +} From e55930d74464953b1652ff87a686172a12f4b1ae Mon Sep 17 00:00:00 2001 From: yoondahn Date: Sat, 17 Aug 2024 14:33:05 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[2531=20-=20fail]=20=ED=9A=8C=EC=A0=84=20?= =?UTF-8?q?=EC=B4=88=EB=B0=A5]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yoondahn/2531.java | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 yoondahn/2531.java diff --git a/yoondahn/2531.java b/yoondahn/2531.java new file mode 100644 index 0000000..880e4a1 --- /dev/null +++ b/yoondahn/2531.java @@ -0,0 +1,61 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +// 2531 - 회전 초밥 +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 d = Integer.parseInt(st.nextToken()); // 초밥의 가짓수 + int k = Integer.parseInt(st.nextToken()); // 연속해서 먹는 접시의 수 + int c = Integer.parseInt(st.nextToken()); // 쿠폰 번호 + + // 주어진 회전 초밥 벨트 + int[] sushi = new int[n]; + for (int i = 0; i < n; i++) { + sushi[i] = Integer.parseInt(br.readLine()); + } + + int[] visit = new int[d+1]; // 각 초밥 종류의 개수 (1~d) + int distinct = 0; // 현재 윈도우에서의 초밥 종류의 수 + + // 초기 윈도우 설정 + for (int i = 0; i < k; i++) { + if (visit[sushi[i]] == 0) { + distinct++; + } + visit[sushi[i]]++; + } + + // 초기 윈도우에 쿠폰 초밥이 포함되어 있는지 확인 + int max = distinct; // 현재 최대로 먹을 수 있는 초밥 종류의 수 + if (visit[c] == 0) max++; + + // 슬라이딩 윈도우 + for (int i = 0; i < n; i++) { + // 맨 앞 초밥 제거 + int front = sushi[i]; + visit[front]--; // 초밥의 개수를 감소 + if (visit[front] == 0) { + distinct--; // 초밥 종류의 수를 감소 + } + + // 맨 뒤 초밥 추가 + int back = sushi[(i + k) % n]; + if (visit[back] == 0) { + distinct++; + } + visit[back]++; + + // 쿠폰 초밥이 포함되어 있는지 확인 + int total = distinct; + if (visit[c] == 0) total++; + + max = Math.max(max, total); + } + System.out.println(max); + } +}