From 705cee2da94937e9df80bbaa5af34d6c1453aafc Mon Sep 17 00:00:00 2001 From: KodaHye Date: Mon, 7 Oct 2024 09:58:08 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[CT]=20?= =?UTF-8?q?=EB=86=80=EC=9D=B4=EA=B8=B0=EA=B5=AC=20=ED=83=91=EC=8A=B9=5F241?= =?UTF-8?q?007?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...352\265\254_\355\203\221\354\212\271.java" | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 "CodeTree/2021-2022\353\205\204/DH_\353\206\200\354\235\264\352\270\260\352\265\254_\355\203\221\354\212\271.java" diff --git "a/CodeTree/2021-2022\353\205\204/DH_\353\206\200\354\235\264\352\270\260\352\265\254_\355\203\221\354\212\271.java" "b/CodeTree/2021-2022\353\205\204/DH_\353\206\200\354\235\264\352\270\260\352\265\254_\355\203\221\354\212\271.java" new file mode 100644 index 00000000..9dfe06fe --- /dev/null +++ "b/CodeTree/2021-2022\353\205\204/DH_\353\206\200\354\235\264\352\270\260\352\265\254_\355\203\221\354\212\271.java" @@ -0,0 +1,127 @@ +import java.io.*; +import java.util.*; + +public class DH_놀이기구_탑승 { + static LinkedHashMap> hashMap; + static int[][] map; + static int[] dr = {-1, 1, 0, 0}, dc = {0, 0, -1, 1}; + + static void solution() { + // 학생들 map에 위치시키기 + for(int key: hashMap.keySet()) { + placeKey(key); + } + + // 점수 계산 + System.out.println(getScore()); + } + + // 점수계산 + static int getScore() { + int result = 0; + for(int r = 0; r < map.length; r++) { + for(int c = 0; c < map[0].length; c++) { + + int current = map[r][c]; + int likeCnt = 0; + + for(int d = 0; d < 4; d++) { + int nr = r + dr[d]; + int nc = c + dc[d]; + + if(!check(nr, nc)) continue; + // 주변에 친한 친구가 있으면 likeCnt 증가 + if(hashMap.get(current).contains(map[nr][nc])) likeCnt++; + } + + // 점수 배분: 10^(좋아하는 친구의 수 - 1) + result += Math.pow(10, likeCnt - 1); + } + } + + return result; + } + static void placeKey(int key) { + // setR, setC: key를 위치할 r, c 정보 + // 초기 빈 자리 수는 -1 로 해서 key의 위치가 잘못 정해지는 것 방지 + int setR = 0, setC = 0, likeCnt = 0, emptyCnt = -1; + + // map 순차 탐색하면서 학생이 앉을 수 있는 곳 찾기 + for(int r = 0; r < map.length; r++) { + for(int c = 0; c < map[0].length; c++) { + if(map[r][c] != 0) continue; + + int emptyTmpCnt = 0; + int likeTmpCnt = 0; + + for(int d = 0; d < 4; d++) { + int nr = r + dr[d]; + int nc = c + dc[d]; + + if(!check(nr, nc)) continue; + int next = map[nr][nc]; + if(next == 0) emptyTmpCnt++; // map이 비어있다면 emptyTmpCnt++ + if(hashMap.get(key).contains(next)) { // 친한 친구에 속한다면 likeTmpCnt++; + likeTmpCnt++; + } + } + + // r, c위치에서 좋아하는 친구 수가 이제까지 좋아하는 친구 수 보다 많으면 + // setR, setC 위치 update + // likeCnt, emptyCnt 값도 update + if(likeCnt < likeTmpCnt) { + setR = r; + setC = c; + likeCnt = likeTmpCnt; + emptyCnt = emptyTmpCnt; + } else if(likeCnt == likeTmpCnt) { + // 좋아하는 친구 수가 이제까지 좋아하는 친구 수와 같다면 + // 비어있는자리 확인하기 + // 현재 위치에서 주변 비어있는 자리 개수가, 직전 자리에서 비어있는 개수보다 많다면 + // setR, setC, emptyCnt 값 update + if(emptyCnt < emptyTmpCnt) { + setR = r; + setC = c; + likeCnt = likeTmpCnt; + emptyCnt = emptyTmpCnt; + } + } + } + } + + map[setR][setC] = key; + } + + static boolean check(int r, int c) { + return r >= 0 && r < map.length && c >= 0 && c < map[0].length; + } + public static void main(String[] args) throws Exception { + initInput(); + solution(); + } + + static void initInput() throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + int n = Integer.parseInt(br.readLine()); + map = new int[n][n]; + + hashMap = new LinkedHashMap<>(); + + for(int i = 0; i < n * n; i++) { + st = new StringTokenizer(br.readLine()); + int n0 = Integer.parseInt(st.nextToken()); + int n1 = Integer.parseInt(st.nextToken()); + int n2 = Integer.parseInt(st.nextToken()); + int n3 = Integer.parseInt(st.nextToken()); + int n4 = Integer.parseInt(st.nextToken()); + + hashMap.put(n0, new HashSet<>()); + hashMap.get(n0).add(n1); + hashMap.get(n0).add(n2); + hashMap.get(n0).add(n3); + hashMap.get(n0).add(n4); + } + } +} From 24390e4ac337415921c520697946942b3332a827 Mon Sep 17 00:00:00 2001 From: KodaHye Date: Tue, 8 Oct 2024 10:18:42 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[CT]=20?= =?UTF-8?q?=EC=A0=84=EC=9E=90=EC=82=AC=EC=A0=84=20=EB=A7=8C=EB=93=A4?= =?UTF-8?q?=EA=B8=B0=5F241008?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\353\247\214\353\223\244\352\270\260.java" | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 "CodeTree/2023-2024\353\205\204/DH_\354\240\204\354\236\220\354\202\254\354\240\204_\353\247\214\353\223\244\352\270\260.java" diff --git "a/CodeTree/2023-2024\353\205\204/DH_\354\240\204\354\236\220\354\202\254\354\240\204_\353\247\214\353\223\244\352\270\260.java" "b/CodeTree/2023-2024\353\205\204/DH_\354\240\204\354\236\220\354\202\254\354\240\204_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 00000000..01eca13a --- /dev/null +++ "b/CodeTree/2023-2024\353\205\204/DH_\354\240\204\354\236\220\354\202\254\354\240\204_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,94 @@ +import java.io.*; +import java.util.*; + +public class DH_전자사전_만들기 { + static class Node { + String str; // 입력된 문자의 정보 + int idx; // 몇 번쨰로 입력됐는지 저장하는 변수 + + public Node(String str, int idx) { + this.str = str; + this.idx = idx; + } + } + static BufferedReader br; + static StringTokenizer st; + static Node[] arr; + static int N, T; + static StringBuilder sb = new StringBuilder(); + + public static void main(String[] args) throws Exception { + initInput(); + solution(); + System.out.println(sb); + } + + static void solution() throws Exception { + for(int i = 0; i < T; i++) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + String str = st.nextToken(); + + // lowerIdx를 찾으며 사전에서 str로 시작하는 단어의 시작 idx 찾기 + int lowerIdx = getLowerIdx(str); + // uppderIdx를 찾으며 str로 시작하는 단어가 끝난 직후 idx 찾기 + int uppderIdx = getUpperIdx(str); + + int diff = (uppderIdx - lowerIdx) - 1; + if(diff < a - 1) sb.append(- 1 + "\n"); + else { + sb.append((arr[lowerIdx + (a - 1)].idx + 1) + "\n"); + } + } + } + + static int getUpperIdx(String str) { + int s = 0, e = arr.length; + + while(s < e) { + int m = (s + e) / 2; + // arr[m]가 사전순으로 같거나, 더 앞서있거나 + // arr[m]가 str로 시작한다면 시작점 옮겨주기 + if(arr[m].str.compareTo(str) <= 0 || arr[m].str.startsWith(str)) { + s = m + 1; + } else { + e = m; + } + } + + return s; + } + + static int getLowerIdx(String str) { + int s = 0, e = arr.length; + + while(s < e) { + int m = (s + e) / 2; + + // arr[m]이 사전순으로 더 앞에 있다면 시작점 옮겨주기 + if(arr[m].str.compareTo(str) < 0) { + s = m + 1; + } else { + e = m; + } + } + + return s; + } + + static void initInput() throws Exception { + br = new BufferedReader(new InputStreamReader(System.in)); + + st = new StringTokenizer(br.readLine()); + N = Integer.parseInt(st.nextToken()); + T = Integer.parseInt(st.nextToken()); + + arr = new Node[N]; + for(int i = 0; i < N; i++) { + arr[i] = new Node(br.readLine(), i); + } + + // 문자의 오름자순으로 배열 정렬 + Arrays.sort(arr, (o1, o2) -> o1.str.compareTo(o2.str)); + } +} From a8164487e42b53305bc38b329c9c116a5922f06a Mon Sep 17 00:00:00 2001 From: KodaHye Date: Wed, 9 Oct 2024 10:44:43 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[BOJ]=201967?= =?UTF-8?q?=20=ED=8A=B8=EB=A6=AC=EC=9D=98=20=EC=A7=80=EB=A6=84=5F241009?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "BOJ/1000-5000\353\262\210/DH_1967.java" | 81 ++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 "BOJ/1000-5000\353\262\210/DH_1967.java" diff --git "a/BOJ/1000-5000\353\262\210/DH_1967.java" "b/BOJ/1000-5000\353\262\210/DH_1967.java" new file mode 100644 index 00000000..ef250966 --- /dev/null +++ "b/BOJ/1000-5000\353\262\210/DH_1967.java" @@ -0,0 +1,81 @@ +import java.io.*; +import java.util.*; + +/* + * 트리의 지름 + */ + +public class BOJ1967 { + static class Node { + int e, w; + public Node(int e, int w) { + this.e = e; + this.w = w; + } + } + static ArrayList adj[]; // 노드 정보를 인접 리스트로 저장 + + public static void main(String[] args) throws Exception { + initInput(); + solution(); + } + + static void solution() { + // maxInfo: 노드의 id와 출발점 기준으로 얼마나 떨어져있는지 저장 + int[] maxInfo = getMaxDisInfo(1); // 루트 노듣를 기준으로 maxInfo 구하기 + System.out.println(getMaxDisInfo(maxInfo[0])[1]); // maxInfo기준으로 maxInfo 구하기 + } + + static int[] getMaxDisInfo(int start) { + // maxInfo[0]: 가장 멀리 떨어져 있는 Node의 idx 저장 + // maxinfo[1]: 가장 멀리 떨어져 있는 Node가 start 지점으로부터 얼마나 떨어져있는지 저장 + int[] maxInfo = new int[2]; + maxInfo[1] = Integer.MIN_VALUE; + + Deque q = new ArrayDeque(); + boolean[] v = new boolean[adj.length]; + + q.add(new Node(start, 0)); + v[start] = true; + + while(!q.isEmpty()) { + Node current = q.poll(); + + if(maxInfo[1] < current.w) { + maxInfo[1] = current.w; + maxInfo[0] = current.e; + } + + for(Node next: adj[current.e]) { + if(v[next.e]) continue; + q.add(new Node(next.e, current.w + next.w)); + v[next.e] = true; + } + } + + + return maxInfo; + } + + + static void initInput() throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + int N = Integer.parseInt(br.readLine()); + + adj = new ArrayList[N + 1]; + + for(int i = 0; i < adj.length; i++) adj[i] = new ArrayList(); + for(int i = 0; i < N - 1; i++) { + st = new StringTokenizer(br.readLine()); + + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + int w = Integer.parseInt(st.nextToken()); + + adj[a].add(new Node(b, w)); + adj[b].add(new Node(a, w)); + } + } +} From 5a9ce57239ed5821192b099a53c7747147b9b442 Mon Sep 17 00:00:00 2001 From: KodaHye Date: Wed, 9 Oct 2024 13:43:09 +0900 Subject: [PATCH 4/6] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[BOJ]=204781?= =?UTF-8?q?=20=EC=82=AC=ED=83=95=20=EA=B0=80=EA=B2=8C=5F241009?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "BOJ/1000-5000\353\262\210/DH_4781.java" | 57 ++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 "BOJ/1000-5000\353\262\210/DH_4781.java" diff --git "a/BOJ/1000-5000\353\262\210/DH_4781.java" "b/BOJ/1000-5000\353\262\210/DH_4781.java" new file mode 100644 index 00000000..cab31f37 --- /dev/null +++ "b/BOJ/1000-5000\353\262\210/DH_4781.java" @@ -0,0 +1,57 @@ +import java.io.*; +import java.util.*; + +/* +사탕 가게 + */ + +public class BOJ4781 { + static class Candy { + int c, p; + public Candy(int c, int p) { + this.c = c; + this.p = p; + } + } + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + StringBuilder sb = new StringBuilder(); + + while(true) { + + st = new StringTokenizer(br.readLine()); + + int n = Integer.parseInt(st.nextToken()); // 사탕 종류의 수 + int m = (int) (Math.round(Double.parseDouble(st.nextToken()) * 100)); // 돈의 양 + if(n == 0 && m == 0) break; + + Candy[] candys = new Candy[n + 1]; + + for(int i = 1; i < n + 1; i++) { + st = new StringTokenizer(br.readLine()); + int c = Integer.parseInt(st.nextToken()); + int p = (int) (Math.round(Double.parseDouble(st.nextToken()) * 100)); + + candys[i] = new Candy(c, p); + } + + int[][] dp = new int[candys.length][m + 1]; + + // dp[i][j]: j원을 쓰면서 i번 사탕까지 살 때, 살 수 있는 최대 칼로리 + for(int i = 1; i < dp.length; i++) { + for(int j = 0; j < dp[0].length; j++) { + if(j >= candys[i].p) { + dp[i][j] = Math.max(candys[i].c + dp[i][j - candys[i].p], dp[i - 1][j]); + } else { + dp[i][j] = dp[i - 1][j]; + } + } + } + sb.append(dp[n][m] + "\n"); + } + + System.out.print(sb); + } +} \ No newline at end of file From ac5707744ced3b7ffe245b7a9666704344604ba1 Mon Sep 17 00:00:00 2001 From: KodaHye Date: Thu, 10 Oct 2024 11:40:46 +0900 Subject: [PATCH 5/6] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[PG]=2021428?= =?UTF-8?q?8=20=EC=83=81=EB=8B=B4=EC=9B=90=20=EC=9D=B8=EC=9B=90=5F241010?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Programmers/Level3/DH_214288.java | 59 +++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Programmers/Level3/DH_214288.java diff --git a/Programmers/Level3/DH_214288.java b/Programmers/Level3/DH_214288.java new file mode 100644 index 00000000..6ce4a980 --- /dev/null +++ b/Programmers/Level3/DH_214288.java @@ -0,0 +1,59 @@ +import java.util.*; + +public class DH_214288 { + // 멘토 인원을 적절히 배정했을 때, 참가자들이 상담을 받기까지 기다린 시간을 모두 합한 최소값 + // n: 멘토의 수, k: 상담 유형 + // 유형별 멘토 인원이 적어도 한 명 이상 + public int solution(int k, int n, int[][] reqs) { + int[] people = new int[k]; // 상담에 대해서 몇 명까지 상담 받을 수 있는지 저장 + int answer = func(0, n, k, people, reqs); + + return answer; + } + + static int func(int depth, int n, int k, int[] people, int[][] reqs) { + int result = Integer.MAX_VALUE; + + if(depth == k) { + if(n == 0) return getWaitingTime(people, k, reqs); + return result; + } + + for(int i = 1; i < n + 1; i++) { + people[depth] = i; + result = Math.min(result, func(depth + 1, n - i, k, people, reqs)); + } + + return result; + } + + static int getWaitingTime(int[] people, int k, int[][] reqs) { + int waitingTime = 0; + + // 상담 유형별 끝나는 시간들 저장 + PriorityQueue[] q = new PriorityQueue[k]; + for(int i = 0; i < q.length; i++) q[i] = new PriorityQueue<>(); + + for(int i = 0; i < reqs.length; i++) { + int a = reqs[i][0]; + int b = reqs[i][1]; + int c = reqs[i][2] - 1; + + // 해당 유형의 상담을 받고 있는 총 사람과 제한된 사람수가 같다면 + // 제일 빨리 끝나는 사람 poll하고, 대기 시간 구해주기 + if(q[c].size() == people[c]) { + int endTime = q[c].poll(); + + if(endTime > a) { + waitingTime += endTime - a; + a = endTime; + } + } + + q[c].add(a + b); + } + + return waitingTime; + } + +} From 0e3df090e5157e3686590ffaaa7159e911cb9198 Mon Sep 17 00:00:00 2001 From: KodaHye Date: Fri, 11 Oct 2024 18:13:10 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=EA=B3=A0=EB=8B=A4=ED=98=9C:=20[BOJ]=209205?= =?UTF-8?q?=20=EB=A7=A5=EC=A3=BC=20=EB=A7=88=EC=8B=9C=EB=A9=B4=EC=84=9C=20?= =?UTF-8?q?=EA=B1=B8=EC=96=B4=EA=B0=80=EA=B8=B0=5F241011?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "BOJ/5001-10000\353\262\210/DH_9205.java" | 110 ++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 "BOJ/5001-10000\353\262\210/DH_9205.java" diff --git "a/BOJ/5001-10000\353\262\210/DH_9205.java" "b/BOJ/5001-10000\353\262\210/DH_9205.java" new file mode 100644 index 00000000..9f322c1d --- /dev/null +++ "b/BOJ/5001-10000\353\262\210/DH_9205.java" @@ -0,0 +1,110 @@ +import java.io.*; +import java.util.*; + +/* + * 맥주 마시면서 걸어가기 + */ + +public class DH_9205 { + static class Point { + int r, c; + public Point(int r, int c) { + this.r = r; + this.c = c; + } + } + static class Node implements Comparable { + int e, w; + public Node(int e, int w) { + this.e = e; + this.w = w; + } + + @Override + public int compareTo(Node o) { + return Integer.compare(this.w, o.w); + } + } + static StringBuilder sb = new StringBuilder(); + static ArrayList adj[]; + static Point[] p; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + int tc = Integer.parseInt(br.readLine()); + + for(int t = 0; t < tc; t++) { + int n = Integer.parseInt(br.readLine()); // 맥주를 파는 편의점의 개수 + + // 시작할 떄 맥주 한 박스 들고 시작 - 200 * 50 미터 갈 수 있음 + p = new Point[n + 2]; + adj = new ArrayList[n + 2]; + + // 위치들 입력 받기 + // 0: 집이 있는 곳, n + 1: 락 페스티벌 좌표 + for(int i = 0; i < p.length; i++) { + st = new StringTokenizer(br.readLine()); + int r = Integer.parseInt(st.nextToken()); + int c = Integer.parseInt(st.nextToken()); + + p[i] = new Point(r, c); + } + + // 양방향 인접리스트로 표현하기 + for(int i = 0; i < adj.length; i++) adj[i] = new ArrayList(); + for(int i = 0; i < p.length - 1; i++) { + for(int j = i + 1; j < p.length; j++) { + int dis = getDis(i, j); + + // 해당 지점을 가기 전 50미터에서 맥주 한 병을 다 마셔야 됨 + // 두 지점간 거리가 1000을 넘으면 못감 + if(dis > 1000) continue; + adj[i].add(new Node(j, dis)); + adj[j].add(new Node(i, dis)); + } + } + + // 다익스트라를 통해 '집의 시작점: 0' 에서부터 페스티벌 지점까지 갈 수 있는지 확인 + sb.append(dijkstra(0)? "happy": "sad").append("\n"); + } + + System.out.println(sb); + } + + // 우선순위 큐를 사용한 다익스트라 + static boolean dijkstra(int s) { + PriorityQueue q = new PriorityQueue(); + + q.add(new Node(s, 0)); + boolean[] v = new boolean[adj.length]; + int[] dis = new int[adj.length]; + + Arrays.fill(dis, Integer.MAX_VALUE); + v[0] = true; + dis[0] = 0; + + while(!q.isEmpty()) { + Node current = q.poll(); + v[current.e] = true; + + if(current.e == adj.length - 1) return true; + for(Node next: adj[current.e]) { + if(v[next.e]) continue; + + if(dis[next.e] > dis[current.e] + next.w) { + dis[next.e] = dis[current.e] + next.w; + + q.add(new Node(next.e, dis[next.e])); + } + } + } + + return false; + } + + static int getDis(int i, int j) { + return Math.abs(p[i].r - p[j].r) + Math.abs(p[i].c - p[j].c); + } +}