diff --git "a/BOJ/1000-5000353円262円210円/HW_2098.java" "b/BOJ/1000-5000353円262円210円/HW_2098.java" new file mode 100644 index 00000000..38fbef9e --- /dev/null +++ "b/BOJ/1000-5000353円262円210円/HW_2098.java" @@ -0,0 +1,44 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; +// 시간 복잡도 : 2<=n<=16 -> 16! 완전 탐색 불가 -> DP + 비트마스크 -> 16* 2^16 => O(N * 2 ^N) 가능 +// 가장 적은 비용을 들이는 외판원의 순회 여행 경로를 구하는 프로그램 +// 리스트 데이터를 변수 1개에 저장 -> bit(이진수 표현) +public class HW_2098 { + static int N; // 도시의 개수 + static int[][] W; // 도시 간의 이동 비용 + static int[][] d; // 최소 비용 저장 + static final int INF = Integer.MAX_VALUE>> 2; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + N = Integer.parseInt(br.readLine()); + W = new int[16][16]; // 비용 저장 배열 + d = new int[16][1<<16]; // 최소 비용 + for(int i=0; i 다음 도시(i) 최소 비용 계산 + } + } + d[c][v] = min_val; + return d[c][v]; + } +} \ No newline at end of file diff --git "a/BOJ/1000-5000353円262円210円/HW_2660.java" "b/BOJ/1000-5000353円262円210円/HW_2660.java" new file mode 100644 index 00000000..8ab39b57 --- /dev/null +++ "b/BOJ/1000-5000353円262円210円/HW_2660.java" @@ -0,0 +1,75 @@ +import java.io.*; +import java.util.*; + +// 회장의 점수와 회장이 될 수 있는 모든 사람을 찾는 프로그램 작성 + +// 점수 : 특정 회원이 다른 모든 회원과 연결되기 위해 필요한 최단 거리 중에서 가장 먼 거리 +// 회장 : 점수가 가장 낮은 사람(가장 가까운 거리에 있는 사람 = 최단거리) 구해야 함 +// 조건 : 몇 사람을 통하면 모두가 서로알 수 있다 = 모든 회원(노드)가 연결되어 있음 -> 플로이드 + +// 시간복잡도 : O(V^3) (50^3 : 가능) +public class HW_2660 { + static final int INF = Integer.MAX_VALUE>> 2; + static int N; + static int[][] graph; + public static void main(String[] args) throws IOException{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + N = Integer.parseInt(br.readLine()); + graph = new int[N+1][N+1]; + + // 배열 초기화 + for(int i=1; i<=n; i++) { + Arrays.fill(graph[i], INF); + graph[i][i] = 0; // 자기 자신과의 거리 0 + } + + while(true) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + if(a==-1 && b==-1) break; // 종료 조건 + graph[a][b] = graph[b][a] = 1; // 양방향 그래프 + } + + // 플로이드 와샬 + for(int k=1; k<=n; k++) { + for(int i=1; i<=n; i++) { + for(int j=1; j<=n; j++) { + if(graph[i][j]> graph[i][k] + graph[k][j]) { + graph[i][j] = graph[i][k] + graph[k][j]; + } + } + } + } + + int min = INF; + int[] scores = new int[N+1]; + + // 각 회원의 점수를 계산 + for(int i=1; i<=n; i++) { + int score = 0; + for(int j=1; j<=n; j++) { + if(graph[i][j] != INF) { + score = Math.max(score, graph[i][j]); + } + } + scores[i] = score; + min = Math.min(min, score); // 최소 점수 갱신 + } + + // 회장 찾기(최소 점수) + ArrayList candidates = new ArrayList(); + for(int i=1; i<=n; i++) { + if(scores[i] == min) { + candidates.add(i); + } + } + + System.out.println(min + " " + candidates.size()); + for(int i=0; i O(N^2) -> 완전 탐색 가능 +// 꽃을 심기위한 최소 비용을 출력 +public class HW_14620 { + static int N; + static int[] dx = {1, 0, -1, 0}; + static int[] dy = {0, 1, 0, -1}; + static int[][] garden; + static boolean[][] visited; + static int min = Integer.MAX_VALUE; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + N = Integer.parseInt(br.readLine()); + garden = new int[N][N]; + visited = new boolean[N][N]; + + for(int i=0; i= 0 && ny>= 0 && nx < N && ny < N; + } +} \ No newline at end of file diff --git "a/CodeTree/2017-2018353円205円204円/HW_354円240円204円355円210円254円_353円241円234円353円264円207円.java" "b/CodeTree/2017-2018353円205円204円/HW_354円240円204円355円210円254円_353円241円234円353円264円207円.java" new file mode 100644 index 00000000..1ed07bfe --- /dev/null +++ "b/CodeTree/2017-2018353円205円204円/HW_354円240円204円355円210円254円_353円241円234円353円264円207円.java" @@ -0,0 +1,94 @@ +import java.io.*; +import java.util.*; + +public class HW_전투_로봇 { + static int n, m; + static int[][] board; + static boolean[][] visited; + static int[] dx = {1, 0, -1, 0}; + static int[] dy = {0, 1, 0, -1}; + static int rbX, rbY; + static int rblevel = 2; // 초기 로봇 레벨 : 2 + static int monsters = 0, time = 0; + public static class Node{ + int x, y, d; + Node(int x, int y, int d){ + this.x = x; + this.y = y; + this.d = d; // 최단거리 기준으로 몬스터를 잡아야하기에 + } + } + public static void main(String[] args) throws IOException{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + n = Integer.parseInt(br.readLine()); + board = new int[n][n]; + for(int i=0; i빈칸 처리 + } + } + } + while(true){ + Node target = bfs(); + if(target==null){ + break; + } + // 로봇 이동 및 시간 증가 + rbX = target.x; + rbY = target.y; + time += target.d; + + board[rbX][rbY] = 0; + monsters++; + if(monsters == rblevel){ + rblevel++; + monsters = 0; + } + } + System.out.println(time); + } + public static Node bfs(){ // 잡을 수 있는 몬스터 찾기 + Queue queue = new LinkedList(); + visited = new boolean[n][n]; + queue.add(new Node(rbX, rbY, 0)); // 초기값 + visited[rbX][rbY] = true; // 방문 처리 + List temp = new ArrayList(); // 잡을 수 있는 몬스터를 저장 + + while(!queue.isEmpty()){ + Node cur = queue.poll(); + for(int i=0; i<4; i++){ + int nx = cur.x + dx[i]; + int ny = cur.y + dy[i]; + if(check(nx, ny) && !visited[nx][ny] && board[nx][ny] <= rblevel){ + visited[nx][ny] = true; // 방문 처리 + if(board[nx][ny]>0 && board[nx][ny] { + if(a.d == b.d){ // 가장 가까운 거리의 없앨 수 있는 몬스터가 하나 이상이라면 + if(a.x == b.x){ + return Integer.compare(a.y, b.y); // 가장 위에 존재하는 몬스터 + } + return Integer.compare(a.x, b.x); // 가장 왼쪽에 존재하는 몬스터부터 + } + return Integer.compare(a.d, b.d); // 거리가 가장 가까운 몬스터 + }); + return temp.get(0); // 가장 우선순위가 높은 타겟 없앰 + } + public static boolean check(int x, int y){ + return x>=0 && y>=0 && x < n && y = alp_req && j>= cop_req) { + int nA = Math.min(tA, i + alp_rw); + int nC = Math.min(tC, j + cop_rw); + dp[nA][nC] = Math.min(dp[nA][nC], dp[i][j] + cost); + } + } + } + } + + return dp[tA][tC]; + } +} diff --git a/Programmers/Level3/HW_64062.java b/Programmers/Level3/HW_64062.java new file mode 100644 index 00000000..af90bd92 --- /dev/null +++ b/Programmers/Level3/HW_64062.java @@ -0,0 +1,35 @@ +// 시간 복잡도 : stones.length<=200_000 -> O(N^2) 불가 +// 완전 탐색 -> 시간 초과 -> 이분 탐색으로 탐색 범위 줄여줌 -> O(N logN) + +// 징검다리를 건널 수 있는 최대 니니즈 친구들의 수 구하기 +// 한명씩 징검다리를 건너는 경우하여 돌을 줄이는 과정 -> 시간초과 +// 이분탐색으로 특정 인원이 건널 수 있는지 여부만 확인 +class HW_64062 { + public int solution(int[] stones, int k) { + int answer = 0; + int start = 0; + int end = Integer.MAX_VALUE; + + while(start <= end){ + int mid = (start + end)/2; // 건널 수 있는 사람의 수 + if(check(mid, k, stones)){ // true (mid명까지 건널 수 있는 경우) + answer = mid; + start = mid+1; // (mid+1)명까지 건널 수 있는지 확인 + } else{ // false + end = mid-1; + } + } + return answer; + } + public boolean check(int mid, int k, int[] stones){ // mid명이 건널 수 있는지 판단 + int cnt = 0; // 연속으로 건널 수 없는 돌의 개수 + for(int i = 0; i < stones.length; i++) { + if(stones[i] < mid) { // 현재 돌에 mid명이 건너려고할 때 + cnt++; + if(cnt>=k) // 연속으로 건널 수 없는 돌이 k개 이상일 경우 + return false; + } else cnt=0; // 연속성 끊김 + } + return true; + } +} diff --git "a/SQL/09354円243円274円354円260円250円/353円254円274円352円263円240円352円270円260円 354円242円205円353円245円230円 353円263円204円 353円214円200円354円226円264円 354円260円276円352円270円260円.SQL" "b/SQL/09354円243円274円354円260円250円/353円254円274円352円263円240円352円270円260円 354円242円205円353円245円230円 353円263円204円 353円214円200円354円226円264円 354円260円276円352円270円260円.SQL" new file mode 100644 index 00000000..c00abee0 --- /dev/null +++ "b/SQL/09354円243円274円354円260円250円/353円254円274円352円263円240円352円270円260円 354円242円205円353円245円230円 353円263円204円 353円214円200円354円226円264円 354円260円276円352円270円260円.SQL" @@ -0,0 +1,10 @@ +-- https://school.programmers.co.kr/learn/courses/30/lessons/293261 +SELECT ID, FISH_NAME, LENGTH +FROM FISH_INFO A JOIN FISH_NAME_INFO B + ON A.FISH_TYPE = B.FISH_TYPE +WHERE (A.FISH_TYPE, LENGTH) IN( + SELECT FISH_TYPE, MAX(LENGTH) + FROM FISH_INFO + GROUP BY FISH_TYPE +) +ORDER BY ID; \ No newline at end of file diff --git "a/SQL/09354円243円274円354円260円250円/353円266円204円352円270円260円353円263円204円 353円266円204円355円231円224円353円220円234円 353円214円200円354円236円245円352円267円240円354円235円230円 352円260円234円354円262円264円 354円210円230円 352円265円254円355円225円230円352円270円260円.sql" "b/SQL/09354円243円274円354円260円250円/353円266円204円352円270円260円353円263円204円 353円266円204円355円231円224円353円220円234円 353円214円200円354円236円245円352円267円240円354円235円230円 352円260円234円354円262円264円 354円210円230円 352円265円254円355円225円230円352円270円260円.sql" new file mode 100644 index 00000000..36a4ac7a --- /dev/null +++ "b/SQL/09354円243円274円354円260円250円/353円266円204円352円270円260円353円263円204円 353円266円204円355円231円224円353円220円234円 353円214円200円354円236円245円352円267円240円354円235円230円 352円260円234円354円262円264円 354円210円230円 352円265円254円355円225円230円352円270円260円.sql" @@ -0,0 +1,5 @@ +-- https://school.programmers.co.kr/learn/courses/30/lessons/299308 +SELECT CONCAT(QUARTER(DIFFERENTIATION_DATE), 'Q') AS QUARTER, COUNT(ID) AS ECOLI_COUNT +FROM ECOLI_DATA +GROUP BY QUARTER +ORDER BY QUARTER; \ No newline at end of file

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