diff --git "a/BOJ/1000-5000\353\262\210/SB_2110.java" "b/BOJ/1000-5000\353\262\210/SB_2110.java" new file mode 100644 index 00000000..307d6d9b --- /dev/null +++ "b/BOJ/1000-5000\353\262\210/SB_2110.java" @@ -0,0 +1,49 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class SB_2110 { + static int N, C; + static int[] house; + + private static boolean canWifi(int dist) { + int cnt = 1; + int pre = house[0]; + for (int i = 1; i < N; i++) { + if (house[i]-pre >= dist){ + cnt++; + pre = house[i]; + } + if (cnt >=C) return true; + } + return false; + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + C = Integer.parseInt(st.nextToken()); + + house = new int[N]; + for (int i = 0; i < N; i++) { + house[i] = Integer.parseInt(br.readLine()); + } + Arrays.sort(house); + + // 거리: mid, 공유기 개수: C (조건) + int s = 1; + int e = house[N-1] - house[0]; + int parm = 0; + while (s <= e) { + int mid = (s + e) / 2; + if (canWifi(mid)) { // 공유기 가능하면 거리 더 늘려보기 + parm = mid; + s = mid+1; + }else e = mid-1; + } + System.out.println(parm); + } +} diff --git "a/BOJ/1000-5000\353\262\210/SB_2805.java" "b/BOJ/1000-5000\353\262\210/SB_2805.java" new file mode 100644 index 00000000..8c43fea4 --- /dev/null +++ "b/BOJ/1000-5000\353\262\210/SB_2805.java" @@ -0,0 +1,62 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class SB_2805 { + static int N, M; + static int[] trees; + + // 파라미터 서치: 잘린 길이가 M보다 크거나 같은가 + // 높이 최대값: mid변수 + private static boolean canGet(int idx, int h) { + long cnt = 0; + for (int i = idx; i < N; i++) { + cnt += trees[i]-h; + if (cnt>=M) return true; + } + return cnt>=M; + } + + private static int findIdx(int h) { // 얘도 upper-bound로 인덱스 위치 찾기 + int left = 0; + int right = N; // upper-bound시 탐색범위는 [0,N) + while (left < right){ + int mid = (left+right)/2; + if (trees[mid] <= h) left = mid+1; + else right = mid; + } + return left; + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + trees = new int[N]; + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + trees[i] = Integer.parseInt(st.nextToken()); + } + + Arrays.sort(trees); + + int left = 0; // 절단기 높이값이 작을 수록 많이 자름 + int right = trees[N-1]; + int parm = 0; + + while (left <= right){ // 절단기 높이의 최대값이므로 upper-bound + int height = (left+right)/2; + int idx = findIdx(height); + if (canGet(idx, height)) { + parm = height; + left = height+1; // 나무 얻을 수 있으면 높이 조금 더 높여보기 + } + else right = height-1; + } + System.out.println(parm); + } +} diff --git "a/BOJ/5001-10000\353\262\210/SB_7579.java" "b/BOJ/5001-10000\353\262\210/SB_7579.java" new file mode 100644 index 00000000..984d526b --- /dev/null +++ "b/BOJ/5001-10000\353\262\210/SB_7579.java" @@ -0,0 +1,50 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class SB_7579 { + static int N, M; + static int[] memo, cost; + + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + memo = new int[N]; + cost = new int[N]; + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + memo[i] = Integer.parseInt(st.nextToken()); + } + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + cost[i] = Integer.parseInt(st.nextToken()); + } + + // 비활성화 비용 최소화로 M바이트 확보 + int[] dp = new int[10001]; + + // dp[i] = j : i비용으로 얻을 수 있는 최대 메모리 j + for (int i = 0; i =cost[i]; j--) { // 비용 + dp[j] = Math.max(dp[j], dp[j - cost[i]] + memo[i]); + } + } + + int ans = 0; + for (int i = 0; i <= 10000; i++) { + if (dp[i] >=M) { + ans = i; + break; + } + } + System.out.println(ans); + } +} diff --git "a/BOJ/5001-10000\353\262\210/SB_9084.java" "b/BOJ/5001-10000\353\262\210/SB_9084.java" new file mode 100644 index 00000000..c0eb821d --- /dev/null +++ "b/BOJ/5001-10000\353\262\210/SB_9084.java" @@ -0,0 +1,38 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class SB_9084 { + private static int calMethod(int N, int[] coin, int M) { + int[] dp = new int[M + 1]; + dp[0] = 1; + + for (int c : coin) { + for (int i = c; i <= M; i++) { + dp[i] += dp[i - c]; + } + } + return dp[M]; + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + StringBuilder sb = new StringBuilder(); + + int T = Integer.parseInt(br.readLine()); + + while (T-- > 0) { + int N = Integer.parseInt(br.readLine()); + int[] coin = new int[N]; + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + coin[i] = Integer.parseInt(st.nextToken()); + } + int M = Integer.parseInt(br.readLine()); + + sb.append(calMethod(N, coin, M)).append('\n'); + } + System.out.println(sb); + } +} diff --git "a/CodeTree/2017-2018\353\205\204/SB_\355\205\214\355\212\270\353\246\254\354\212\244_\353\270\224\353\237\255_\354\225\210\354\235\230_\355\225\251_\354\265\234\353\214\200\355\231\224_\355\225\230\352\270\260.java" "b/CodeTree/2017-2018\353\205\204/SB_\355\205\214\355\212\270\353\246\254\354\212\244_\353\270\224\353\237\255_\354\225\210\354\235\230_\355\225\251_\354\265\234\353\214\200\355\231\224_\355\225\230\352\270\260.java" new file mode 100644 index 00000000..54a05097 --- /dev/null +++ "b/CodeTree/2017-2018\353\205\204/SB_\355\205\214\355\212\270\353\246\254\354\212\244_\353\270\224\353\237\255_\354\225\210\354\235\230_\355\225\251_\354\265\234\353\214\200\355\231\224_\355\225\230\352\270\260.java" @@ -0,0 +1,62 @@ +import java.io.*; +import java.util.*; + +public class SB_테트리스_블럭_안의_합_최대화_하기 { + static int N,M; + static int[][] board; + static boolean[][] visited; + static int mx = 0; + static int[] dx = {-1, 1, 0, 0}; + static int[] dy = {0, 0, -1, 1}; + + private static void dfs(int x, int y, int depth, int total) { + // if (mx > mx*(4-depth)+total) return; + if(depth==4){ + mx = Math.max(mx, total); + return; + } + + for (int i = 0; i < 4; i++) { + int nx = x+dx[i]; + int ny = y+dy[i]; + if (!isValid(nx, ny) || visited[nx][ny]) continue; + if (depth == 2) { + visited[nx][ny] = true; + dfs(x, y, depth+1, total+board[nx][ny]); // ㅜ 가 갈라지는 중점에서 양옆 탐색 + visited[nx][ny] = false; + } + visited[nx][ny] = true; + dfs(nx, ny, depth+1, total+board[nx][ny]); + visited[nx][ny] = false; + } + } + + private static boolean isValid(int x, int y) { + return 0<=x && x b) parents[b] = a; + else parents[a] = b; + } + public static int solution(int n, int[][] costs) { + Arrays.sort(costs, (o1, o2)->{ + return o1[2]-o2[2]; + }); + + parents = new int[n]; + for (int i = 0; i < n; i++) { + parents[i] = i; + } + + int cnt = 1; + int ans = 0; + for (int[] cur : costs) { + if (cnt==n) break; + int p_a = find(cur[0]); + int p_b = find(cur[1]); + + if (p_a != p_b) { + union(p_a, p_b); + ans+=cur[2]; + cnt++; + } + } + return ans; + } +} \ No newline at end of file diff --git a/Programmers/Level3/SB_43238.java b/Programmers/Level3/SB_43238.java new file mode 100644 index 00000000..4ca59d6b --- /dev/null +++ b/Programmers/Level3/SB_43238.java @@ -0,0 +1,31 @@ +import java.util.*; + +class Solution { + private static boolean canCheck(long target, int[] times, int n) { + long cnt = 0; + for (int tm : times) { + cnt += target / tm; + if (cnt >= n) return true; + } + return false; + } + public static long solution(int n, int[] times) { + Arrays.sort(times); + + // 매개변수 탐색, 주어진 시간 내 n명 이상의 사람 처리할 수 있는지 + long left = 0; + long right = (long) times[times.length - 1] * n; // 최대 시간 + + long parm = 0; + while (left <= right) { + long mid = (left + right) / 2; + if (canCheck(mid, times, n)) { + parm = mid; + right = mid - 1; + } else { + left = mid + 1; + } + } + return parm; + } +} \ No newline at end of file diff --git "a/SQL/06\354\243\274\354\260\250/SB_Count Salary Categories.sql" "b/SQL/06\354\243\274\354\260\250/SB_Count Salary Categories.sql" new file mode 100644 index 00000000..99321721 --- /dev/null +++ "b/SQL/06\354\243\274\354\260\250/SB_Count Salary Categories.sql" @@ -0,0 +1,14 @@ +# 각 급여 범주에 대한 은행 계좌 수를 계산 +# 결과표에는 세 가지 범주가 모두 포함되어야 합니다. 카테고리에 계정이 없으면 0 반환 + +SELECT 'High Salary' AS category, + SUM(income > 50000) AS accounts_count +FROM Accounts +UNION +SELECT 'Average Salary' AS category, + SUM(income BETWEEN 20000 AND 50000) AS accounts_count +FROM Accounts +UNION +SELECT 'Low Salary' AS category, + SUM(income < 20000) AS accounts_count +FROM Accounts \ No newline at end of file diff --git "a/SQL/06\354\243\274\354\260\250/SB_Managers with at Least 5 Direct Reports.sql" "b/SQL/06\354\243\274\354\260\250/SB_Managers with at Least 5 Direct Reports.sql" new file mode 100644 index 00000000..bed98e77 --- /dev/null +++ "b/SQL/06\354\243\274\354\260\250/SB_Managers with at Least 5 Direct Reports.sql" @@ -0,0 +1,7 @@ +# 최소 5명의 직속 부하 직원이 있는 관리자를 찾기 + +SELECT e.name +FROM Employee e +JOIN Employee m ON e.id = m.managerId +GROUP BY m.managerId +HAVING COUNT(m.managerId) >=5; \ No newline at end of file