Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions BOJ/1000-5000번/SB_2110.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
62 changes: 62 additions & 0 deletions BOJ/1000-5000번/SB_2805.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
50 changes: 50 additions & 0 deletions BOJ/5001-10000번/SB_7579.java
Original file line number Diff line number Diff line change
@@ -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 <N; i++) { // 앱 번호
for (int j = 10000; j >=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);
}
}
38 changes: 38 additions & 0 deletions BOJ/5001-10000번/SB_9084.java
Original file line number Diff line number Diff line change
@@ -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++) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 i 시작을 0으로 설정해줘서, 범위에 벗어나면 continue를 해주었는데
i 시작을 처음부터 c로 시작해주면 되군요!!

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);
}
}
Original file line number Diff line number Diff line change
@@ -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<N && 0<=y && y<M;
}
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());

board = new int[N][M];
visited = new boolean[N][M];
for(int i=0; i<N; i++){
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}

for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
visited[i][j] = true;
dfs(i, j, 1, board[i][j]);
visited[i][j] = false;
}
}
System.out.println(mx);
}
}
42 changes: 42 additions & 0 deletions Programmers/Level3/SB_42861.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import java.util.Arrays;

class Solution {
static int[] parents;

private static int find(int x) {
if (parents[x] != x) {
return find(parents[x]);
}
return parents[x];
}

private static void union(int a, int b) {
if (a > 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];
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

따로 Queue를 사용하지 않고 배열을 정렬해서 풀이하신 것 좋습니다,,,,👍

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

히히 감사합니돠아😊


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;
}
}
31 changes: 31 additions & 0 deletions Programmers/Level3/SB_43238.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
14 changes: 14 additions & 0 deletions SQL/06주차/SB_Count Salary Categories.sql
Original file line number Diff line number Diff line change
@@ -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
7 changes: 7 additions & 0 deletions SQL/06주차/SB_Managers with at Least 5 Direct Reports.sql
Original file line number Diff line number Diff line change
@@ -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;