diff --git a/chohanvien/1806.java b/chohanvien/1806.java new file mode 100644 index 0000000..1a5f721 --- /dev/null +++ b/chohanvien/1806.java @@ -0,0 +1,41 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class j_1806 { + 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()); // N짜리 수열 + int S = Integer.parseInt(st.nextToken()); // 합 S 이상 + int[] arr = new int[N]; //배열 arr + + //반복문 통해서 arr값에 값 저장 + st = new StringTokenizer(br.readLine(), " "); + for (int i = 0; i < N; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + int min = Integer.MAX_VALUE; // 최소 길이 min + int start = 0; // 시작 + int end = 0; // 끝 + int total = 0; // 현재 부분 합 + // 반복문으로 투 포인터를 이용한 부분 합 계산 + while(start <= N && end < N) { + if(total >= S && min > end - start) min = end - start; + + if(total < S) total += arr[end++]; + else total -= arr[start++]; + } + + // 최소 길이가 갱신되지 않았으면 0을 출력 + if(min == Integer.MAX_VALUE){ + System.out.println("0"); + //그렇지 않으면 최소 길이를 출력 + }else{ + System.out.println(min); + } + } +} diff --git a/chohanvien/2531.java b/chohanvien/2531.java new file mode 100644 index 0000000..aef04a9 --- /dev/null +++ b/chohanvien/2531.java @@ -0,0 +1,56 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class j_2531 { + private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//입력 + private static int N, D, k, C; + private static int[] arr; + private static int[] eat; + + public static void main(String[] args) throws IOException { + StringTokenizer st = new StringTokenizer(br.readLine()); + N = Integer.parseInt(st.nextToken()); // 접시의 수 N + D = Integer.parseInt(st.nextToken()); // 초밥의 가짓수 D + k = Integer.parseInt(st.nextToken()); // 연속해서 먹는 접시의 수 K + C = Integer.parseInt(st.nextToken()); //쿠폰 번호 C + + eat = new int[D+1]; // 초밥 종류를 카운트 eat + arr = new int[N]; // 접시 arr + for (int i = 0; i < N; i++) { + arr[i] = Integer.parseInt(br.readLine()); // 각 접시에 놓인 초밥 번호 + } + System.out.println( twoPointers() ); + br.close(); + } + + private static int twoPointers() { + int count = 0, max; + + //반복문으로 초기 k개의 초밥을 선택해 카운트 + for (int i = 0; i < k; i++) { + if (eat[ arr[i] ] == 0) count++; // 처음 먹는 종류의 초밥 종류라면 카운트 + 1 + eat[ arr[i] ]++; //초밥 개수 증가 + } + max = count; // 현재까지 먹은 최대 종류의 초밥 개수 + + //반복문으로 최대 초밥 종류를 계산 + for (int i = 1; i < N; i++) { + if (max <= count) { + if (eat[C] == 0) max = count + 1; + else max = count; + } + + // 왼쪽 끝 초밥 제거 + eat[arr[i-1]]--; + if (eat[arr[i-1]] == 0) count--; + + //오른쪽 끝에 새로운 초밥 추가 + if (eat[arr[(i+k-1) % N]] == 0) count++; + eat[arr[(i+k-1) % N]]++; + } + + return max;// 계산된 최대 초밥 종류 반환 + } +}