diff --git "a/src/\352\271\200\353\217\204\355\230\204/week38(220628)/BJ11054.java" "b/src/\352\271\200\353\217\204\355\230\204/week38(220628)/BJ11054.java" new file mode 100644 index 0000000..a152631 --- /dev/null +++ "b/src/\352\271\200\353\217\204\355\230\204/week38(220628)/BJ11054.java" @@ -0,0 +1,34 @@ +package bj; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class BJ11054 { + /* 11054. 가장 긴 바이토닉 부분 수열 + DP + */ + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + 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[] forward = new int[N]; + int[] reverse = new int[N]; + Arrays.fill(forward, 1); + Arrays.fill(reverse, 1); + + for (int i = 1; i < N; i++) { + for (int j = 0; j < i; j++) { + if (arr[i] > arr[j] && forward[j] + 1 > forward[i]) forward[i] = forward[j] + 1; + if (arr[N-1-i] > arr[N-1-j] && reverse[N-1-j] + 1 > reverse[N-1-i]) reverse[N-1-i] = reverse[N-1-j] + 1; + } + } + int result = 0; + for (int i = 0; i < N; i++) result = Math.max(result, forward[i] + reverse[i] - 1); + System.out.println(result); + } +} diff --git "a/src/\352\271\200\353\217\204\355\230\204/week38(220628)/BJ7453.java" "b/src/\352\271\200\353\217\204\355\230\204/week38(220628)/BJ7453.java" new file mode 100644 index 0000000..2048e3b --- /dev/null +++ "b/src/\352\271\200\353\217\204\355\230\204/week38(220628)/BJ7453.java" @@ -0,0 +1,70 @@ +package bj; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class BJ7453 { + /* 7453. 합이 0인 네 정수 + 정렬 + */ + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + int N = Integer.parseInt(br.readLine()); + int[] A = new int[N]; + int[] B = new int[N]; + int[] C = new int[N]; + int[] D = new int[N]; + for (int i = 0; i < N; i++) { + st = new StringTokenizer(br.readLine()); + A[i] = Integer.parseInt(st.nextToken()); + B[i] = Integer.parseInt(st.nextToken()); + C[i] = Integer.parseInt(st.nextToken()); + D[i] = Integer.parseInt(st.nextToken()); + } + + int[] AB = new int[N*N]; + int[] CD = new int[N*N]; + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + AB[N*i+j] = A[i] + B[j]; + CD[N*i+j] = -(C[i] + D[j]); + } + } + Arrays.sort(AB); + Arrays.sort(CD); + + long result = 0; + int i = 0; + int j = 0; + long lCnt = 0; + long rCnt = 0; + while (i < N*N-1 || j < N*N-1){ + if (AB[i] == CD[j]) { + lCnt = 1; + rCnt = 1; + while (i+1 < N*N && AB[i+1] == AB[i]) { + lCnt++; + i++; + } + while (j+1 < N*N && CD[j+1] == CD[j]) { + rCnt++; + j++; + } + result += (lCnt * rCnt); + if (i+1 < N*N) i++; + if (j+1 < N*N) j++; + continue; + } + + if (i == N*N-1) j++; + else if (j == N*N-1) i++; + else if (AB[i] > CD[j]) j++; + else if (AB[i] < CD[j]) i++; + } + System.out.println(result); + } +}