diff --git "a/BOJ/1000-5000353円262円210円/JY_2660.java" "b/BOJ/1000-5000353円262円210円/JY_2660.java" new file mode 100644 index 00000000..9f277506 --- /dev/null +++ "b/BOJ/1000-5000353円262円210円/JY_2660.java" @@ -0,0 +1,101 @@ +package day1105; + +import java.io.*; +import java.util.*; + +public class JY_2660 { + + static int INF = Integer.MAX_VALUE; + static int N; + static List[] g; + static int[] distance; + static class Node implements Comparable { + int w, dist; + public Node(int w, int dist) { + this.w = w; + this.dist = dist; + } + @Override + public int compareTo(Node other) { + return this.dist - other.dist; + } + } + + 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()); + + g = new ArrayList[N+1]; + for(int i=1; i(); + } + + while(true) { + st = new StringTokenizer(br.readLine()); + int n1 = Integer.parseInt(st.nextToken()); + int n2 = Integer.parseInt(st.nextToken()); + if(n1 == -1 && n2 == -1) break; + g[n1].add(new Node(n2, 1)); + g[n2].add(new Node(n1, 1)); + } + + int minLevel = Integer.MAX_VALUE; + List aList = new ArrayList(); + for(int i=1; i(); + aList.add(i); + minLevel = level; + + } else if (level == minLevel) { + aList.add(i); + } + } + + System.out.println(minLevel+" "+aList.size()); + for(int i: aList) { + System.out.print(i+" "); + } + System.out.println(); + + } + public static void dijkstra(int n) { + PriorityQueue pq = new PriorityQueue(); + pq.add(new Node(n, 0)); + + distance[n] = 0; + + while(!pq.isEmpty()) { + Node now = pq.poll(); + + if(now.dist> distance[now.w]) continue; + + for(Node next: g[now.w]) { + int cost = now.dist + next.dist; + if(cost < distance[next.w]) { + distance[next.w] = cost; + pq.add(new Node(next.w, cost)); + } + } + } + } + public static int findLevel() { + int maxL = Integer.MIN_VALUE; + for(int i=1; i dList = new ArrayList(); + st = new StringTokenizer(br.readLine()); + int n1 = Integer.parseInt(st.nextToken()); + for(int i=1; i=0 && x=0 && y { + int x, y, time; + + public State(int x, int y, int time) { + super(); + this.x = x; + this.y = y; + this.time = time; + } + @Override + public int compareTo(State other) { + if(this.time == other.time) { + if(this.x == other.x) { + return this.y - other.y; + } + return this.x - other.x; + } + return this.time - other.time; + } + + @Override + public String toString() { + return "State [x=" + x + ", y=" + y + ", time=" + time + "]"; + } + + } + + 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()); + g = new int[N][N]; + for(int i=0; i=0 && x=0 && y q = new LinkedList(); + + q.add(new State(robot.x, robot.y, 0)); + visited[robot.x][robot.y] = true; + + PriorityQueue pq = new PriorityQueue(); + + while(!q.isEmpty()) { + State now = q.poll(); + // 없앨 수 있는 몬스터에 도착 + if(g[now.x][now.y]> 0 && g[now.x][now.y] < robot.level) { + pq.add(now); + } + + for(int i=0; i<4; i++) { + int nx = now.x + dx[i]; + int ny = now.y + dy[i]; + if(!inRange(nx, ny)) continue; + if(visited[nx][ny]) continue; + if(g[nx][ny]> robot.level) continue; + + visited[nx][ny] = true; + q.add(new State(nx, ny, now.time+1)); + } + } + + if(pq.isEmpty()) return 0; + State target = pq.poll(); + g[target.x][target.y] = 0; + robot.x = target.x; + robot.y = target.y; + + return target.time; + } + +} diff --git a/Programmers/Level3/JY_64062.java b/Programmers/Level3/JY_64062.java new file mode 100644 index 00000000..54a54415 --- /dev/null +++ b/Programmers/Level3/JY_64062.java @@ -0,0 +1,38 @@ +class Solution { + public int solution(int[] stones, int k) { + int answer = 0; + + int s = 0; + int e = Integer.MAX_VALUE; + // stones[i] <= 200,000,000 이므로 max로 초기화 + + while(s <= e) { + int mid = (s+e) / 2; + + if(canGo(mid, stones, k)) { + answer = mid; + s = mid + 1; + } else { + e = mid - 1; + } + } + + return answer; + } + public static boolean canGo(int mid, int[] stones, int k) { + int cnt = 0; // 건널 수 없는 돌의 개수 + + for(int i=0; i= k) return false; + } + + return true; + } +} \ No newline at end of file diff --git "a/SQL/09354円243円274円354円260円250円/JY_353円214円200円354円236円245円352円267円240円_355円201円254円352円270円260円354円227円220円_353円224円260円353円235円274円_353円266円204円353円245円230円355円225円230円352円270円260円_2.sql" "b/SQL/09354円243円274円354円260円250円/JY_353円214円200円354円236円245円352円267円240円_355円201円254円352円270円260円354円227円220円_353円224円260円353円235円274円_353円266円204円353円245円230円355円225円230円352円270円260円_2.sql" new file mode 100644 index 00000000..9bee89ed --- /dev/null +++ "b/SQL/09354円243円274円354円260円250円/JY_353円214円200円354円236円245円352円267円240円_355円201円254円352円270円260円354円227円220円_353円224円260円353円235円274円_353円266円204円353円245円230円355円225円230円352円270円260円_2.sql" @@ -0,0 +1,14 @@ +-- 대장균의 크기에 따라 분류하기 2 +-- https://school.programmers.co.kr/learn/courses/30/lessons/301649 +SELECT ID, + (CASE + WHEN (ROWNUM / CNT) <= 0.25 THEN "CRITICAL" + WHEN (ROWNUM / CNT) <= 0.5 THEN "HIGH" + WHEN (ROWNUM / CNT) <= 0.75 THEN "MEDIUM" + ELSE "LOW" + END) AS COLONY_NAME +FROM (SELECT ID, SIZE_OF_COLONY, + ROW_NUMBER() OVER(ORDER BY SIZE_OF_COLONY DESC) AS ROWNUM + FROM ECOLI_DATA) R, + (SELECT COUNT(*) AS CNT FROM ECOLI_DATA) C +ORDER BY ID \ No newline at end of file diff --git "a/SQL/09354円243円274円354円260円250円/JY_354円203円201円355円222円210円354円235円204円_352円265円254円353円247円244円355円225円234円_355円232円214円354円233円220円_353円271円204円354円234円250円_352円265円254円355円225円230円352円270円260円.sql" "b/SQL/09354円243円274円354円260円250円/JY_354円203円201円355円222円210円354円235円204円_352円265円254円353円247円244円355円225円234円_355円232円214円354円233円220円_353円271円204円354円234円250円_352円265円254円355円225円230円352円270円260円.sql" new file mode 100644 index 00000000..224412f5 --- /dev/null +++ "b/SQL/09354円243円274円354円260円250円/JY_354円203円201円355円222円210円354円235円204円_352円265円254円353円247円244円355円225円234円_355円232円214円354円233円220円_353円271円204円354円234円250円_352円265円254円355円225円230円352円270円260円.sql" @@ -0,0 +1,43 @@ +-- 상품을 구매한 회원 비율 구하기 +-- https://school.programmers.co.kr/learn/courses/30/lessons/131534 + +-- 1) 서브쿼리 사용 +SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH + , COUNT(DISTINCT B.USER_ID) AS PURCHASED_USERS + , ROUND(COUNT(DISTINCT B.USER_ID) / (SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED) = 2021), 1) AS PURCHASED_RATIO +FROM USER_INFO A +JOIN ONLINE_SALE B +ON A.USER_ID = B.USER_ID +WHERE YEAR(JOINED) = 2021 +GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE) +ORDER BY YEAR, MONTH + + +-- ----------------------------------------------------------------------------------- +-- 2) 가상테이블 사용 +WITH TOTAL_USERS_2021 AS ( + SELECT COUNT(DISTINCT USER_ID) AS T_COUNT + FROM USER_INFO + WHERE YEAR(JOINED) = 2021 +) +SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH + , COUNT(DISTINCT B.USER_ID) AS PURCHASED_USERS + , ROUND(COUNT(DISTINCT B.USER_ID) / (SELECT * FROM TOTAL_USERS_2021), 1) AS PURCHASED_RATIO +FROM USER_INFO A +JOIN ONLINE_SALE B +ON A.USER_ID = B.USER_ID +WHERE YEAR(JOINED) = 2021 +GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE) +ORDER BY YEAR, MONTH + +-- ----------------------------------------------------------------------------------- +-- 3) LIKE 활용 +SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH + , COUNT(DISTINCT B.USER_ID) AS PURCHASED_USERS + , ROUND(COUNT(DISTINCT B.USER_ID) / (SELECT COUNT(*) FROM USER_INFO WHERE JOINED LIKE "2021%"), 1) AS PURCHASED_RATIO +FROM USER_INFO A +JOIN ONLINE_SALE B +ON A.USER_ID = B.USER_ID +WHERE JOINED LIKE "2021%" +GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE) +ORDER BY YEAR, MONTH \ No newline at end of file

AltStyle によって変換されたページ (->オリジナル) /