diff --git a/2025-02-15/p_11053.java b/2025-02-15/p_11053.java new file mode 100644 index 0000000..b9f86b2 --- /dev/null +++ b/2025-02-15/p_11053.java @@ -0,0 +1,47 @@ +package study.d_250215; + +import java.util.*; +import java.io.*; + +/** + * + */ +public class p_11053 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + int n = Integer.parseInt(br.readLine()); + int arr[] = new int[n]; + StringTokenizer st = new StringTokenizer(br.readLine()); + + for (int i = 0; i < n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + int[] D = new int[n]; // arr의 i 번째 요소 보다 작으면서 D의 요소중 가장 큰 값의 다음 값을 저장 + + for (int i = 0; i < n; i++) { + D[i] = 0; + + int max = D[i]; + for (int j = 0; j < i; j++) { + if (arr[i] > arr[j] && max < D[j]) { // i 번째 요소보다 작으면서, D의 요소 중 가장 큰값 + max = D[j]; + } + } + + D[i] = max + 1; + } + + int length = 0; + for (int i = 0; i < n; i++) { + if (length < D[i]) length = D[i]; + } + + bw.write(length + ""); + + br.close(); + bw.close(); + } +} diff --git a/2025-02-15/p_14002.java b/2025-02-15/p_14002.java new file mode 100644 index 0000000..ed8c449 --- /dev/null +++ b/2025-02-15/p_14002.java @@ -0,0 +1,63 @@ +package study.d_250215; + +import java.util.*; +import java.io.*; + +public class p_14002 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + int n = Integer.parseInt(br.readLine()); + int[] arr = new int[n]; + StringTokenizer st = new StringTokenizer(br.readLine()); + + // 배열 초기화 + for (int i = 0; i < n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + int[] D = new int[n]; // D 배열 구하기 + + int max = 0; // 부분 수열 중 가장 큰 수열의 길이 + int maxIdx = 0; // 가장 큰 값의 인덱스 저장 + + for (int i = 0; i < n; i++) { + D[i] = 0; + int length = D[i]; + for (int j = 0; j < i; j++) { + if (arr[j] < arr[i] && length < D[j]) length = D[j]; + } + D[i] = length + 1; + + if (max < D[i]) { + max = D[i]; + maxIdx = i; + } + } + + + int idx = maxIdx; + ArrayList list = new ArrayList<>(); // 가장 긴 수열을 저장할 리스트 (역순으로 저장) + list.add(arr[idx]); + + while (D[idx] - 1 > 0) { + for (int i = 0; i < idx; i++) { + if (arr[i] < arr[idx] && D[i] == (D[idx] - 1)) { // arr의 idx 요소보다 작으면서, D의 idx 요소보다 1 작은 값 + list.add(arr[i]); + idx = i; + break; + } + } + } + + // 역순으로 출력 + bw.write(max + "\n"); + for (int i = list.size() - 1; i >= 0; i--) { + bw.write(list.get(i) + " "); + } + + br.close(); + bw.close(); + } +} diff --git a/2025-02-15/p_1912.java b/2025-02-15/p_1912.java new file mode 100644 index 0000000..8a35684 --- /dev/null +++ b/2025-02-15/p_1912.java @@ -0,0 +1,39 @@ +package study.d_250215; + +import java.util.*; +import java.io.*; + +/** + * 3중 + */ +public class p_1912 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + int n = Integer.parseInt(br.readLine()); + int arr[] = new int[n]; + StringTokenizer st = new StringTokenizer(br.readLine()); + + for (int i = 0; i < n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + int max = arr[0]; + for (int size = 1; size <= n; size++) { + for (int j = 0; j < n - size + 1; j++) { + int sum = 0; + for (int k = j; k < j + size; k++) { + sum += arr[k]; + } + if (sum >= max) max = sum; + } + } + + bw.write(max + ""); + br.close(); + bw.close(); + } + + +} diff --git a/2025-02-15/p_1912_2.java b/2025-02-15/p_1912_2.java new file mode 100644 index 0000000..556ebef --- /dev/null +++ b/2025-02-15/p_1912_2.java @@ -0,0 +1,47 @@ +package study.d_250215; + +import java.io.*; +import java.util.StringTokenizer; + +/** + * 2중 (누적합과 차를 이용한 방식) + */ +public class p_1912_2 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + int n = Integer.parseInt(br.readLine()); + int[] arr = new int[n]; + StringTokenizer st = new StringTokenizer(br.readLine()); + + for (int i = 0; i < n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + int[] sumArr = new int[n]; + + // 0 ~ i 누적합 구하기 + int max = arr[0]; + for (int i = 0; i < n; i++) { + int sum = 0; + for (int s = 0; s < i + 1; s++) { + sum += arr[s]; + } + sumArr[i] = sum; + if(max < sum) max = sum; + } + // i번째 누적합에서 각각 0 ~ j 만큼의 차 구하기 + for(int i = 0; i < n; i++){ + for(int j = 0; j < i; j++){ + int diff = sumArr[i] - sumArr[j]; + if(max < diff) max = diff; + } + } + + bw.write(max+""); + + br.close(); + bw.close(); + } +} diff --git a/2025-02-15/p_1912_3.java b/2025-02-15/p_1912_3.java new file mode 100644 index 0000000..87f04aa --- /dev/null +++ b/2025-02-15/p_1912_3.java @@ -0,0 +1,48 @@ +package study.d_250215; + +import java.util.*; +import java.io.*; + +/** + * 1중 (다이내믹 방식) + */ +public class p_1912_3 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + int n = Integer.parseInt(br.readLine()); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int[] arr = new int[n]; + // 배열 초기화 + for (int i = 0; i < n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + int[] D = new int[n]; // 이전 요소를 더할 것인지, 아니면 홀로 설 것인지 결정하여 저장 + + for (int i = 0; i < n; i++) { + if (i == 0) D[i] = arr[i]; // D[0] 초기화 + + if (i >= 1) { + if (arr[i] > (D[i - 1] + arr[i])) { // 홀로 서는 것이 클 경우 더하지 않음 + D[i] = arr[i]; + } else { // 합치는 게 클 경우 더함 + D[i] = D[i - 1] + arr[i]; + } + } + } + + // 최댓값 찾기 + int max = D[0]; + for (int i = 0; i < n; i++) { + if (max < D[i]) max = D[i]; + } + + bw.write(max + ""); + + br.close(); + bw.close(); + } +}