diff --git "a/week38/\352\260\225\354\204\261\354\232\261/baekjoon/NQueen.java" "b/week38/\352\260\225\354\204\261\354\232\261/baekjoon/NQueen.java" new file mode 100644 index 0000000..cbed976 --- /dev/null +++ "b/week38/\352\260\225\354\204\261\354\232\261/baekjoon/NQueen.java" @@ -0,0 +1,67 @@ +package week38.강성욱.baekjoon; + +import java.util.Arrays; + +/** + * PackageName : week38.강성욱.baekjoon + * FileName : NQueen + * Author : Baekgwa + * Date : 26. 1. 20. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 20. Baekgwa Initial creation + */ +public class NQueen { + class Solution { + + private static int count = 0; + + public int solution(int n) { + boolean[][] map = new boolean[n][n]; + + for (int i = 0; i < n; i++) { + Arrays.fill(map[i], true); + } + + dfs(0, n, map); + return count; + } + + private void dfs(int y, int n, boolean[][] map) { + if(y == n) { + count++; + return; + } + + for(int x = 0; x < n; x++) { + if(!map[y][x]) continue; + + boolean[][] nextMap = new boolean[n][n]; + for (int i = 0; i < n; i++) { + nextMap[i] = map[i].clone(); + } + + updateMap(nextMap, x, y, n); + dfs(y + 1, n, nextMap); + } + } + + private void updateMap(boolean[][] map, int x, int y, int n) { + for (int ny = y + 1; ny < n; ny++) { + map[ny][x] = false; + + int diff = ny - y; + + if (x - diff >= 0) { + map[ny][x - diff] = false; + } + + if (x + diff < n) { + map[ny][x + diff] = false; + } + } + } + } +} diff --git "a/week38/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\205\352\265\255\354\213\254\354\202\254.java" "b/week38/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\205\352\265\255\354\213\254\354\202\254.java" new file mode 100644 index 0000000..4f74695 --- /dev/null +++ "b/week38/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\205\352\265\255\354\213\254\354\202\254.java" @@ -0,0 +1,70 @@ +package week38.강성욱.baekjoon; + +/** + * PackageName : week38.강성욱.baekjoon + * FileName : 입국심사 + * Author : Baekgwa + * Date : 26. 1. 20. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 20. Baekgwa Initial creation + */ +public class 입국심사 { + class Solution { + // 그럼 심사원의 명수는 times size 만큼이네? + // 그냥 비어있는곳에 갓다 넣어버리면 그게 더 이득인가? + // 꼭 그렇진 않음. + // 즉, 지금 비어있는 곳 중, 가장 빨리 입국심사 패스하는 사람한테 할당해줘야 젤 빨리 끝남. + // ---- + // 근데 입국심사 기다리는 사람이 벌써 10억명임. + // 즉, 하나씩 iter 돌면 거의 반드시 터짐. + // 줄여야함. + // --- + // 그래서 이분탐색을 쓰면 되는거구나 + // n 초 중에서, 얼만큼 처리할 수 있는지 확인 + // 최소초는 음 그냥 0으로 두고 + // 맥스는 반드시 모두 처리할 수 있는 시간, 즉, n * 1,000,000,000분(분은 솔직히 max 찾는게 낫긴한데, 그냥 이렇게 써도 큰문제는 없지않아?), 걍 max 찾자 + public long solution(int n, int[] times) { + long result = Long.MAX_VALUE; //모든 사람을 처리할 수 있는 시간 + + long max = 0L; + for(int time : times) { + max = Math.max(time, max); + } + + long left = 0L; + long right = max * n; + + while(left <= right) { + long mid = (left + right) / 2; + + long nowCount = calcPassCount(mid, times); //현재 mid(시간) 값으로, 몇명이나 처리 가능한지 확인하기 + + // 처리 가능하면? + if(nowCount >= n) { + right = mid - 1L; + result = Math.min(mid, result); + continue; + } else { + left = mid + 1L; + continue; + } + } + + return result; + } + + //현재 mid(시간) 값으로, 몇명이나 처리 가능한지 확인하기 + private long calcPassCount(long mid, int[] times) { + long count = 0L; + + for(int time : times) { + count += mid / (long) time; + } + + return count; + } + } +} diff --git "a/week38/\352\260\225\354\204\261\354\232\261/baekjoon/\355\203\200\354\236\204\353\250\270\354\213\240.java" "b/week38/\352\260\225\354\204\261\354\232\261/baekjoon/\355\203\200\354\236\204\353\250\270\354\213\240.java" new file mode 100644 index 0000000..3182a52 --- /dev/null +++ "b/week38/\352\260\225\354\204\261\354\232\261/baekjoon/\355\203\200\354\236\204\353\250\270\354\213\240.java" @@ -0,0 +1,102 @@ +package week38.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.StringTokenizer; + +/** + * PackageName : week38.강성욱.baekjoon + * FileName : 타임머신 + * Author : Baekgwa + * Date : 26. 1. 20. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 20. Baekgwa Initial creation + */ +public class 타임머신 { + public class Main { + // 무조건 1번 도시에서 시작! + // 아 음수가 있네. + // 이러면 다익스트라 사용 불가능 + // 벨만 포드로 + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + int N = Integer.parseInt(st.nextToken()); + int M = Integer.parseInt(st.nextToken()); + + long[] dist = new long[N + 1]; + Arrays.fill(dist, Long.MAX_VALUE); + dist[1] = 0; + + List edgeList = new ArrayList<>(); + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int start = Integer.parseInt(st.nextToken()); + int end = Integer.parseInt(st.nextToken()); + int weight = Integer.parseInt(st.nextToken()); + edgeList.add(new Edge(start, end, weight)); + } + + // N-1번까지는 최단거리 갱신, N번째는 음수 사이클 확인 + for (int i = 0; i < N; i++) { + for (Edge edge : edgeList) { + if (dist[edge.getStart()] == Long.MAX_VALUE) + continue; + + int start = edge.getStart(); + int end = edge.getEnd(); + int weight = edge.getWeight(); + + long distance = dist[start] + weight; + if (dist[end] > distance) { + dist[end] = distance; + if (i == N - 1) { + System.out.println("-1"); + return; + } + } + } + } + + StringBuilder sb = new StringBuilder(); + for (int i = 2; i <= N; i++) { + if (dist[i] == Long.MAX_VALUE) { + sb.append("-1").append("\n"); + } else { + sb.append(dist[i]).append("\n"); + } + } + System.out.print(sb.toString()); + } + + private static class Edge { + private int start; + private int end; + private int weight; + + public Edge(int start, int end, int weight) { + this.start = start; + this.end = end; + this.weight = weight; + } + + public int getStart() { + return start; + } + + public int getEnd() { + return end; + } + + public int getWeight() { + return weight; + } + } + } +} diff --git "a/week38/\352\260\225\354\204\261\354\232\261/baekjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\260.java" "b/week38/\352\260\225\354\204\261\354\232\261/baekjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\260.java" new file mode 100644 index 0000000..c26ada7 --- /dev/null +++ "b/week38/\352\260\225\354\204\261\354\232\261/baekjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\260.java" @@ -0,0 +1,61 @@ +package week38.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +/** + * PackageName : week38.강성욱.baekjoon + * FileName : 파일_합치기 + * Author : Baekgwa + * Date : 26. 1. 20. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 20. Baekgwa Initial creation + */ +public class 파일_합치기 { + public class Main { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + int testCase = Integer.parseInt(br.readLine()); + + while(testCase-- > 0) { + int K = Integer.parseInt(br.readLine()); + int[][] dp = new int[K+1][K+1]; + int[] map = new int[K+1]; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for(int i = 1; i <= K; i++) { + map[i] = Integer.parseInt(st.nextToken()); + } + + int[] prefix = new int[K+1]; + for (int i = 1; i <= K; i++) { + prefix[i] = prefix[i-1] + map[i]; + } + + for(int length=2; length <= K; length++) { + for(int start=1; start + length -1 <= K; start++) { + int end = start + length - 1; + dp[start][end] = Integer.MAX_VALUE; + + for(int k=start; k