From d5f4823f0618eae50972c964c5f4391c7dc39be0 Mon Sep 17 00:00:00 2001 From: KodaHye Date: Mon, 17 Feb 2025 11:50:48 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[CT]=20?= =?UTF-8?q?=EA=B3=A0=EB=8C=80=20=EB=AC=B8=EB=AA=85=20=EC=9C=A0=EC=A0=81=20?= =?UTF-8?q?=ED=83=90=EC=82=AC=5F250214?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...354\240\201_\355\203\220\354\202\254.java" | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 "CodeTree/2023-2024\353\205\204/DH_\352\263\240\353\214\200_\353\254\270\353\252\205_\354\234\240\354\240\201_\355\203\220\354\202\254.java" diff --git "a/CodeTree/2023-2024\353\205\204/DH_\352\263\240\353\214\200_\353\254\270\353\252\205_\354\234\240\354\240\201_\355\203\220\354\202\254.java" "b/CodeTree/2023-2024\353\205\204/DH_\352\263\240\353\214\200_\353\254\270\353\252\205_\354\234\240\354\240\201_\355\203\220\354\202\254.java" new file mode 100644 index 00000000..111abb28 --- /dev/null +++ "b/CodeTree/2023-2024\353\205\204/DH_\352\263\240\353\214\200_\353\254\270\353\252\205_\354\234\240\354\240\201_\355\203\220\354\202\254.java" @@ -0,0 +1,235 @@ +import java.io.*; +import java.util.*; + +/* + * 고대 문명 유적 탐사 + * step1에서 r과 c의 좌표를 for(int r = 1; r < 3; r++) 이렇게 해서 틀렸음 + */ + +public class DH_고대_문명_유적_탐사 { + static final int SIZE = 5, ROTATE_SIZE = 3; + static int K, M; + static int[][] map; // 유적지 정보 + static int[] arr; // 조각 정보 + static int result, IDX; // result: 각 턴마다 획득한 유물 가치의 총 합, IDX: 조각 정보의 인덱스 + + public static void main(String[] args) throws Exception { + initInput(); + solution(); + } + + static void solution() { + + StringBuilder sb = new StringBuilder(); + + while(K-- > 0) { + + result = 0; + + // 탐사 진행 (1차 유물 획득을 최대로 할 수 있게) + int[][] currentMap = step1(); + + // 1차 유물 획득 이후 빈 공간 채워주기 + currentMap = fillMap(currentMap); + + // 회전을 안했다(획득한 가치가 0)면 탐사 종료 + if(result == 0) break; + + int value = 0; + + // 유물 연쇄 획득 + // 3개 이상 연결된거 찾아주고, 유적지 채워주기 + while((value = getValue(currentMap)) != 0) { + currentMap = fillMap(currentMap); + result += value; + } + + // 각 턴마다 currentMap이라는 배열을 사용하고 있으므로 최종적으로 map배열을 currentMap으로 바꿔줌 + map = currentMap; + + sb.append(result).append(" "); + } + System.out.println(sb); + } + + static int[][] fillMap(int[][] map) { + + for(int c = 0; c < SIZE; c++) { + for(int r = SIZE - 1; r >= 0; r--) { + if(map[r][c] != 0) continue; + + map[r][c] = arr[IDX]; + IDX = (IDX + 1) % M; + } + } + return map; + } + + static int[][] step1() { + // (1) 유물 1차 획득 가치를 최대화하고 + // (2) 회전 각도가 가장 작은 방법 + // (3) 열이 가장 작으면서, (4) 행이 가장 작도록 + int maxValue = Integer.MIN_VALUE; + + int[][] resultMap = new int[SIZE][SIZE]; + + for(int t = 0; t < 3; t++) { // (2) 회전한 각도가 가장 작은 + for(int c = 1; c < 4; c++) { // (3) 중심 좌표의 열이 가장 작은 + for(int r = 1; r < 4; r++) { // (4) 행이 가장 작은 + int[][] tmp = rotate(r, c, t); + + int value = getValue(tmp); + + if(maxValue < value) { // (1) 유물 1차 획득 가치를 최대화 + maxValue = value; + resultMap = tmp; + } + } + } + } + + result += maxValue; // 최대 유물 가치 더해주기 + + return resultMap; + } + + static void print(int[][] arr) { + System.out.println("map 출력 ----------"); + for(int r = 0; r < arr.length; r++) { + System.out.println(Arrays.toString(arr[r])); + } + } + + static int[][] rotate(int r, int c, int t) { + int[][] rotateMap = new int[SIZE][SIZE]; + + // 배열 복사 + for(int cr = 0; cr < SIZE; cr++) rotateMap[cr] = Arrays.copyOf(map[cr], SIZE); + + // 회전 기준점을 (1, 1)로 놓고 회전 진행 + for(int tr = -1; tr < 2; tr++) { + for(int tc = -1; tc < 2; tc++) { + int cr = r + tr, cc = c + tc; + + int tmp = map[cr][cc]; + + int sr = r - 1, sc = c - 1; + + int tmpR = r + tr - sr, tmpC = c + tc - sc; + int nr = 0, nc = 0; + + // (r, c)를 기준으로 90도 회전 + if(t == 0) { + nr = tmpC; + nc = (ROTATE_SIZE - 1) - tmpR; + } + + // (r, c)를 기준으로 180도 회전 + if(t == 1) { + nr = ROTATE_SIZE - 1 - tmpR; + nc = ROTATE_SIZE - 1 - tmpC; + } + + // (r, c)를 기준으로 270도 회전 + if(t == 2) { + nr = ROTATE_SIZE - 1 - tmpC; + nc = tmpR; + } + + rotateMap[nr + sr][nc + sc] = tmp; + } + } + + return rotateMap; + } + + static int[] dr = {-1, 1, 0, 0}, dc = {0, 0, -1, 1}; + + // bfs를 하면서 3개 이상 연속으로 있는 그룹 찾아주기 + static int getValue(int[][] tmp) { + + int value = 0; + boolean[][] v = new boolean[SIZE][SIZE]; + + for(int r = 0; r < SIZE; r++) { + for(int c = 0; c < SIZE; c++) { + if(v[r][c]) continue; + + Queue q = new ArrayDeque(); // bfs 탐색을 위한 큐 + Queue removeQ = new ArrayDeque(); // 그룹이 생성된 후, 없앨 위치를 저장하기 위한 큐 + + v[r][c] = true; + + int currentValue = 1; + int pos = r * SIZE + c; + + q.add(pos); + removeQ.add(pos); + + while(!q.isEmpty()) { + int currentPos = q.poll(); + int cr = currentPos / SIZE, cc = currentPos % SIZE; + + for(int d = 0; d < 4; d++) { + int nr = cr + dr[d]; + int nc = cc + dc[d]; + + if(!check(nr, nc) || v[nr][nc] || tmp[nr][nc] != tmp[r][c]) continue; + + int nextPos = nr * SIZE + nc; + q.add(nextPos); + removeQ.add(nextPos); + v[nr][nc] = true; + currentValue += 1; + } + } + + if(currentValue < 3) continue; + + value += currentValue; + + while(!removeQ.isEmpty()) { + int removePos = removeQ.poll(); + int rr = removePos / SIZE; + int rc = removePos % SIZE; + + tmp[rr][rc] = 0; + } + } + } + + return value; + } + + static boolean check(int r, int c) { + return r >= 0 && r < SIZE && c >= 0 && c < SIZE; + } + + static void initInput() throws Exception { + + System.setIn(new FileInputStream("./input/고대문명유적탐사.txt")); + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + K = Integer.parseInt(st.nextToken()); // 탐사 반복 횟수 + M = Integer.parseInt(st.nextToken()); // 유물 조각의 개수 + + arr = new int[M]; + + map = new int[SIZE][SIZE]; + + // 유적지 정보 + for(int r = 0; r < map.length; r++) { + st = new StringTokenizer(br.readLine()); + + for(int c = 0; c < map[0].length; c++) { + map[r][c] = Integer.parseInt(st.nextToken()); + } + } + + st = new StringTokenizer(br.readLine()); + + // 유적 벽면에 써 있는 숫자 + for(int i = 0; i < arr.length; i++) arr[i] = Integer.parseInt(st.nextToken()); + } +} From 5cb101c0f8f46f58a85c158b38a3ec042a0a1fab Mon Sep 17 00:00:00 2001 From: KodaHye Date: Tue, 18 Feb 2025 11:14:11 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[BOJ]=201923?= =?UTF-8?q?7=20=EC=96=B4=EB=A5=B8=20=EC=83=81=EC=96=B4=5F250218?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "BOJ/15001-20000\353\262\210/DH_19237.java" | 233 ++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 "BOJ/15001-20000\353\262\210/DH_19237.java" diff --git "a/BOJ/15001-20000\353\262\210/DH_19237.java" "b/BOJ/15001-20000\353\262\210/DH_19237.java" new file mode 100644 index 00000000..7e32be80 --- /dev/null +++ "b/BOJ/15001-20000\353\262\210/DH_19237.java" @@ -0,0 +1,233 @@ +import java.io.*; +import java.util.*; + +/* + * 어른 상어 + * 시간 범위 설정 잘 하기!! + */ + +public class DH_19237 { + static class Node { + int sharkIdx, time; + + public Node() {} + public Node(int sharkIdx, int time) { + this.sharkIdx = sharkIdx; + this.time = time; + } + + public void update(int sharkIdx, int time) { + this.sharkIdx = sharkIdx; + this.time = time; + } + } + static class Shark { + boolean isDie; + int pos, dir; + int[][] priority; + + public Shark() {} + + public Shark(int pos, int dir) { + this.pos = pos; + this.dir = dir; + } + + public void setPos(int pos) { + this.pos = pos; + } + + public void setDir(int dir) { + this.dir = dir; + } + + public void setPriority(int[][] priority) { + this.priority = priority; + } + } + static int N, M, k, liveSharkCnt; // liveSharkCnt: 살아있는 상어 수 + static int[][] idx; // 상어가 있는 위치를 idx로 저장 + static Node[][] smell; // 냄새에 대한 정보 (상어 idx, 냄새 유지 시간) + static Shark[] sharks; // 상어들에 대한 정보 + static int[] dr = {-1, 1, 0, 0}, dc = {0, 0, -1, 1}; // 상, 하, 좌, 우 + public static void main(String[] args) throws Exception { + initInput(); + solution(); + } + + static void solution() { + int time = 0; + boolean flag = false; + + // while(time < 1_001)으로 하면 1001초까지 보게 됨 !! =ㅅ=,,, + while(time < 1_000) { + + moveSharks(); + + decreaseSmell(); // 기존에 있던 냄새 1씩 줄이기 + updateSmell(); // 상어들이 움직인 자리에 상어 냄새 표시해주기 + + time++; + + if(liveSharkCnt == 1) { + flag = true; + break; + } + } + + System.out.println(flag ? time : -1); + } + + // 상어가 새로 그 자리에 갔을 때, 해당 좌표에서 냄새 업데이트해주기 + static void updateSmell() { + for(int idx = 1; idx < sharks.length; idx++) { + if(sharks[idx].isDie) continue; + + int pos = sharks[idx].pos; + int r = pos / N; + int c = pos % N; + + smell[r][c].update(idx, k); // (r, c) 지점에 idx 상어의 냄새가 k초 동안 지속됨 + } + } + + // 1초가 지날 때 마다 상어 냄새 유지도 줄여주기 + static void decreaseSmell() { + for(int r = 0; r < smell.length; r++) { + for(int c = 0; c < smell[0].length; c++) { + if(smell[r][c].time == 0) continue; + + smell[r][c].time--; + if(smell[r][c].time == 0) smell[r][c].sharkIdx = 0; + } + } + } + + // 상어들 움직여주기 + static void moveSharks() { + int[][] nextIdxMap = new int[N][N]; // 이동한 다음 상어들의 인덱스를 저장하는 배열 + + // idx가 큰 상어부터 이동해주기 + for(int idx = sharks.length - 1; idx > 0; idx--) { + if(sharks[idx].isDie) continue; // 겪자 밖으로 쫓겨난 상어는 움직이지 못함 + + Shark current = sharks[idx]; + + int moveDir = -1; // 상어가 움직일 방향 + int cr = current.pos / N, cc = current.pos % N; // 현재 상어의 위치 + + int mr = cr, mc = cc; // 이동할 상어의 위치 + + for(int d = 0; d < 4; d++) { + int dir = current.priority[current.dir][d]; // 상어 방향의 우선순위에 따라 4방으로 확인 + + int nr = cr + dr[dir]; + int nc = cc + dc[dir]; + + if(!check(nr, nc)) continue; // 범위를 벗어난다면 다른 방향 확인 + // 다른 상어의 냄새가 있다면 다른 방향으로 확인 + if(smell[nr][nc].sharkIdx != idx && smell[nr][nc].sharkIdx != 0) continue; + + // 이동할 위치를 정하지 못했는데, 그 다음 좌표에 자신의 냄새가 난다면 일단 이동할 위치로 정해주기 + if(moveDir == -1 && smell[nr][nc].sharkIdx == idx) { + moveDir = dir; + mr = nr; + mc = nc; + } + + // 냄새가 없는 칸이 나오면 바로 그 방향으로 이동하기 + if(smell[nr][nc].sharkIdx == 0) { + moveDir = dir; + mr = nr; + mc = nc; + break; + } + } + + // 상어가 향하고 있는 방향 수정 + current.dir = moveDir; + + // 혹시라도 상어가 움직이지 못하는 경우가 있을까봐 조건문으로 설정함 + // 상어가 이동할 방향이 있다면, 해당 방향으로 상어 움직여주기 + if(moveDir != -1) { + int nextPos = mr * N + mc; + current.pos = nextPos; + } + + // 이미 이동한 상어가 있는 경우 + // => idx가 작은 상어가 오게 되고, 기존에 있는 상어는 격자 밖으로 내쫓기게 됨 + if(nextIdxMap[mr][mc] != 0) { + int biggerIdx = nextIdxMap[mr][mc]; + + sharks[biggerIdx].isDie = true; + liveSharkCnt--; + } + + nextIdxMap[mr][mc] = idx; + } + + // idx배열 갱신하기 + idx = nextIdxMap; + } + + static boolean check(int r, int c) { + return r >= 0 && r < N && c >= 0 && c < N; + } + + static void initInput() throws Exception { + System.setIn(new FileInputStream("./input/BOJ19237.txt")); + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); // N × N 크기의 mapN + M = Integer.parseInt(st.nextToken()); // 1 ≤ 상어의 번호 ≤ M + k = Integer.parseInt(st.nextToken()); // 냄새 유지 시간 + liveSharkCnt = M; // 총 M개의 상어가 살아있음 + + idx = new int[N][N]; + smell = new Node[N][N]; + + sharks = new Shark[M + 1]; + for(int idx = 1; idx < sharks.length; idx++) sharks[idx] = new Shark(); + + for(int r = 0; r < idx.length; r++) { + st = new StringTokenizer(br.readLine()); + for(int c = 0; c < idx[0].length; c++) { + + smell[r][c] = new Node(); + + int currentIdx = Integer.parseInt(st.nextToken()); + idx[r][c] = currentIdx; + + if(currentIdx == 0) continue; + smell[r][c] = new Node(idx[r][c], k); + + int pos = r * N + c; + sharks[currentIdx].setPos(pos); + } + } + + st = new StringTokenizer(br.readLine()); + + for(int i = 1; i < sharks.length; i++) { + int dir = Integer.parseInt(st.nextToken()) - 1; + sharks[i].setDir(dir); + } + + for(int idx = 1; idx < sharks.length; idx++) { + int[][] priorityDir = new int[4][4]; + + for(int d = 0; d < 4; d++) { + st = new StringTokenizer(br.readLine()); + + for(int i = 0; i < 4; i++) { + int dir = Integer.parseInt(st.nextToken()) - 1; + priorityDir[d][i] = dir; + } + } + + sharks[idx].setPriority(priorityDir); + } + } +} From f2b265771898ea32714ffcc3eba2bee7b2f33787 Mon Sep 17 00:00:00 2001 From: KodaHye Date: Wed, 19 Feb 2025 10:33:38 +0900 Subject: [PATCH 3/7] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[BOJ]=201135?= =?UTF-8?q?=20=EB=89=B4=EC=8A=A4=20=EC=A0=84=ED=95=98=EA=B8=B0=5F250219?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "BOJ/1000-5000\353\262\210/DH_1135.java" | 50 ++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 "BOJ/1000-5000\353\262\210/DH_1135.java" diff --git "a/BOJ/1000-5000\353\262\210/DH_1135.java" "b/BOJ/1000-5000\353\262\210/DH_1135.java" new file mode 100644 index 00000000..f58bd4e9 --- /dev/null +++ "b/BOJ/1000-5000\353\262\210/DH_1135.java" @@ -0,0 +1,50 @@ +import java.io.*; +import java.util.*; + +/* + * 뉴스 전하기 + */ + +public class DH_1135 { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + int[] reverse = new int[N]; // 부모를 저장하는 배열 + + StringTokenizer st = new StringTokenizer(br.readLine()); + + for(int i = 0; i < N; i++) { + int p = Integer.parseInt(st.nextToken()); + + if(p == -1) continue; + reverse[i] = p; // 자신의 부모 저장 + } + + ArrayList time[] = new ArrayList[N]; // 인접리스트 (노드, 걸리는 시간) 저장 + for(int i = 0; i < time.length; i++) time[i] = new ArrayList<>(); + + int result = 0; + + for(int i = N - 1; i >= 0; i--) { + // 현재 노드에 인접해있는 노드를 걸리는 시간 내림차순으로 정렬함 + Collections.sort(time[i], (o1, o2) -> Integer.compare(o2[1], o1[1])); + + int tmp = 0; // 현재 노드까지 걸리는 시간 + + int childCnt = 1; // 자식의 수 + + // 제일 오래 걸리는 시간 더해주기 + for(int[] child: time[i]) { + tmp = Math.max(tmp, childCnt + child[1]); + childCnt += 1; + } + + // 인접리스트 만들어나가기 + time[reverse[i]].add(new int[] {i, tmp}); + result = Math.max(result, tmp); + } + + System.out.println(result); + } +} From b757e76c6d89afd66b670e605dd3abd800b21a52 Mon Sep 17 00:00:00 2001 From: KodaHye Date: Wed, 19 Feb 2025 14:36:48 +0900 Subject: [PATCH 4/7] =?UTF-8?q?rename:=20sql=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20\354\243\274\354\260\250/DH_Immediate Food Delivery II.sql" | 0 ...\232\237\354\210\230 \352\265\254\355\225\230\352\270\260.sql" | 0 ...\235\274 \354\241\260\355\232\214\355\225\230\352\270\260.sql" | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename "SQL/20\354\243\274\354\260\250/Immediate Food Delivery II.sql" => "SQL/20\354\243\274\354\260\250/DH_Immediate Food Delivery II.sql" (100%) rename "SQL/21\354\243\274\354\260\250/\353\214\200\354\227\254 \355\232\237\354\210\230\352\260\200 \353\247\216\354\235\200 \354\236\220\353\217\231\354\260\250\353\223\244\354\235\230 \354\233\224\353\263\204 \353\214\200\354\227\254 \355\232\237\354\210\230 \352\265\254\355\225\230\352\270\260.sql" => "SQL/21\354\243\274\354\260\250/DH_\353\214\200\354\227\254 \355\232\237\354\210\230\352\260\200 \353\247\216\354\235\200 \354\236\220\353\217\231\354\260\250\353\223\244\354\235\230 \354\233\224\353\263\204 \353\214\200\354\227\254 \355\232\237\354\210\230 \352\265\254\355\225\230\352\270\260.sql" (100%) rename "SQL/22\354\243\274\354\260\250/\354\241\260\355\232\214\354\210\230\352\260\200 \352\260\200\354\236\245 \353\247\216\354\235\200 \354\244\221\352\263\240\352\261\260\353\236\230 \352\262\214\354\213\234\355\214\220\354\235\230 \354\262\250\353\266\200\355\214\214\354\235\274 \354\241\260\355\232\214\355\225\230\352\270\260.sql" => "SQL/22\354\243\274\354\260\250/DH_\354\241\260\355\232\214\354\210\230\352\260\200 \352\260\200\354\236\245 \353\247\216\354\235\200 \354\244\221\352\263\240\352\261\260\353\236\230 \352\262\214\354\213\234\355\214\220\354\235\230 \354\262\250\353\266\200\355\214\214\354\235\274 \354\241\260\355\232\214\355\225\230\352\270\260.sql" (100%) diff --git "a/SQL/20\354\243\274\354\260\250/Immediate Food Delivery II.sql" "b/SQL/20\354\243\274\354\260\250/DH_Immediate Food Delivery II.sql" similarity index 100% rename from "SQL/20\354\243\274\354\260\250/Immediate Food Delivery II.sql" rename to "SQL/20\354\243\274\354\260\250/DH_Immediate Food Delivery II.sql" diff --git "a/SQL/21\354\243\274\354\260\250/\353\214\200\354\227\254 \355\232\237\354\210\230\352\260\200 \353\247\216\354\235\200 \354\236\220\353\217\231\354\260\250\353\223\244\354\235\230 \354\233\224\353\263\204 \353\214\200\354\227\254 \355\232\237\354\210\230 \352\265\254\355\225\230\352\270\260.sql" "b/SQL/21\354\243\274\354\260\250/DH_\353\214\200\354\227\254 \355\232\237\354\210\230\352\260\200 \353\247\216\354\235\200 \354\236\220\353\217\231\354\260\250\353\223\244\354\235\230 \354\233\224\353\263\204 \353\214\200\354\227\254 \355\232\237\354\210\230 \352\265\254\355\225\230\352\270\260.sql" similarity index 100% rename from "SQL/21\354\243\274\354\260\250/\353\214\200\354\227\254 \355\232\237\354\210\230\352\260\200 \353\247\216\354\235\200 \354\236\220\353\217\231\354\260\250\353\223\244\354\235\230 \354\233\224\353\263\204 \353\214\200\354\227\254 \355\232\237\354\210\230 \352\265\254\355\225\230\352\270\260.sql" rename to "SQL/21\354\243\274\354\260\250/DH_\353\214\200\354\227\254 \355\232\237\354\210\230\352\260\200 \353\247\216\354\235\200 \354\236\220\353\217\231\354\260\250\353\223\244\354\235\230 \354\233\224\353\263\204 \353\214\200\354\227\254 \355\232\237\354\210\230 \352\265\254\355\225\230\352\270\260.sql" diff --git "a/SQL/22\354\243\274\354\260\250/\354\241\260\355\232\214\354\210\230\352\260\200 \352\260\200\354\236\245 \353\247\216\354\235\200 \354\244\221\352\263\240\352\261\260\353\236\230 \352\262\214\354\213\234\355\214\220\354\235\230 \354\262\250\353\266\200\355\214\214\354\235\274 \354\241\260\355\232\214\355\225\230\352\270\260.sql" "b/SQL/22\354\243\274\354\260\250/DH_\354\241\260\355\232\214\354\210\230\352\260\200 \352\260\200\354\236\245 \353\247\216\354\235\200 \354\244\221\352\263\240\352\261\260\353\236\230 \352\262\214\354\213\234\355\214\220\354\235\230 \354\262\250\353\266\200\355\214\214\354\235\274 \354\241\260\355\232\214\355\225\230\352\270\260.sql" similarity index 100% rename from "SQL/22\354\243\274\354\260\250/\354\241\260\355\232\214\354\210\230\352\260\200 \352\260\200\354\236\245 \353\247\216\354\235\200 \354\244\221\352\263\240\352\261\260\353\236\230 \352\262\214\354\213\234\355\214\220\354\235\230 \354\262\250\353\266\200\355\214\214\354\235\274 \354\241\260\355\232\214\355\225\230\352\270\260.sql" rename to "SQL/22\354\243\274\354\260\250/DH_\354\241\260\355\232\214\354\210\230\352\260\200 \352\260\200\354\236\245 \353\247\216\354\235\200 \354\244\221\352\263\240\352\261\260\353\236\230 \352\262\214\354\213\234\355\214\220\354\235\230 \354\262\250\353\266\200\355\214\214\354\235\274 \354\241\260\355\232\214\355\225\230\352\270\260.sql" From fc05f3d94d0c5393429ffff3bf069e984c1b69bd Mon Sep 17 00:00:00 2001 From: KodaHye Date: Wed, 19 Feb 2025 14:38:11 +0900 Subject: [PATCH 5/7] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[sql]=20Fron?= =?UTF-8?q?tEnd=20=EA=B0=9C=EB=B0=9C=EC=9E=90=20=EC=B0=BE=EA=B8=B0=5F25021?= =?UTF-8?q?9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\234\353\260\234\354\236\220 \354\260\276\352\270\260.sql" | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 "SQL/23\354\243\274\354\260\250/DH_FrontEnd\352\260\234\353\260\234\354\236\220 \354\260\276\352\270\260.sql" diff --git "a/SQL/23\354\243\274\354\260\250/DH_FrontEnd\352\260\234\353\260\234\354\236\220 \354\260\276\352\270\260.sql" "b/SQL/23\354\243\274\354\260\250/DH_FrontEnd\352\260\234\353\260\234\354\236\220 \354\260\276\352\270\260.sql" new file mode 100644 index 00000000..f42fd441 --- /dev/null +++ "b/SQL/23\354\243\274\354\260\250/DH_FrontEnd\352\260\234\353\260\234\354\236\220 \354\260\276\352\270\260.sql" @@ -0,0 +1,4 @@ +SELECT DISTINCT(ID), EMAIL, FIRST_NAME, LAST_NAME +FROM DEVELOPERS a, (SELECT * FROM SKILLCODES WHERE CATEGORY = "Front End") b +WHERE a.SKILL_CODE & b.CODE > 0 +ORDER BY ID \ No newline at end of file From bef15e6b0fe3ed8220efab3b08af89353100a1bc Mon Sep 17 00:00:00 2001 From: KodaHye Date: Thu, 20 Feb 2025 09:40:13 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[PG]=2038947?= =?UTF-8?q?9=20=EC=84=9C=EB=B2=84=20=EC=A6=9D=EC=84=A4=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=5F250220?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Programmers/Level2/DH_389479.java | 50 +++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 Programmers/Level2/DH_389479.java diff --git a/Programmers/Level2/DH_389479.java b/Programmers/Level2/DH_389479.java new file mode 100644 index 00000000..edabf77e --- /dev/null +++ b/Programmers/Level2/DH_389479.java @@ -0,0 +1,50 @@ +import java.util.*; + +/* +서버 증설 횟수 +*/ + +class DH_389479 { + static class Node implements Comparable { + int s, e; + public Node(int s, int e) { + this.s = s; + this.e = e; + } + + @Override + public int compareTo(Node o) { + if(this.s != o.s) return Integer.compare(this.s, o.s); // 시작 순서 + return Integer.compare(this.e, o.e); // 끝나는 순서 + } + } + public int solution(int[] players, int m, int k) { + Queue q = new ArrayDeque<>(); + + int answer = 0; + + for(int i = 0; i < players.length; i++) { + while(!q.isEmpty() && q.peek().e <= i) q.poll(); + + int serverCnt = q.size(); // 현재 사용되는 서버의 수 + + // 현재 서버로 사용자들이 게임을 할 수 있을 때 + if(players[i] < (serverCnt + 1) * m) continue; + + // 추가해야되는 서버 개수 구하기 + int sub = players[i] - (serverCnt + 1) * m; + + // n → (n × m) ≤ 이용할 수 있는 사람 < ((n + 1) × m) + // 추가해야 되는 서버 수≤ + int addServerCnt = sub / m + 1; + + // addServerCnt만큼 서버 추가해주기 + for(int j = 0; j < addServerCnt; j++) { + q.add(new Node(i, i + k)); // (시작시간, 끝나는 시간) + answer += 1; + } + } + + return answer; + } +} \ No newline at end of file From 856086be315729d58d7b4364e04ccaea9b9398f1 Mon Sep 17 00:00:00 2001 From: KodaHye Date: Fri, 21 Feb 2025 13:20:27 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[BOJ]=201450?= =?UTF-8?q?=20=EB=83=85=EC=83=89=20=EB=AC=B8=EC=A0=9C=5F250221?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "BOJ/1000-5000\353\262\210/DH_1450.java" | 85 ++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 "BOJ/1000-5000\353\262\210/DH_1450.java" diff --git "a/BOJ/1000-5000\353\262\210/DH_1450.java" "b/BOJ/1000-5000\353\262\210/DH_1450.java" new file mode 100644 index 00000000..e8bfdb26 --- /dev/null +++ "b/BOJ/1000-5000\353\262\210/DH_1450.java" @@ -0,0 +1,85 @@ +import java.io.*; +import java.util.*; + +/* + * 냅색 문제 + */ + +public class DH_1450 { + static int N; + static long C; + static int[] arr1, arr2; + + public static void main(String[] args) throws Exception { + initInput(); + solution(); + } + + static void solution() { + + // 반씩 나눈 물건들의 각각의 그룹에서 더했을 때 나올 수 있는 모든 경우 구해주기 + ArrayList list1 = new ArrayList<>(); + ArrayList list2 = new ArrayList<>(); + + getSumList(list1, arr1, 0, 0); + getSumList(list2, arr2, 0, 0); + + // 이분탐색을 위한 정렬 + Collections.sort(list1); + Collections.sort(list2); + + // N개의 물건에 가방을 넣는 방법의 수 구하기 + System.out.println(getCount(list1, list2)); + } + + static long getCount(ArrayList list1, ArrayList list2) { + long cnt = 0; + + for(long n: list1) { + int s = 0, e = list2.size() - 1; + + long leftValue = C - n; + + while(s <= e) { + int m = (s + e) / 2; + + // upperbound 구해야 됨 (s 옮기기) + if(list2.get(m) <= leftValue) s = m + 1; + else e = m - 1; + } + + // 인덱스를 개수로 바꿔주기 위해 + 1을 함 + cnt += e + 1; + } + + return cnt; + } + static void getSumList(ArrayList list, int[] arr, int depth, long sum) { + if(depth == arr.length) { + list.add(sum); + return; + } + + getSumList(list, arr, depth + 1, sum + arr[depth]); + getSumList(list, arr, depth + 1, sum); + } + static void initInput() throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); // 물건의 개수 + C = Integer.parseInt(st.nextToken()); // 최대 담을 수 있는 무게 + + // 입력되는 물건들 반 씩 나누어서 생각하기 + arr2 = new int[N / 2]; + + if(N % 2 == 0) arr1 = new int[N / 2]; + else arr1 = new int[N / 2 + 1]; + + st = new StringTokenizer(br.readLine()); + + for(int i = 0; i < arr1.length; i++) arr1[i] = Integer.parseInt(st.nextToken()); + for(int i = 0; i < arr2.length; i++) arr2[i] = Integer.parseInt(st.nextToken()); + } +}