diff --git "a/week19_a/\354\235\264\354\203\201\354\226\265/backjoon/\352\264\204\355\230\270\354\235\230_\352\260\222.java" "b/week19_a/\354\235\264\354\203\201\354\226\265/backjoon/\352\264\204\355\230\270\354\235\230_\352\260\222.java" new file mode 100644 index 0000000..29ff732 --- /dev/null +++ "b/week19_a/\354\235\264\354\203\201\354\226\265/backjoon/\352\264\204\355\230\270\354\235\230_\352\260\222.java" @@ -0,0 +1,63 @@ +// 괄호 안에 들어있으면 -> 곱하기 +// 괄호 옆에 나란히 있으면 -> 더하기 +// () : 2 [] : 3 + +import java.util.*; +import java.io.*; + +public class Main{ + public static void main(String[] args) throws Exception{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String s = br.readLine().trim(); + + Stack stack = new Stack<>(); + int result = 0; + int mul = 1; // 중첩에 따른 곱 + char prev = 0; + + for(int i = 0; i < s.length(); i++){ + char c = s.charAt(i); + + switch(c){ + case '(': + stack.push(c); + mul *= 2; + break; + + case '[': + stack.push(c); + mul *= 3; + break; + + case ')': + if(stack.isEmpty() || stack.peek() != '(') { + System.out.println(0); + return ; + } + if(prev == '(') result += mul; + stack.pop(); + mul /= 2; + break; + + case ']': + if(stack.isEmpty() || stack.peek() != '[') { + System.out.println(0); + return ; + } + if(prev == '[') result += mul; + stack.pop(); + mul /= 3; + + break; + default: + result = 0; mul = 0; + break; + } + + prev = c; + } + if(!stack.isEmpty()) result = 0; + + System.out.println(result); + } +} \ No newline at end of file diff --git "a/week19_a/\354\235\264\354\203\201\354\226\265/backjoon/\355\217\211\353\262\224\355\225\234_\353\260\260\353\202\255.java" "b/week19_a/\354\235\264\354\203\201\354\226\265/backjoon/\355\217\211\353\262\224\355\225\234_\353\260\260\353\202\255.java" new file mode 100644 index 0000000..8689883 --- /dev/null +++ "b/week19_a/\354\235\264\354\203\201\354\226\265/backjoon/\355\217\211\353\262\224\355\225\234_\353\260\260\353\202\255.java" @@ -0,0 +1,39 @@ +// 최대 k 무게 만큼 넣을 수 있음 +// N 개의 물건을 가지고 있는데 무게 : W , 가치 V를 가짐 + + +import java.io.*; +import java.util.*; + +public class Main { + 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 K = Integer.parseInt(st.nextToken()); // 최대 무게 + + int[] W = new int[N+1]; // 무게 + int[] V = new int[N+1]; // 가치 + + for (int i = 1; i <= N; i++) { + st = new StringTokenizer(br.readLine()); + W[i] = Integer.parseInt(st.nextToken()); + V[i] = Integer.parseInt(st.nextToken()); + } + + int[][] dp = new int[N+1][K+1]; // dp[i][j] = i번째 물건까지 고려했을 때 무게 j 이하로 담을 수 있는 최대 가치 + + for (int i = 1; i <= N; i++) { + for (int j = 1; j <= K; j++) { + if (j < W[i]) { + dp[i][j] = dp[i-1][j]; // 현재 물건을 담을 수 없음 + } else { + dp[i][j] = Math.max(dp[i-1][j], V[i] + dp[i-1][j - W[i]]); + } + } + } + + System.out.println(dp[N][K]); + } +} diff --git "a/week20/\352\260\225\354\204\261\354\232\261/baekjoon/\353\215\224\355\225\230\352\270\260_1_2_3.java" "b/week20/\352\260\225\354\204\261\354\232\261/baekjoon/\353\215\224\355\225\230\352\270\260_1_2_3.java" new file mode 100644 index 0000000..0cdad0a --- /dev/null +++ "b/week20/\352\260\225\354\204\261\354\232\261/baekjoon/\353\215\224\355\225\230\352\270\260_1_2_3.java" @@ -0,0 +1,48 @@ +package week20.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * PackageName : week20.강성욱.baekjoon + * FileName : 더하기_1_2_3 + * Author : Baekgwa + * Date : 2025-09-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-11 Baekgwa Initial creation + */ +public class 더하기_1_2_3 { + public class Main { + public static void main(String args[]) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int count = Integer.parseInt(br.readLine()); + int numbers[] = new int[count]; + int max = Integer.MIN_VALUE; + + for(int i=0; i q = new LinkedList<>(); + q.add(target); + dp[target] = 0; + + while (!q.isEmpty()) { + int nowTarget = q.poll(); + + for (int i = 1; i <= nowTarget; i++) { + int nextCoast = dp[nowTarget] + deck[i]; + int nextTarget = nowTarget - i; + + if (dp[nextTarget] < nextCoast) { + dp[nextTarget] = nextCoast; + q.offer(nextTarget); + } + } + } + + System.out.println(dp[0]); + } + } +} diff --git "a/week20/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\355\201\260_\354\240\225\354\202\254\352\260\201\355\230\225_\354\260\276\352\270\260.java" "b/week20/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\355\201\260_\354\240\225\354\202\254\352\260\201\355\230\225_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..5abe67c --- /dev/null +++ "b/week20/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\355\201\260_\354\240\225\354\202\254\352\260\201\355\230\225_\354\260\276\352\270\260.java" @@ -0,0 +1,79 @@ +package week20.강성욱.programmers; + +/** + * PackageName : week20.강성욱.baekjoon + * FileName : 가장_큰_정사각형_찾기 + * Author : Baekgwa + * Date : 2025-09-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-11 Baekgwa Initial creation + */ +public class 가장_큰_정사각형_찾기 { + // class Solution { + // public int solution(int[][] board) { + // int n = board.length; + // int m = board[0].length; + // int maxSide = 0; + + // for (int y = 0; y < n; y++) { + // for (int x = 0; x < m; x++) { + // if (board[y][x] == 0) continue; + // int maxPossible = Math.min(n - y, m - x); + // for (int s = 1; s <= maxPossible; s++) { + // if (validate(board, y, x, s)) { + // if (s > maxSide) maxSide = s; + // } else { + // break; + // } + // } + // } + // } + // return maxSide * maxSide; + // } + + // private boolean validate(int[][] b, int y, int x, int s) { + // int yEnd = y + s; + // int xEnd = x + s; + // for (int i = y; i < yEnd; i++) { + // for (int j = x; j < xEnd; j++) { + // if (b[i][j] == 0) return false; + // } + // } + // return true; + // } + // } + + class Solution { + public int solution(int[][] board) { + int my = board.length; + int mx = board[0].length; + int[][] dp = new int[my][mx]; //dp 배열은 [y][x] 좌표를 정사각형 우측 하단 지점으로 잡았을 경우, 가장 크게 만들 수 있는 정사각형의 한 변의 길이 + + int result = 0; + + // 가로 세로 초기화 + for(int y = 0; y temp || t2 < temp)) continue; + + // 여기서부터 다음 dp 계산 (다음 줄기들 계산해서 넣어주기) + // 온도 상승 케이스, 즉 희망온도를 높게 잡은 경우 + // 만약, 외부 온도가 현재 온도보다 높다면 그냥 내버려두고, 아니면 전기 써야함. + int upCoast = temperature > temp ? 0 : a; + int upTemp = temp + 1; + if(upTemp < 100) { + dp[time+1][upTemp] = Math.min(nowCoast + upCoast, dp[time+1][upTemp]); + } + + // 온도 유지 케이스 + // 만약, 외부 온도와 현재 온도가 같은 케이스 처리 필요. + int stayCoast = temperature == temp ? 0 : b; + dp[time+1][temp] = Math.min(nowCoast + stayCoast, dp[time+1][temp]); + + // 온도 하강 케이스 + // 외부 온도와 비교 후, 케이스 처리 + int downCoast = temperature < temp ? 0 : a; + int downTemp = temp - 1; + if(downTemp >= 0) { + dp[time+1][downTemp] = Math.min(nowCoast + downCoast, dp[time+1][downTemp]); + } + } + } + + // 마지막 dp 에서 가장 작은 값 찾아보기 + // dp[totalTime][~]; + int result = Integer.MAX_VALUE; + for(int temp = 0; temp < 100; temp++) { + if (onboard[totalTime - 1] == 1 && (temp < t1 || temp > t2)) { + continue; + } + result = Math.min(result, dp[totalTime - 1][temp]); + } + + return result; + } + } +} diff --git "a/week20/\352\260\225\354\204\261\354\232\261/programmers/\354\232\260\353\260\225\354\210\230\354\227\264_\354\240\225\354\240\201\353\266\204.java" "b/week20/\352\260\225\354\204\261\354\232\261/programmers/\354\232\260\353\260\225\354\210\230\354\227\264_\354\240\225\354\240\201\353\266\204.java" new file mode 100644 index 0000000..c9d571d --- /dev/null +++ "b/week20/\352\260\225\354\204\261\354\232\261/programmers/\354\232\260\353\260\225\354\210\230\354\227\264_\354\240\225\354\240\201\353\266\204.java" @@ -0,0 +1,65 @@ +package week20.강성욱.programmers; + +import java.util.ArrayList; +import java.util.List; + +/** + * PackageName : week20.강성욱.baekjoon + * FileName : 우박수열_정적분 + * Author : Baekgwa + * Date : 2025-09-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-11 Baekgwa Initial creation + */ +public class 우박수열_정적분 { + class Solution { + public double[] solution(int k, int[][] ranges) { + List yPointList = new ArrayList<>(); + List areaList = new ArrayList<>(); + double[] result = new double[ranges.length]; + + yPointList.add(k); + while(k != 1) { + if(k % 2 == 0) k = k / 2; + else k = k * 3 + 1; + yPointList.add(k); + } + + // 구간 별 사다리꼴? 합 먼저 구해두기 + for(int i=0; i areaList) { + int n = areaList.size(); // 유효 인덱스: 0..n + if (a > e) return -1.0; + if (a < 0 || e < 0 || a > n || e > n) return -1.0; + if (a == e) return 0.0; + + double sum = 0.0; + for (int i = a; i < e; i++) { + sum += areaList.get(i); + } + return sum; + } + } +} diff --git "a/week20/\352\260\225\354\204\261\354\232\261/programmers/\355\212\234\355\224\214.java" "b/week20/\352\260\225\354\204\261\354\232\261/programmers/\355\212\234\355\224\214.java" new file mode 100644 index 0000000..8e81c51 --- /dev/null +++ "b/week20/\352\260\225\354\204\261\354\232\261/programmers/\355\212\234\355\224\214.java" @@ -0,0 +1,49 @@ +package week20.강성욱.programmers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * PackageName : week20.강성욱.baekjoon + * FileName : 튜플 + * Author : Baekgwa + * Date : 2025-09-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-11 Baekgwa Initial creation + */ +public class 튜플 { + class Solution { + public int[] solution(String s) { + Set visited = new HashSet<>(); + List result = new ArrayList<>(); + + String[] sArray = s.substring(2, s.length() - 2).split("\\},\\{"); + Arrays.sort(sArray, Comparator.comparingInt(String::length)); + + for(String str : sArray) { + String[] strArray = str.split(","); + for(String strNumber : strArray) { + int number = Integer.parseInt(strNumber); + if(!visited.contains(number)) { + visited.add(number); + result.add(number); + } + } + } + + int[] list = new int[result.size()]; + for(int i=0; i> nodeMap = new HashMap<>(); //key : node, value : 연결된 Node들 List + Set visited = new HashSet<>(); //key : node, value : 방문 여부. true => 방문 + + // 미리 정해진 node 만큼 Map value 에 ArrayList 만들어두기 + for(int node : nodes) { + nodeMap.put(node, new ArrayList<>()); + } + + // 간선 정리 및 저장 + for(int[] edge : edges) { + int a = edge[0]; + int b = edge[1]; + + nodeMap.get(a).add(b); + nodeMap.get(b).add(a); + } + + int treeCount = 0; + int reverseTreeCount = 0; + + for (int node : nodes) { + if (!visited.contains(node)) { + List treeList = new ArrayList<>(); + + // DFS를 호출하여 연결된 모든 노드를 리스트에 담는다 + dfs(node, nodeMap, visited, treeList); + + if (isNormalTree(treeList, nodeMap)) { + treeCount++; + } + if (isReverseTree(treeList, nodeMap)) { + reverseTreeCount++; + } + } + } + + return new int[]{treeCount, reverseTreeCount}; + } + + private void dfs(int currentNode, Map> nodeMap, Set visited, List treeList) { + visited.add(currentNode); + treeList.add(currentNode); + + for (int neighbor : nodeMap.get(currentNode)) { + if (!visited.contains(neighbor)) { + dfs(neighbor, nodeMap, visited, treeList); + } + } + } + + private boolean isNormalTree(List treeList, Map> nodeMap) { + int rootCount = 0; + for (int node : treeList) { + int childeCount = nodeMap.get(node).size(); + + // "루트가 아닐 때"의 조건: P(번호) == P(degree - 1) + // 이 조건을 만족하지 않는 노드를 카운트한다. + // (a % 2)는 a의 홀짝성을 나타낸다. (0: 짝수, 1: 홀수) + if ((node % 2) != ((childeCount - 1) % 2)) { + rootCount++; + } + } + if(rootCount == 1) return true; + return false; + } + + private boolean isReverseTree(List treeList, Map> nodeMap) { + int rootCount = 0; + for (int node : treeList) { + int childCount = nodeMap.get(node).size(); + + // "루트가 아닐 때"의 조건: P(번호) != P(degree - 1) + // 이 조건을 만족하지 않는 노드, 즉 P(번호) == P(degree - 1)인 노드를 카운트한다. + if ((node % 2) == ((childCount - 1) % 2)) { + rootCount++; + } + } + if(rootCount == 1) return true; + return false; + } + } +} diff --git "a/week20/\352\271\200\353\202\230\354\235\200/baekjoon/\354\225\214\353\236\214_\354\213\234\352\263\204.java" "b/week20/\352\271\200\353\202\230\354\235\200/baekjoon/\354\225\214\353\236\214_\354\213\234\352\263\204.java" new file mode 100644 index 0000000..b770c59 --- /dev/null +++ "b/week20/\352\271\200\353\202\230\354\235\200/baekjoon/\354\225\214\353\236\214_\354\213\234\352\263\204.java" @@ -0,0 +1,39 @@ +package week20.김나은.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class 알람_시계 { + + public class Main { + + public static void main(String[] args) throws IOException { + // BufferedReader: 표준 입력(System.in)으로부터 한 줄씩 빠르게 읽기 + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + // StringTokenizer: 공백 단위로 문자열을 나누어 토큰 형태로 관리 + StringTokenizer st = new StringTokenizer(br.readLine()); + + // 알람 맞춘 시각 H + int hour = Integer.parseInt(st.nextToken()); + + // 알람 맞춘 분 M + int minute = Integer.parseInt(st.nextToken()); + + // 분(minute)이 45보다 작은 경우 + if (minute < 45) { + if (hour == 0) { // 현재 시간이 0시라면, "한 시간 전"은 23시가 됨 (하루 전으로 돌아감) + hour = 23; + } else { // 0시가 아니면 그냥 시(hour)에서 1 빼기 + hour -= 1; + } + minute = 60 - (45 - minute); + } else { + minute -= 45; + } + System.out.println(hour + " " + minute); + } + } +} \ No newline at end of file diff --git "a/week20/\352\271\200\353\202\230\354\235\200/programmers/\355\212\234\355\224\214.java" "b/week20/\352\271\200\353\202\230\354\235\200/programmers/\355\212\234\355\224\214.java" new file mode 100644 index 0000000..7f4c4c7 --- /dev/null +++ "b/week20/\352\271\200\353\202\230\354\235\200/programmers/\355\212\234\355\224\214.java" @@ -0,0 +1,46 @@ +package week20.김나은.programmers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class 튜플 { + + class Solution { + + public int[] solution(String s) { + int[] answer = {}; + + // 입력 문자열에서 맨 앞 "{{" 와 맨 뒤 "}}" 제거 + s = s.substring(2, s.length() - 2); + // "},{“ 구분자를 기준으로 집합 단위로 분리 + String[] arr = s.split("\\},\\{"); + + // 각 숫자의 등장 횟수를 저장할 Map + Map map = new HashMap<>(); + + // 모든 집합을 순회하며 숫자 등장 횟수 카운트 + for (String str : arr) { + String[] numArr = str.split(","); + for (String num : numArr) { + // num이 이미 있으면 +1, 없으면 1로 초기화 + map.put(num, map.getOrDefault(num, 0) + 1); + } + } + + // keySet()으로 숫자(문자열)를 뽑아 리스트로 변환 + List keyList = new ArrayList<>(map.keySet()); + // 등장 횟수를 기준으로 내림차순 정렬 + keyList.sort((s1, s2) -> map.get(s2) - map.get(s1)); + + // 정답 배열 생성 + answer = new int[keyList.size()]; + for (int i = 0; i < answer.length; i++) { + answer[i] = Integer.parseInt(keyList.get(i)); + } + + return answer; + } + } +} \ No newline at end of file diff --git "a/week20/\354\235\264\354\203\201\354\226\265/backjoon/1,2,3_\353\215\224\355\225\230\352\270\260.java" "b/week20/\354\235\264\354\203\201\354\226\265/backjoon/1,2,3_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..4d9ee76 --- /dev/null +++ "b/week20/\354\235\264\354\203\201\354\226\265/backjoon/1,2,3_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,48 @@ +/** + * PackageName : week20.이상억.backjoon; + * FileName : 1,2,3_더하기 + * Author : sangeok + * Date : 2025. 09. 10. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 10. sangeok Initial creation + */ + +// 1 -> 1 +// 2 -> 2 +// 3 -> 4 +// 4 -> 7 +// 5 - > 13 +// 11111 1112 1121 1211 2111 +// 113 131 311 +// 221 212 122 +// 32 23 +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int T = Integer.parseInt(br.readLine()); + + int[] dp = new int[12]; // n 최대값이 11 + dp[0] = 1; + dp[1] = 1; + dp[2] = 2; + dp[3] = 4; + + for (int i = 4; i <= 11; i++) { + dp[i] = dp[i-1] + dp[i-2] + dp[i-3]; + } + + StringBuilder sb = new StringBuilder(); + for (int t = 0; t < T; t++) { + int n = Integer.parseInt(br.readLine()); + sb.append(dp[n]).append("\n"); + } + + System.out.print(sb); + } +} diff --git "a/week20/\354\235\264\354\203\201\354\226\265/backjoon/\354\225\214\353\236\214_\354\213\234\352\263\204.java" "b/week20/\354\235\264\354\203\201\354\226\265/backjoon/\354\225\214\353\236\214_\354\213\234\352\263\204.java" new file mode 100644 index 0000000..1a0c6f5 --- /dev/null +++ "b/week20/\354\235\264\354\203\201\354\226\265/backjoon/\354\225\214\353\236\214_\354\213\234\352\263\204.java" @@ -0,0 +1,46 @@ +/** + * PackageName : week20.이상억.backjoon; + * FileName : 알람_시계 + * Author : sangeok + * Date : 2025. 09. 10. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 10. sangeok Initial creation + */ + +import java.util.*; +import java.io.*; + +public class Main { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int h = Integer.parseInt(st.nextToken()); // 시 + int m = Integer.parseInt(st.nextToken()); // 분 + + int totalMinutes = hToMinutes(h, m) - 45; + + if (totalMinutes < 0) { + totalMinutes += 24 * 60; + } + + int[] hm = minutesToHM(totalMinutes); + + System.out.println(hm[0] + " " + hm[1]); + } + + public static int hToMinutes(int h, int m) { + return h * 60 + m; + } + + public static int[] minutesToHM(int m) { + int[] result = new int[2]; + result[0] = (m / 60) % 24; + result[1] = m % 60; + return result; + } +} diff --git "a/week20/\354\235\264\354\203\201\354\226\265/backjoon/\354\271\264\353\223\234_\352\265\254\353\247\244\355\225\230\352\270\260.java" "b/week20/\354\235\264\354\203\201\354\226\265/backjoon/\354\271\264\353\223\234_\352\265\254\353\247\244\355\225\230\352\270\260.java" new file mode 100644 index 0000000..7f7d5bd --- /dev/null +++ "b/week20/\354\235\264\354\203\201\354\226\265/backjoon/\354\271\264\353\223\234_\352\265\254\353\247\244\355\225\230\352\270\260.java" @@ -0,0 +1,46 @@ +/** + * PackageName : week20.이상억.backjoon; + * FileName : 카드_구매하기 + * Author : sangeok + * Date : 2025. 09. 10. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 10. sangeok Initial creation + */ + +// ps 카드 +// 전설, 레드, 오렌지, 퍼플, 블루, 청록, 그린, 그레이 +// 1~n 개가 포함된 + + +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + int[] p = new int[N + 1]; + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 1; i <= N; i++) { + p[i] = Integer.parseInt(st.nextToken()); + } + + int[] dp = new int[N + 1]; + dp[0] = 0; + + // DP 계산 + for (int k = 1; k <= N; k++) { + int i = 1; + while (i <= k) { + dp[k] = Math.max(dp[k], dp[k - i] + p[i]); + i++; + } + } + + System.out.println(dp[N]); + } +} diff --git "a/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\355\201\260_\354\240\225\354\202\254\352\260\201\355\230\225_\354\260\276\352\270\260.java" "b/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\355\201\260_\354\240\225\354\202\254\352\260\201\355\230\225_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..4fb0590 --- /dev/null +++ "b/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\355\201\260_\354\240\225\354\202\254\352\260\201\355\230\225_\354\260\276\352\270\260.java" @@ -0,0 +1,43 @@ +/** + * PackageName : week20.이상억.progarmmers; + * FileName : 가장_큰_정사각형_찾기 + * Author : sangeok + * Date : 2025. 09. 11. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 11. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public int solution(int [][]board) { + int n = board.length; // 행 + int m = board[0].length; // 열 + + int[][] dp = new int[n][m]; + int answer = 0; + + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (board[i][j] == 1) { + if (i == 0 || j == 0) { + dp[i][j] = 1; // 첫 행/열은 그대로 1 + } else { + int up = dp[i - 1][j]; + int left = dp[i][j - 1]; + int cross = dp[i - 1][j - 1]; + int minValue = Math.min(up, Math.min(left, cross)); + dp[i][j] = minValue + 1; + } + answer = Math.max(answer, dp[i][j]); + } + } + } + + return answer * answer; + } +} diff --git "a/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\354\232\260\353\260\225\354\210\230\354\227\264_\354\240\225\354\240\201\353\266\204.java" "b/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\354\232\260\353\260\225\354\210\230\354\227\264_\354\240\225\354\240\201\353\266\204.java" new file mode 100644 index 0000000..a458c73 --- /dev/null +++ "b/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\354\232\260\353\260\225\354\210\230\354\227\264_\354\240\225\354\240\201\353\266\204.java" @@ -0,0 +1,83 @@ +/** + * PackageName : week20.이상억.progarmmers; + * FileName : 우박수열_정적분 + * Author : sangeok + * Date : 2025. 09. 09. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 09. sangeok Initial creation + */ + + + +// 1-1) 2k -> 2k/2 +// 1-2) 2k+1 -> (2k + 1) * 3 + 1 +// result_value > 1 -> (1) result_value + + +import java.util.*; + +class Solution { + public double[] solution(int k, int[][] ranges) { + + int[][] coords = Collatz_function(k); + int n = coords.length - 1; + + // 구간별 면적 계산 + double[] areas = new double[n]; + for (int i = 0; i < n; i++) { + int y1 = coords[i][1]; + int y2 = coords[i+1][1]; + areas[i] = (y1 + y2) / 2.0; // 사다리꼴 넓이 + } + + double[] prefix = new double[n+1]; + + for (int i = 1; i <= n; i++) { + prefix[i] = prefix[i-1] + areas[i-1]; + } + + + double[] answer = new double[ranges.length]; + + for (int i = 0; i < ranges.length; i++) { + int start = ranges[i][0]; + int end = n + ranges[i][1]; // end가 음수일 수도 있음 + + if (start > end) { + answer[i] = -1.0; + } else { + answer[i] = prefix[end] - prefix[start]; + } + } + + return answer; + } + + + public int[][] Collatz_function(int k) { + List list = new ArrayList<>(); + int a = k; + int step = 0; + + list.add(new int[]{step, a}); // 시작 좌표 (0, k) + + while (a > 1) { + if (a % 2 == 0) { + a /= 2; + } else { + a = a * 3 + 1; + } + step++; + list.add(new int[]{step, a}); // 좌표 추가 + } + + int[][] array = new int[list.size()][2]; + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + return array; + } +} diff --git "a/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\355\212\234\355\224\214.java" "b/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\355\212\234\355\224\214.java" new file mode 100644 index 0000000..19e4d0f --- /dev/null +++ "b/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\355\212\234\355\224\214.java" @@ -0,0 +1,68 @@ +/** + * PackageName : week20.이상억.progarmmers; + * FileName : 튜플 + * Author : sangeok + * Date : 2025. 09. 09. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 09. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public int[] solution(String s) { + + List> list = parse_tuple(s); + + int[] answer = new int[list.size()]; + + list.sort((a, b) -> a.size() - b.size()); + + Set set = new HashSet<>(); + int i = 0; + for (List a : list) { + for (int num : a) { + if (!set.contains(num)) { + set.add(num); + answer[i] = num; + i++; + } + } + } + + return answer; + } + + public List> parse_tuple(String s) { + List> result = new ArrayList<>(); + List current = null; + StringBuilder num = null; + + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == '{') { + current = new ArrayList<>(); + } else if (Character.isDigit(c)) { + if (num == null) num = new StringBuilder(); + num.append(c); + } else if (c == ',' || c == '}') { + if (num != null) { + current.add(Integer.parseInt(num.toString())); + num = null; + } + if (c == '}' && current != null) { + result.add(current); + current = null; + } + } + } + + return result; + } + +} diff --git "a/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\355\231\200\354\247\235_\355\212\270\353\246\254.java" "b/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\355\231\200\354\247\235_\355\212\270\353\246\254.java" new file mode 100644 index 0000000..5252cb8 --- /dev/null +++ "b/week20/\354\235\264\354\203\201\354\226\265/progarmmers/\355\231\200\354\247\235_\355\212\270\353\246\254.java" @@ -0,0 +1,13 @@ +// 홀수 노드 : 노드 번호 홀수 , 자식 노드의 개수 홀수 +// 짝수 노드 : 노드 번호 짝수 , 자식 노드의 개수 짝수 +// 역홀수 노드 : 노드 번호 홀수 , 자식 노드의 개수 짝수 +// 역짝수 노드 : 노드 번호 짝수 , 자식 노드의 개수 홀수 + +// 홀짝 트리 : 홀수 노드, 짝수 노드 +// 역홀짝 트리 : 역홀수 노드, 역짝수 노드 +class Solution { + public int[] solution(int[] nodes, int[][] edges) { + int[] answer = {}; + return answer; + } +} \ No newline at end of file diff --git "a/week21/\352\260\225\354\204\261\354\232\261/baekjoon/\353\223\234\353\236\230\352\263\244_\354\225\244_\353\215\230\354\240\204.java" "b/week21/\352\260\225\354\204\261\354\232\261/baekjoon/\353\223\234\353\236\230\352\263\244_\354\225\244_\353\215\230\354\240\204.java" new file mode 100644 index 0000000..eb43801 --- /dev/null +++ "b/week21/\352\260\225\354\204\261\354\232\261/baekjoon/\353\223\234\353\236\230\352\263\244_\354\225\244_\353\215\230\354\240\204.java" @@ -0,0 +1,84 @@ +package week21.강성욱.baekjoon; + +import java.util.Scanner; + +/** + * PackageName : week21.강성욱.baekjoon + * FileName : 드래곤_앤_던전 + * Author : Baekgwa + * Date : 2025-09-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-19 Baekgwa Initial creation + */ +public class 드래곤_앤_던전 { + public class Main { + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + long roomCount = sc.nextLong(); + long manPower = sc.nextLong(); + long[][] roomInfo = new long[(int)roomCount][3]; + long left = 1; + long right = 0; + long result = 0; + + for(int i=0; i 0){ + manAttackCount += 1; + } + monsterAttackCount = manAttackCount - 1; + + //실제 감소 적용 + if(nowHp - (monsterAttackCount * monsterPower) <= 0) return false; + nowHp = nowHp - (monsterAttackCount * monsterPower); + } + else { + manPower += roomInfo[1]; + nowHp = Math.min(nowHp + roomInfo[2], maxHp); + } + } + + return nowHp > 0; + } + } +} diff --git "a/week21/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\220\353\221\220\353\202\230\353\254\264.java" "b/week21/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\220\353\221\220\353\202\230\353\254\264.java" new file mode 100644 index 0000000..40088e8 --- /dev/null +++ "b/week21/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\220\353\221\220\353\202\230\353\254\264.java" @@ -0,0 +1,59 @@ +package week21.강성욱.baekjoon; + +import java.util.Arrays; +import java.util.Scanner; + +/** + * PackageName : week21.강성욱.baekjoon + * FileName : 자두나무 + * Author : Baekgwa + * Date : 2025-09-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-19 Baekgwa Initial creation + */ +public class 자두나무 { + public class Main { + + static int T, W; + static int[] fruits; + static int[][][] memo; + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + T = sc.nextInt(); + W = sc.nextInt(); + fruits = new int[T + 1]; + + for (int t = 1; t <= T; t++) { + fruits[t] = sc.nextInt(); + } + + memo = new int[T+1][W+1][2]; + for (int[][] mat : memo) { + for(int[] row : mat) { + Arrays.fill(row, -1); + } + } + + int result = Math.max(solve(1, 0, 0), solve(1, 1, 1)); + System.out.println(result); + } + + static int solve(int t, int w, int p) { + if (t > T || w > W) return 0; + if (memo[t][w][p] != -1) return memo[t][w][p]; + + int currentScore = (fruits[t] == p+1) ? 1 : 0; + + int stay = solve(t+1, w, p); + int move = solve(t+1, w+1, 1-p); + + memo[t][w][p] = currentScore + Math.max(stay, move); + return memo[t][w][p]; + } + } +} diff --git "a/week21/\352\260\225\354\204\261\354\232\261/programmers/\352\263\274\354\240\234_\354\247\204\355\226\211\355\225\230\352\270\260.java" "b/week21/\352\260\225\354\204\261\354\232\261/programmers/\352\263\274\354\240\234_\354\247\204\355\226\211\355\225\230\352\270\260.java" new file mode 100644 index 0000000..0d00931 --- /dev/null +++ "b/week21/\352\260\225\354\204\261\354\232\261/programmers/\352\263\274\354\240\234_\354\247\204\355\226\211\355\225\230\352\270\260.java" @@ -0,0 +1,93 @@ +package week21.강성욱.programmers; + +import java.util.Comparator; +import java.util.PriorityQueue; +import java.util.Stack; + +/** + * PackageName : week21.강성욱.programmers + * FileName : 과제_진행하기 + * Author : Baekgwa + * Date : 2025-09-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-19 Baekgwa Initial creation + */ +public class 과제_진행하기 { + // queue? stack? 정렬? + // 일딴 시작 시간 기준으로 정렬은 무조건 필요. + // 그리고, 이전걸 계속 가지고 가야함. + // 이거 정렬이든, 뭐든 쉽게 가져가기 위해서 내부적으로 통일화 해서 쓰자. class로 + + class Solution { + public String[] solution(String[][] plans) { + // 실행할 Job 을 Queue 순서대로 진행 + // 정렬은, 시작 순서 + PriorityQueue jobQueue = new PriorityQueue<>(Comparator.comparingInt(j -> j.startTime)); + + for(String[] plan : plans) { + jobQueue.offer(new Job(plan[0], convertToMin(plan[1]), Integer.valueOf(plan[2]))); + } + + String[] result = new String[plans.length]; //결과를 담을 result; + int resIdx = 0; // + //중간에 멈춘 작업은, 가장 최근에 멈춘 과제부터 다시 시작하기 때문에, LIFO Stack 으로 구성 + Stack stack = new Stack<>(); + Job nowJob = null; + int nowTime = 0; + + while (resIdx < plans.length) { + if (nowJob == null) { + if (!jobQueue.isEmpty() && jobQueue.peek().startTime <= nowTime) { + nowJob = jobQueue.poll(); + nowTime = Math.max(nowTime, nowJob.startTime); + } + else if (!stack.isEmpty()) { + nowJob = stack.pop(); + } + else if (!jobQueue.isEmpty()) { + nowJob = jobQueue.poll(); + nowTime = nowJob.startTime; + } else { + break; + } + } + + int nextStart = jobQueue.isEmpty() ? Integer.MAX_VALUE : jobQueue.peek().startTime; + + if (nowTime + nowJob.remainTime <= nextStart) { + nowTime += nowJob.remainTime; + result[resIdx++] = nowJob.name; + nowJob = null; + } else { + int spent = nextStart - nowTime; + nowJob.remainTime -= spent; + nowTime = nextStart; + stack.push(nowJob); + nowJob = jobQueue.poll(); + } + } + + return result; + } + + private static class Job { + private String name; + private int startTime; //시작시간 (분) + private int remainTime; //남은시간 (분) + + public Job(String name, int startTime, int remainTime) { + this.name = name; + this.startTime = startTime; + this.remainTime = remainTime; + } + } + + private int convertToMin(String str) { + String[] strArray = str.split(":"); + return Integer.valueOf(strArray[0]) * 60 + Integer.valueOf(strArray[1]); + } + } +} diff --git "a/week21/\352\260\225\354\204\261\354\232\261/programmers/\353\241\234\353\230\220\354\235\230_\354\265\234\352\263\240_\354\210\234\354\234\204\354\231\200_\354\265\234\354\240\200_\354\210\234\354\234\204.java" "b/week21/\352\260\225\354\204\261\354\232\261/programmers/\353\241\234\353\230\220\354\235\230_\354\265\234\352\263\240_\354\210\234\354\234\204\354\231\200_\354\265\234\354\240\200_\354\210\234\354\234\204.java" new file mode 100644 index 0000000..e173156 --- /dev/null +++ "b/week21/\352\260\225\354\204\261\354\232\261/programmers/\353\241\234\353\230\220\354\235\230_\354\265\234\352\263\240_\354\210\234\354\234\204\354\231\200_\354\265\234\354\240\200_\354\210\234\354\234\204.java" @@ -0,0 +1,41 @@ +package week21.강성욱.programmers; + +/** + * PackageName : week21.강성욱.programmers + * FileName : 로또의_최고_순위와_최저_순위 + * Author : Baekgwa + * Date : 2025-09-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-19 Baekgwa Initial creation + */ +public class 로또의_최고_순위와_최저_순위 { + class Solution { + + private static final int[] result = new int[]{6, 6, 5, 4, 3, 2, 1}; //index 개 맞췄을때의 등수 + + public int[] solution(int[] lottos, int[] win_nums) { + //못알아본 숫자 수량 + int blankCnt = 0; + for(int lotto : lottos) { + if(lotto == 0) blankCnt++; + } + + //현재 기본 개수 확인 + int badCnt = 0; + for(int i = 0; i < lottos.length; i++) { + for(int j=0; j list = new ArrayList<>(); + + // int loopCnt = Math.min(X.length(), Y.length()); + // for(int i=loopCnt-1; i>=0; i--) { + // if(X.charAt(i) == Y.charAt(i)) { + // list.add(Integer.valueOf(X.charAt(i))); + // } + // } + + // list.sort(Collections.reverseOrder()); + // StringBuilder sb = new StringBuilder(); + // for(int now : list) { + // sb.append(now); + // } + // return sb.toString(); + // } + // } + + // class Solution { + // public String solution(String X, String Y) { + // List list = new ArrayList<>(); + + // int loopCnt = Math.min(X.length(), Y.length()); + // //X, Y 를 역순으로 정렬해둬야함. 0번이 끝으로 가야하니. + // char[] x = new char[X.length()]; + // for(int i=0; i= 0; i--) { + int commonCount = Math.min(countX[i], countY[i]); + for (int j = 0; j < commonCount; j++) { + answerBuilder.append(i); + } + } + + String answer = answerBuilder.toString(); + + if (answer.isEmpty()) { + return "-1"; + } + + if (answer.charAt(0) == '0') { + return "0"; + } + + return answer; + } + } +} diff --git "a/week21/\352\260\225\354\204\261\354\232\261/programmers/\355\230\274\354\236\220_\353\206\200\352\270\260\354\235\230_\353\213\254\354\235\270.java" "b/week21/\352\260\225\354\204\261\354\232\261/programmers/\355\230\274\354\236\220_\353\206\200\352\270\260\354\235\230_\353\213\254\354\235\270.java" new file mode 100644 index 0000000..e6b03b9 --- /dev/null +++ "b/week21/\352\260\225\354\204\261\354\232\261/programmers/\355\230\274\354\236\220_\353\206\200\352\270\260\354\235\230_\353\213\254\354\235\270.java" @@ -0,0 +1,59 @@ +package week21.강성욱.programmers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week21.강성욱.programmers + * FileName : 혼자_놀기의_달인 + * Author : Baekgwa + * Date : 2025-09-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-19 Baekgwa Initial creation + */ +public class 혼자_놀기의_달인 { + // 최대 cards 가 100개임. + + + // [1,2,3,4,5,6,7,8] 인덱스 + // [8,6,3,7,2,5,1,4] + // 8, 4, 7, 1 묶음 + // 6, 2, 5 묶음 + // 아 순환 발생하면 끝이구나, 즉, 다음에 가야할 곳이 visited 면, 해당 묶음 끝 + // 묶음은 엄청 많이 나올 수 있는데, 이걸 모두 묶어보고, 가장 큰거 두개 곱하면 됨. + + class Solution { + public int solution(int[] cards) { + List resultList = new ArrayList<>(); // 묶음 사이즈의 리스트 + boolean[] visited = new boolean[cards.length]; + + for(int idx=0; idx= 0; d--) { + // X와 Y에서 공통으로 가진 숫자의 개수 = 두 배열의 최소값 + int common = Math.min(cntX[d], cntY[d]); + // 공통 개수만큼 결과 문자열에 추가 + for (int i = 0; i < common; i++) { + sb.append(d); + } + } + + // 예외 처리 1: 공통된 숫자가 전혀 없는 경우 + if (sb.length() == 0) { + return "-1"; + } + // 예외 처리 2: 결과가 모두 0으로만 이루어진 경우 + if (sb.charAt(0) == '0') { + return "0"; + } + + return sb.toString(); + + } + + // 주어진 문자열 s에 포함된 숫자들을 세어 배열 arr에 기록하는 메서드 + private void countNumInArr(String s, int[] arr) { + for (int i = 0; i < s.length(); i++) { + int idx = s.charAt(i) - '0'; // 입력이 숫자 문자열이라는 전제 + arr[idx]++; + } + } + } +} \ No newline at end of file diff --git "a/week21/\354\235\264\354\203\201\354\226\265/backjoon/\353\223\234\353\236\230\352\263\244\354\225\244\353\215\230\354\240\204.java" "b/week21/\354\235\264\354\203\201\354\226\265/backjoon/\353\223\234\353\236\230\352\263\244\354\225\244\353\215\230\354\240\204.java" new file mode 100644 index 0000000..f75d9aa --- /dev/null +++ "b/week21/\354\235\264\354\203\201\354\226\265/backjoon/\353\223\234\353\236\230\352\263\244\354\225\244\353\215\230\354\240\204.java" @@ -0,0 +1,90 @@ +/** + * PackageName : week21.이상억.backjoon; + * FileName : 드래곤앤던전 + * Author : sangeok + * Date : 2025. 09. 17. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 17. sangeok Initial creation + */ + +// H_MaxHp : 용사의 최대 생명력 >= 1 -> 던전에 들어 간 이후 변함 없음 +// H_CurHp : 현재 용사의 생명력. H_CurHp <= H_MaxHp +// H_Atk : 용사의 공격력 + +// 던전 : N 개의 방 , i 번째 방을 통해서만 i + 1 번째 방 +// N 번째 방에 공주 및 용 존재 + +// (1) t : 몬스터 방 , a : 몬스터의 공격력 , h : 몬스터의 체력 +// (2) t : 포션 방, a : 증가할 공격력 , h : 회복할 체력 + +import java.util.*; +import java.io.*; + +public class Main { + + static int N; // 방 개수 + static long H_ATK; // 초기 공격력 + static int[] t; // 방 종류 + static long[] a; // 공격력 or 포션 공격력 증가 + static long[] h; // 체력 or 포션 회복량 + + 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()); + H_ATK = Long.parseLong(st.nextToken()); + + t = new int[N]; + a = new long[N]; + h = new long[N]; + + for (int i = 0; i < N; i++) { + st = new StringTokenizer(br.readLine()); + t[i] = Integer.parseInt(st.nextToken()); + a[i] = Long.parseLong(st.nextToken()); + h[i] = Long.parseLong(st.nextToken()); + } + + long low = 1; + long high = (long) 1e18; + long answer = high; + + while (low <= high) { + long mid = (low + high) / 2; + + if (check(mid)) { + answer = mid; + high = mid - 1; // 더 작은 체력도 가능한지 확인 + } else { + low = mid + 1; + } + } + + System.out.println(answer); + } + + // 초기 체력이 maxhp일 때 던전을 끝까지 버틸 수 있는지 검사 + public static boolean check(long maxhp) { + long curhp = maxhp; + long curatk = H_ATK; + + for (int i = 0; i < N; i++) { + if (t[i] == 1) { + long turns = (h[i] + curatk - 1) / curatk; + long damage = (turns - 1) * a[i]; // 마지막 턴 반격 없음 + + curhp -= damage; + if (curhp <= 0) return false; + } else { + curatk += a[i]; + curhp = Math.min(maxhp, curhp + h[i]); + } + } + + return true; + } +} diff --git "a/week21/\354\235\264\354\203\201\354\226\265/backjoon/\354\236\220\353\221\220\353\202\230\353\254\264.java" "b/week21/\354\235\264\354\203\201\354\226\265/backjoon/\354\236\220\353\221\220\353\202\230\353\254\264.java" new file mode 100644 index 0000000..b5ec4ea --- /dev/null +++ "b/week21/\354\235\264\354\203\201\354\226\265/backjoon/\354\236\220\353\221\220\353\202\230\353\254\264.java" @@ -0,0 +1,62 @@ +/** + * PackageName : week21.이상억.backjoon; + * FileName : 자두나무 + * Author : sangeok + * Date : 2025. 09. 17. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 17. sangeok Initial creation + */ + + +// 매 초마다 두 개의 나무중 하나의 나무에서 열매가 떨어짐 +// 자두 1 <= t <= 1000 시간 동안 떨어짐 +// 최대 1 <= w <= 30 만큼만 움직이고 싶음 + +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int t = Integer.parseInt(st.nextToken()); + int w = Integer.parseInt(st.nextToken()); + + int[] drops = new int[t + 1]; + for (int i = 1; i <= t; i++) { + drops[i] = Integer.parseInt(br.readLine()); + } + + int[][] dp = new int[t + 1][w + 1]; + + for (int i = 1; i <= t; i++) { + for (int j = 0; j <= w; j++) { + int pos = (j % 2 == 0) ? 1 : 2; // 현재 위치 + + // 이전 값 기본 복사 (못 잡았다고 가정) + dp[i][j] = dp[i - 1][j]; + + // 현재 위치에 자두가 떨어지면 +1 + if (drops[i] == pos) { + dp[i][j] = dp[i - 1][j] + 1; + } + + // 이전에 이동한 경우도 고려 + if (j > 0) { + dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + (drops[i] == pos ? 1 : 0)); + } + } + } + + int answer = 0; + for (int j = 0; j <= w; j++) { + answer = Math.max(answer, dp[t][j]); + } + + System.out.println(answer); + } +} diff --git "a/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\274\354\240\234_\354\247\204\355\226\211\355\225\230\352\270\260.java" "b/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\274\354\240\234_\354\247\204\355\226\211\355\225\230\352\270\260.java" new file mode 100644 index 0000000..24f4b92 --- /dev/null +++ "b/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\274\354\240\234_\354\247\204\355\226\211\355\225\230\352\270\260.java" @@ -0,0 +1,82 @@ +/** + * PackageName : week21.이상억.progarmmers; + * FileName : 과제_진행하기 + * Author : sangeok + * Date : 2025. 09. 18. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 18. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public String[] solution(String[][] plans) { + int n = plans.length; + String[] answer = new String[n]; + + + int[][] infos = new int[n][3]; + for (int i = 0; i < n; i++) { + infos[i][0] = i; + infos[i][1] = htomin(plans[i][1]); + infos[i][2] = Integer.parseInt(plans[i][2]); + } + + Arrays.sort(infos, (a, b) -> a[1] - b[1]); + + Stack stack = new Stack<>(); + int idx = 0; + + for (int i = 0; i < n - 1; i++) { + int curIdx = infos[i][0]; + int start = infos[i][1]; + int time = infos[i][2]; + + int nextStart = infos[i + 1][1]; + int gap = nextStart - start; + + if (time <= gap) { + // 현재 과제 끝냄 + answer[idx++] = plans[curIdx][0]; + gap -= time; + + // 스택에서 멈춰둔 과제 이어하기 + while (!stack.isEmpty() && gap > 0) { + int[] top = stack.pop(); + if (top[1] <= gap) { + gap -= top[1]; + answer[idx++] = plans[top[0]][0]; + } else { + top[1] -= gap; + stack.push(top); + break; + } + } + } else { + // 다 못 끝내면 남은 시간을 스택에 저장 + stack.push(new int[]{curIdx, time - gap}); + } + } + + // 마지막 과제는 무조건 완료 + answer[idx++] = plans[infos[n - 1][0]][0]; + + while (!stack.isEmpty()) { + int[] top = stack.pop(); + answer[idx++] = plans[top[0]][0]; + } + + return answer; + } + + private int htomin(String s) { + String[] time = s.split(":"); + int hour = Integer.parseInt(time[0]); + int minute = Integer.parseInt(time[1]); + return hour * 60 + minute; + } +} diff --git "a/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\353\241\234\353\230\220\354\235\230_\354\265\234\352\263\240_\354\210\234\354\234\204\354\231\200_\354\265\234\354\240\200_\354\210\234\354\234\204.java" "b/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\353\241\234\353\230\220\354\235\230_\354\265\234\352\263\240_\354\210\234\354\234\204\354\231\200_\354\265\234\354\240\200_\354\210\234\354\234\204.java" new file mode 100644 index 0000000..a62f50d --- /dev/null +++ "b/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\353\241\234\353\230\220\354\235\230_\354\265\234\352\263\240_\354\210\234\354\234\204\354\231\200_\354\265\234\354\240\200_\354\210\234\354\234\204.java" @@ -0,0 +1,38 @@ +/** + * PackageName : week21.이상억.progarmmers; + * FileName : 로또의_최고_순위와_최저_순위 + * Author : sangeok + * Date : 2025. 09. 15. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 15. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int[] solution(int[] lottos, int[] win_nums) { + + int correct = 0; + int zero = 0; + + Set set = new HashSet<>(); + + for(int i : win_nums) set.add(i); + + for(int i : lottos){ + if(i==0) zero++; + else if(set.contains(i)) correct ++; + } + + int best = 7 - (correct + zero); + int worst = 7 - correct; + + if(best > 6) best = 6; + if(worst > 6) worst = 6; + + return new int[]{best,worst}; + } +} \ No newline at end of file diff --git "a/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\354\247\235\352\277\215.java" "b/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\354\247\235\352\277\215.java" new file mode 100644 index 0000000..aef599f --- /dev/null +++ "b/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\354\247\235\352\277\215.java" @@ -0,0 +1,46 @@ +/** + * PackageName : week21.이상억.progarmmers; + * FileName : 숫자_짝꿍 + * Author : sangeok + * Date : 2025. 09. 15. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 15. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public String solution(String X, String Y) { + String answer = ""; + + int[] count_x = new int[10]; + int[] count_y = new int[10]; + + for(char c : X.toCharArray()){ + count_x[c-'0']++; + } + + for(char c : Y.toCharArray()){ + count_y[c-'0']++; + } + + StringBuilder sb = new StringBuilder(); + + for(int i = 9; i>=0; i--){ + int common = Math.min(count_x[i],count_y[i]); + + for(int j = 0; j < common; j++){ + sb.append(i); + } + } + + if (sb.length() == 0) return "-1"; + if (sb.charAt(0) == '0') return "0"; + + return sb.toString(); + } +} \ No newline at end of file diff --git "a/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\355\230\274\354\236\220_\353\206\200\352\270\260\354\235\230_\353\213\254\354\235\270.java" "b/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\355\230\274\354\236\220_\353\206\200\352\270\260\354\235\230_\353\213\254\354\235\270.java" new file mode 100644 index 0000000..aed5ba6 --- /dev/null +++ "b/week21/\354\235\264\354\203\201\354\226\265/progarmmers/\355\230\274\354\236\220_\353\206\200\352\270\260\354\235\230_\353\213\254\354\235\270.java" @@ -0,0 +1,43 @@ +/** + * PackageName : week21.이상억.progarmmers; + * FileName : 혼자_놀기의_달인 + * Author : sangeok + * Date : 2025. 09. 17. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 17. sangeok Initial creation + */ + + + +// cycle 확인 -> cycle.length 최대값 + +import java.util.*; + +class Solution { + public int solution(int[] cards) { + int answer = 0; + + List list = new ArrayList<>(); + boolean[] visited = new boolean[cards.length]; + + for (int i = 0; i < cards.length; i++) { + if (!visited[i]) { + int cur = i; + int length = 0; + while (!visited[cur]) { + visited[cur] = true; + cur = cards[cur] - 1; + length++; + } + list.add(length); + } + } + list.sort((a, b) -> Integer.compare(b, a)); + + if(list.size() < 2) return 0; + return list.get(0) * list.get(1); + } +} \ No newline at end of file diff --git "a/week22/\352\260\225\354\204\261\354\232\261/baekjoon/\353\221\220_\354\210\230\354\235\230_\355\225\251.java" "b/week22/\352\260\225\354\204\261\354\232\261/baekjoon/\353\221\220_\354\210\230\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..251a0a6 --- /dev/null +++ "b/week22/\352\260\225\354\204\261\354\232\261/baekjoon/\353\221\220_\354\210\230\354\235\230_\355\225\251.java" @@ -0,0 +1,57 @@ +package week22.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +/** + * PackageName : week22.강성욱.baekjoon + * FileName : 두_수의_합 + * Author : Baekgwa + * Date : 2025-09-26 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-26 Baekgwa Initial creation + */ +public class 두_수의_합 { + public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int cnt = Integer.parseInt(br.readLine()); + int[] arr = new int[cnt]; + StringTokenizer st = new StringTokenizer(br.readLine()); + for(int i=0; i target) { + right--; + } else { + left++; + } + } + + System.out.println(result); + } + } +} diff --git "a/week22/\352\260\225\354\204\261\354\232\261/programmers/\353\251\200\354\251\241\355\225\234_\354\202\254\352\260\201\355\230\225.java" "b/week22/\352\260\225\354\204\261\354\232\261/programmers/\353\251\200\354\251\241\355\225\234_\354\202\254\352\260\201\355\230\225.java" new file mode 100644 index 0000000..5e72ede --- /dev/null +++ "b/week22/\352\260\225\354\204\261\354\232\261/programmers/\353\251\200\354\251\241\355\225\234_\354\202\254\352\260\201\355\230\225.java" @@ -0,0 +1,48 @@ +package week22.강성욱.programmers; + +/** + * PackageName : week22.강성욱.programmers + * FileName : 멀쩡한_사각형 + * Author : Baekgwa + * Date : 2025-09-26 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-26 Baekgwa Initial creation + */ +public class 멀쩡한_사각형 { + // 정사각형이면 쉬운데, 아닐 경우가 빡셈 + // 세로로 엄청 긴 직사각형이면? + // 근데 모르겠고, 일딴 패턴이 있는듯? + // 아무리 큰 직사각형이라도, 가로 세로 기준으로 최대 공약수를 구하면 미니멀한 직사각형을 구하고, 그걸 체크하면 복잡도가 확 낮아질듯? + // 예시에서 보면, X x Y = 8 x 12 + // 최대 공약수는 4? + // 그럼 가로는 2 X 3 임 + // 2X3 에서, 계산을 통해 구하면, 4개 + // 최대 공약수 만큼 곱해주면 16개 + // 원래 96 - 16 = 80 개? + // 그럼, 2 X 3 에서, 지나가는 곳을 어떻게 체크하면 좋을까? + // 가로 + 세로 - 1 + // 이게 되네? 왠지는 모름 + class Solution { + public long solution(int W, int H) { + long w = Long.valueOf(W); + long h = Long.valueOf(H); + long g = gcd(w, h); + long totalCount = w * h; + + return totalCount - (((w / g) + (h / g) - 1) * g); + } + + private long gcd(long a, long b) { + while (b > 0) { + long temp = b; + b = a % b; + a = temp; + } + return a; + } + } + +} diff --git "a/week22/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\353\263\200\355\231\230\355\225\230\352\270\260.java" "b/week22/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\353\263\200\355\231\230\355\225\230\352\270\260.java" new file mode 100644 index 0000000..f2d9f5d --- /dev/null +++ "b/week22/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\353\263\200\355\231\230\355\225\230\352\270\260.java" @@ -0,0 +1,74 @@ +package week22.강성욱.programmers; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week22.강성욱.programmers + * FileName : 숫자_변환하기 + * Author : Baekgwa + * Date : 2025-09-26 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-26 Baekgwa Initial creation + */ +public class 숫자_변환하기 { + // 음 dp 인듯? + // dp[] = [n] => n을 몇번만에 만들었는지 저장. + + class Solution { + // public static int[] dp; + + // public int solution(int x, int y, int n) { + // if (x == y) return 0; + // dp = new int[y + 1]; + // Arrays.fill(dp, Integer.MAX_VALUE); + + // calDp(x, y, n, 0); + + // return dp[y] == Integer.MAX_VALUE ? -1 : dp[y]; + // } + // + // private void calDp(int now, int target, int n, int depth) { + // if (now > target) return; + // if (depth >= dp[now]) return; + // dp[now] = depth; + + // if (now == target) return; + + // calDp(now + n, target, n, depth + 1); + // calDp(now * 2, target, n, depth + 1); + // calDp(now * 3, target, n, depth + 1); + // } + + + public int solution(int x, int y, int n) { + if (x == y) return 0; + + int[] dp = new int[y + 1]; + Arrays.fill(dp, -1); + + Queue q = new LinkedList<>(); + dp[x] = 0; + q.offer(x); + + while (!q.isEmpty()) { + int now = q.poll(); + int d = dp[now]; + + int[] nexts = {now + n, now * 2, now * 3}; + for (int nx : nexts) { + if (nx > y) continue; + if (dp[nx] != -1) continue; + dp[nx] = d + 1; + if (nx == y) return dp[nx]; + q.offer(nx); + } + } + return -1; + } + } +} diff --git "a/week22/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\353\270\224\353\241\235.java" "b/week22/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\353\270\224\353\241\235.java" new file mode 100644 index 0000000..93d5077 --- /dev/null +++ "b/week22/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\353\270\224\353\241\235.java" @@ -0,0 +1,62 @@ +package week22.강성욱.programmers; + +/** + * PackageName : week22.강성욱.programmers + * FileName : 숫자_블록 + * Author : Baekgwa + * Date : 2025-09-26 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-26 Baekgwa Initial creation + */ +public class 숫자_블록 { + // 각 자리수는 end 까지 중, 각자의 자신을 제외한 최대약수 아냐? + + class Solution { + private static final int LIMIT = 10_000_000; + + public int[] solution(long begin, long end) { + int range = (int) (end - begin + 1); + int[] result = new int[range]; + + for (int idx = 0; idx < range; idx++) { + int x = (int)begin + idx; + + if (x == 1) { + result[idx] = 0; + } else { + result[idx] = calc(x); + } + } + return result; + } + + // private int calc(int x) { + // int r = (int) Math.sqrt(x); + // for (int i = 2; i <= r; i++) { + // if (x % i != 0) continue; + // return x / i; + // } + // return 1; + // } + + private int calc(int x) { + int best = 1; + int r = (int) Math.sqrt(x); + for (int i = 2; i <= r; i++) { + if (x % i != 0) continue; + int pair = x / i; + if (pair <= LIMIT) { + return pair; + } + if (i <= LIMIT && i > best) { + best = i; + } + } + return best; + } + } + +} diff --git "a/week22/\352\260\225\354\204\261\354\232\261/programmers/\354\225\225\354\266\225.java" "b/week22/\352\260\225\354\204\261\354\232\261/programmers/\354\225\225\354\266\225.java" new file mode 100644 index 0000000..3bdd453 --- /dev/null +++ "b/week22/\352\260\225\354\204\261\354\232\261/programmers/\354\225\225\354\266\225.java" @@ -0,0 +1,64 @@ +package week22.강성욱.programmers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Stack; + +/** + * PackageName : week22.강성욱.programmers + * FileName : 압축 + * Author : Baekgwa + * Date : 2025-09-26 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-26 Baekgwa Initial creation + */ +public class 압축 { + class Solution { + public int[] solution(String msg) { + Map dic = new HashMap<>(); + + for(int i=0; i<26; i++) { + char alp = (char)('A' + i); + dic.put(String.valueOf(alp), i + 1); + } + + Stack msgStack = new Stack<>(); + for (int i = msg.length() - 1; i >= 0; i--) { + msgStack.push(String.valueOf(msg.charAt(i))); + } + + List resultList = new ArrayList<>(); + int nowIndexNumb = 27; + while (!msgStack.isEmpty()) { + // 1. msgStack에서, 최초로 dic에서 못찾는 거 나올 때까지 빼서 string 만들기 + StringBuilder keySb = new StringBuilder(); + boolean added = false; + + while (!msgStack.isEmpty()) { + String nowW = msgStack.pop(); + keySb.append(nowW); + if (!dic.containsKey(keySb.toString())) { + msgStack.push(nowW); + dic.put(keySb.toString(), nowIndexNumb++); + added = true; + break; + } + } + + String key = added + ? keySb.substring(0, keySb.length() - 1) + : keySb.toString(); + + resultList.add(dic.get(key)); + } + + // 변환 후, 응답 + return resultList.stream().mapToInt(Integer::intValue).toArray(); + } + } +} diff --git "a/week22/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220_\353\263\200\355\231\230\355\225\230\352\270\260.java" "b/week22/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220_\353\263\200\355\231\230\355\225\230\352\270\260.java" new file mode 100644 index 0000000..d89e934 --- /dev/null +++ "b/week22/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220_\353\263\200\355\231\230\355\225\230\352\270\260.java" @@ -0,0 +1,41 @@ +package week22.김나은.programmers; + +class 숫자_변환하기 { + + class Solution { + + public int solution(int x, int y, int n) { + // dp[i] = x에서 i로 가는 최소 연산 횟수 + int[] dp = new int[y + 1]; + + // x부터 y까지 숫자를 차례로 확인하면서 dp를 채움 + for (int i = x; i < y + 1; i++) { + // 시작점(x)이 아니고, 아직 도달 못한 숫자라면 + if (i != x && dp[i] == 0) { + dp[i] = -1; // 도달 불가 표시 + continue; // 이 숫자에서 확장은 못하니까 스킵 + } + + // 1) 현재 숫자 i에서 *2 + if (i * 2 <= y) { + // 아직 안 채워진 곳이면 dp[i]+1 저장 + // 이미 값이 있으면 더 작은 값으로 갱신 + dp[i * 2] = (dp[i * 2] == 0) ? dp[i] + 1 : Math.min(dp[i] + 1, dp[i * 2]); + } + + // 2) 현재 숫자 i에서 *3 + if (i * 3 <= y) { + dp[i * 3] = (dp[i * 3] == 0) ? dp[i] + 1 : Math.min(dp[i] + 1, dp[i * 3]); + } + + // 3) 현재 숫자 i에서 +n + if (i + n <= y) { + dp[i + n] = (dp[i + n] == 0) ? dp[i] + 1 : Math.min(dp[i] + 1, dp[i + n]); + } + } + + // 최종적으로 dp[y] = x에서 y까지 가는 최소 연산 횟수 + return dp[y]; + } + } +} \ No newline at end of file diff --git "a/week22/\352\271\200\353\202\230\354\235\200/programmers/\354\225\225\354\266\225.java" "b/week22/\352\271\200\353\202\230\354\235\200/programmers/\354\225\225\354\266\225.java" new file mode 100644 index 0000000..e8fb5af --- /dev/null +++ "b/week22/\352\271\200\353\202\230\354\235\200/programmers/\354\225\225\354\266\225.java" @@ -0,0 +1,60 @@ +package week22.김나은.programmers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class 압축 { + + class Solution { + + public List solution(String msg) { + + List answerList = new ArrayList<>(); + + Map map = new HashMap<>(); + + // 사전 초기화 + int index = init(map); + + // 입력 문자열을 모두 처리할 때까지 반복 + int i = 0; + while (i < msg.length()) { + int j = i + 1; + + // 사전에 등록된 가장 긴 문자열을 찾을 때까지 j를 확장 + while (j <= msg.length() && map.containsKey(msg.substring(i, j))) { + j++; + } + // (i, j-1) 구간이 사전에 있는 가장 긴 문자열 + String w = msg.substring(i, j - 1); + // 해당 문자열의 인덱스를 결과 리스트에 추가 + answerList.add(map.get(w)); + + // 다음 글자까지 붙인 새 단어 등록 (있을 때만) + if (j <= msg.length()) { + String wc = msg.substring(i, j); // w + 다음 글자 + map.put(wc, index++); + } + + // 포인터 i를 w 길이만큼 전진 (이미 처리한 부분은 건너뜀) + i += w.length(); + } + + return answerList; + } + + // 사전 초기화 메서드 + private int init(Map map) { + int index = 1; + + for (char ch = 'A'; ch <= 'Z'; ch++) { + map.put(String.valueOf(ch), index++); + } + + // 다음 새 문자열이 등록될 인덱스를 반환 (27부터 시작) + return index; + } + } +} \ No newline at end of file diff --git "a/week22/\354\235\264\354\203\201\354\226\265/backjoon/\353\221\220_\354\210\230\354\235\230_\355\225\251.java" "b/week22/\354\235\264\354\203\201\354\226\265/backjoon/\353\221\220_\354\210\230\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..e69de29 diff --git "a/week22/\354\235\264\354\203\201\354\226\265/progarmmers/\353\251\200\354\251\241\355\225\234_\354\202\254\352\260\201\355\230\225.java" "b/week22/\354\235\264\354\203\201\354\226\265/progarmmers/\353\251\200\354\251\241\355\225\234_\354\202\254\352\260\201\355\230\225.java" new file mode 100644 index 0000000..bf59cf6 --- /dev/null +++ "b/week22/\354\235\264\354\203\201\354\226\265/progarmmers/\353\251\200\354\251\241\355\225\234_\354\202\254\352\260\201\355\230\225.java" @@ -0,0 +1,20 @@ +class Solution { + public long solution(int w, int h) { + long a = (long)w; + long b = (long)h; + long g = gcd(a,b); + + return a * b - ( a + b - g); + + } + + + public long gcd(long a, long b){ + while( b!= 0 ){ + long temp = a % b; + a = b ; + b = temp; + } + return a; + } +} \ No newline at end of file diff --git "a/week22/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\353\263\200\355\231\230\355\225\230\352\270\260.java" "b/week22/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\353\263\200\355\231\230\355\225\230\352\270\260.java" new file mode 100644 index 0000000..b680679 --- /dev/null +++ "b/week22/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\353\263\200\355\231\230\355\225\230\352\270\260.java" @@ -0,0 +1,34 @@ +import java.util.*; + +class Solution { + public int solution(int x, int y, int n) { + int answer = 0; + + Queue q = new LinkedList<>(); + Set visited = new HashSet<>(); + + q.add(new int[]{x,0}); + visited.add(x); + + while(!q.isEmpty()){ + int[] cur = q.poll(); + int value = cur[0]; + int count = cur[1]; + + if(value == y){ + return count; + } + + int[] next_value = {value + n, value * 2, value * 3}; + + for(int next : next_value){ + if(next <= y && !visited.contains(next)){ + visited.add(next); + q.add(new int[]{next, count + 1}); + } + } + } + + return -1; + } +} \ No newline at end of file diff --git "a/week22/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\353\270\224\353\241\235.java" "b/week22/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\353\270\224\353\241\235.java" new file mode 100644 index 0000000..7b78978 --- /dev/null +++ "b/week22/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\353\270\224\353\241\235.java" @@ -0,0 +1,35 @@ +import java.util.*; + +class Solution { + public int[] solution(long begin, long end) { + int size = (int)(end - begin + 1); + int[] answer = new int[size]; + + for (long i = begin; i <= end; i++) { + answer[(int)(i - begin)] = block_number(i); + } + return answer; + } + + public int block_number(long n) { + if (n == 1) return 0; + + int result = 1; + + for (long d = 2; d * d <= n; d++) { + if (n % d == 0) { + long pair = n / d; + + if (d <= 10_000_000) { + result = Math.max(result, (int)d); + } + + if (pair <= 10_000_000) { + // 가장 큰 약수를 바로 찾았으므로 반환 + return (int)pair; + } + } + } + return result; + } +} diff --git "a/week23/\352\260\225\354\204\261\354\232\261/baekjoon/\352\260\200\354\236\245_\352\270\264_\354\246\235\352\260\200\355\225\230\353\212\224_\353\266\200\353\266\204_\354\210\230\354\227\264_4.java" "b/week23/\352\260\225\354\204\261\354\232\261/baekjoon/\352\260\200\354\236\245_\352\270\264_\354\246\235\352\260\200\355\225\230\353\212\224_\353\266\200\353\266\204_\354\210\230\354\227\264_4.java" new file mode 100644 index 0000000..463bf82 --- /dev/null +++ "b/week23/\352\260\225\354\204\261\354\232\261/baekjoon/\352\260\200\354\236\245_\352\270\264_\354\246\235\352\260\200\355\225\230\353\212\224_\353\266\200\353\266\204_\354\210\230\354\227\264_4.java" @@ -0,0 +1,67 @@ +package week23.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Stack; +import java.util.StringTokenizer; + +/** + * PackageName : week23.강성욱.baekjoon + * FileName : 가장_긴_증가하는_부분_수열_4 + * Author : Baekgwa + * Date : 2025-10-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-10-03 Baekgwa Initial creation + */ +public class 가장_긴_증가하는_부분_수열_4 { + public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine()); + + int[] arr = new int[n]; + int[] dp = new int[n]; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + for (int i = 0; i < n; i++) { + dp[i] = 1; + for (int j = 0; j < i; j++) { + if (arr[j] < arr[i] && dp[i] < dp[j] + 1) { + dp[i] = dp[j] + 1; + } + } + } + + int maxLength = 0; + for (int len : dp) { + if (len > maxLength) { + maxLength = len; + } + } + System.out.println(maxLength); + + Stack stack = new Stack<>(); + int currentLength = maxLength; + for (int i = n - 1; i >= 0; i--) { + if (dp[i] == currentLength) { + stack.push(arr[i]); + currentLength--; + } + } + + StringBuilder sb = new StringBuilder(); + while (!stack.isEmpty()) { + sb.append(stack.pop()).append(" "); + } + System.out.println(sb.toString().trim()); + } + } +} diff --git "a/week23/\352\260\225\354\204\261\354\232\261/baekjoon/\353\262\214\354\247\221.java" "b/week23/\352\260\225\354\204\261\354\232\261/baekjoon/\353\262\214\354\247\221.java" new file mode 100644 index 0000000..02f8eeb --- /dev/null +++ "b/week23/\352\260\225\354\204\261\354\232\261/baekjoon/\353\262\214\354\247\221.java" @@ -0,0 +1,37 @@ +package week23.강성욱.baekjoon; + +import java.io.IOException; +import java.util.Scanner; + +/** + * PackageName : week23.강성욱.baekjoon + * FileName : 벌집 + * Author : Baekgwa + * Date : 2025-09-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-29 Baekgwa Initial creation + */ +public class 벌집 { + // 입력값에 따라서 범위가 지정됨 + // 1 -> 2 ~ 7 -> 8 ~ 19 ... + // 1 -> 6개 -> 12개 -> 18개 ... 6개씩 늘어남 + public class Main { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + long N = sc.nextLong(); + sc.close(); + + long cnt = 1; + long now = 1; + while(now < N) { + now += cnt * 6; + cnt++; + } + + System.out.println(cnt); + } + } +} diff --git "a/week23/\352\260\225\354\204\261\354\232\261/baekjoon/\354\242\214\355\221\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" "b/week23/\352\260\225\354\204\261\354\232\261/baekjoon/\354\242\214\355\221\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..08d5eec --- /dev/null +++ "b/week23/\352\260\225\354\204\261\354\232\261/baekjoon/\354\242\214\355\221\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" @@ -0,0 +1,59 @@ +package week23.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +/** + * PackageName : week23.강성욱.baekjoon + * FileName : 좌표_정렬하기 + * Author : Baekgwa + * Date : 2025-10-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-10-03 Baekgwa Initial creation + */ +public class 좌표_정렬하기 { + public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + int N = Integer.parseInt(br.readLine()); + + List pointList = new ArrayList<>(); + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + pointList.add(new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()))); + } + + pointList.sort((a, b) -> { + if (a.x == b.x) { + return a.y - b.y; + } + return a.x - b.x; + }); + + for (Point p : pointList) { + sb.append(p.x).append(" ").append(p.y).append("\n"); + } + + System.out.print(sb); + } + + public static class Point { + private int x; + private int y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + } + } +} diff --git "a/week23/\352\260\225\354\204\261\354\232\261/programmers/\354\210\230\354\213\235_\354\265\234\353\214\200\355\231\224.java" "b/week23/\352\260\225\354\204\261\354\232\261/programmers/\354\210\230\354\213\235_\354\265\234\353\214\200\355\231\224.java" new file mode 100644 index 0000000..623f2e8 --- /dev/null +++ "b/week23/\352\260\225\354\204\261\354\232\261/programmers/\354\210\230\354\213\235_\354\265\234\353\214\200\355\231\224.java" @@ -0,0 +1,104 @@ +package week23.강성욱.programmers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * PackageName : week23.강성욱.programmers + * FileName : 수식_최대화 + * Author : Baekgwa + * Date : 2025-10-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-10-03 Baekgwa Initial creation + */ +public class 수식_최대화 { + class Solution { + public long solution(String expression) { + //계산식을 숫자부분과, 기호 부분으로 쪼개야됨. + List numberList = new ArrayList<>(); + List expressList = new ArrayList<>(); + StringBuilder sb = new StringBuilder(); + + for(String s : expression.split("")){ + if(s.equals("+") || s.equals("-") || s.equals("*")) { + numberList.add(Long.parseLong(sb.toString())); + sb = new StringBuilder(); + expressList.add(s); + continue; + } + + sb.append(s); + } + numberList.add(Long.parseLong(sb.toString())); //마지막 숫자 넣어야됨. + + // +, -, * 3! 순열 만들기 + List> orders = Arrays.asList( + Arrays.asList("+", "-", "*"), + Arrays.asList("+", "*", "-"), + Arrays.asList("-", "+", "*"), + Arrays.asList("-", "*", "+"), + Arrays.asList("*", "+", "-"), + Arrays.asList("*", "-", "+") + ); + + long result = 0; + for (List orderList : orders) { + result = Math.max(result, Math.abs(calc(orderList, new ArrayList<>(numberList), new ArrayList<>(expressList)))); + } + + return result; + } + + // // order => 우선순위 리스트 + // private long calc(List orderList, List numberList, List expressList) { + // for (String order : orderList) { + // for (int i = 0; i < expressList.size(); i++) { + // if (expressList.get(i).equals(order)) { + // long left = numberList.remove(i); + // long right = numberList.remove(i); + // long newResult = calculateResult(left, right, order); + // numberList.add(i, newResult); //원래 위치 그대로에 넣어야됨 + // expressList.remove(i); + // } else { + // i++; + // } + // } + // } + + // return numberList.get(0); + // } + + private long calc(List orderList, List numberList, List expressList) { + for (String curOp : orderList) { + while (expressList.contains(curOp)) { + for (int i = 0; i < expressList.size(); i++) { + if (expressList.get(i).equals(curOp)) { + long left = numberList.remove(i); + long right = numberList.remove(i); + long newResult = calculateResult(left, right, curOp); + numberList.add(i, newResult); + expressList.remove(i); + break; + } + } + } + } + + return numberList.get(0); + } + + // 연산 처리 + private long calculateResult(long left, long right, String order) { + switch (order) { + case "+": return left + right; + case "-": return left - right; + case "*": return left * right; + } + return 0; + } + } +} diff --git "a/week23/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\353\252\250\355\213\260\354\275\230_\355\225\240\354\235\270\355\226\211\354\202\254.java" "b/week23/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\353\252\250\355\213\260\354\275\230_\355\225\240\354\235\270\355\226\211\354\202\254.java" new file mode 100644 index 0000000..1ff392b --- /dev/null +++ "b/week23/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\353\252\250\355\213\260\354\275\230_\355\225\240\354\235\270\355\226\211\354\202\254.java" @@ -0,0 +1,74 @@ +package week23.강성욱.programmers; + +/** + * PackageName : week23.강성욱.programmers + * FileName : 이모티콘_할인행사 + * Author : Baekgwa + * Date : 2025-10-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-10-03 Baekgwa Initial creation + */ +public class 이모티콘_할인행사 { + class Solution { + private static final int[] DISCOUNT_RATES = {10, 20, 30, 40}; + private int maxPlusSubscribers = -1; + private int maxSalesAmount = -1; + + public int[] solution(int[][] users, int[] emoticons) { + int numEmoticons = emoticons.length; + int[] assignedDiscountIndices = new int[numEmoticons]; + + // dfs + findBestCombination(0, users, emoticons, assignedDiscountIndices); + + return new int[]{maxPlusSubscribers, maxSalesAmount}; + } + + private void findBestCombination(int emoticonIndex, int[][] users, int[] emoticons, int[] assignedDiscountIndices) { + if (emoticonIndex == emoticons.length) { + calculateOutcome(users, emoticons, assignedDiscountIndices); + return; + } + + for (int rateIndex = 0; rateIndex < 4; rateIndex++) { + assignedDiscountIndices[emoticonIndex] = rateIndex; + findBestCombination(emoticonIndex + 1, users, emoticons, assignedDiscountIndices); + } + } + + private void calculateOutcome(int[][] users, int[] emoticons, int[] assignedDiscountIndices) { + int currentPlusSubscribers = 0; + int currentSalesAmount = 0; + + for (int[] user : users) { + int userRequiredDiscount = user[0]; + int userSubscriptionThreshold = user[1]; + int userPurchaseTotal = 0; + + for (int i = 0; i < emoticons.length; i++) { + int currentDiscountRate = DISCOUNT_RATES[assignedDiscountIndices[i]]; + + if (currentDiscountRate >= userRequiredDiscount) { + userPurchaseTotal += emoticons[i] * (100 - currentDiscountRate) / 100; + } + } + + if (userPurchaseTotal >= userSubscriptionThreshold) { + currentPlusSubscribers++; + } else { + currentSalesAmount += userPurchaseTotal; + } + } + + if (currentPlusSubscribers > maxPlusSubscribers) { + maxPlusSubscribers = currentPlusSubscribers; + maxSalesAmount = currentSalesAmount; + } else if (currentPlusSubscribers == maxPlusSubscribers && currentSalesAmount > maxSalesAmount) { + maxSalesAmount = currentSalesAmount; + } + } + } +} diff --git "a/week23/\352\271\200\353\202\230\354\235\200/baekjoon/\353\262\214\354\247\221.java" "b/week23/\352\271\200\353\202\230\354\235\200/baekjoon/\353\262\214\354\247\221.java" new file mode 100644 index 0000000..dfc2e25 --- /dev/null +++ "b/week23/\352\271\200\353\202\230\354\235\200/baekjoon/\353\262\214\354\247\221.java" @@ -0,0 +1,45 @@ +package week23.김나은.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class 벌집 { + + public class Main { + + public static void main(String[] args) throws IOException { + // BufferedReader: 표준 입력(System.in)으로부터 한 줄씩 빠르게 읽기 + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + // 찾고자 하는 방 번호 n 입력 + int n = Integer.parseInt(br.readLine()); + + // 벌집의 시작점 (1번 방부터 시작) + int start = 1; + + // 몇 겹(층)째인지 세기 위한 변수 (0부터 시작) + int cnt = 0; + + // 무한 루프를 돌면서 겹을 늘려감 + while (true) { + // start는 현재 겹의 마지막 번호 + // cnt가 0일 때는 start=1 (첫 방) + // cnt가 1일 때는 start=7 (2겹의 마지막 방) + // cnt가 2일 때는 start=19 (3겹의 마지막 방) + start += (6 * cnt); + + // 현재 겹의 마지막 번호가 n 이상이면 그 겹에 속함 + if (start >= n) { + break; + } else { + // 아직 도달 못했으면 겹을 하나 늘림 + cnt++; + } + } + + // 겹 수(cnt는 0부터 세므로 +1) + System.out.println(cnt + 1); + } + } +} \ No newline at end of file diff --git "a/week23/\352\271\200\353\202\230\354\235\200/baekjoon/\354\242\214\355\221\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" "b/week23/\352\271\200\353\202\230\354\235\200/baekjoon/\354\242\214\355\221\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..57ef912 --- /dev/null +++ "b/week23/\352\271\200\353\202\230\354\235\200/baekjoon/\354\242\214\355\221\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" @@ -0,0 +1,51 @@ +package week23.김나은.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.Comparator; +import java.util.StringTokenizer; + +public class 좌표_정렬하기 { + + public class Main { + + public static void main(String[] args) throws IOException { + // BufferedReader: 표준 입력(System.in)으로부터 한 줄씩 빠르게 읽기 + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + // 좌표 개수 N 입력 + int N = Integer.parseInt(br.readLine()); + + // 2차원 배열로 좌표 저장 + int[][] arr = new int[N][2]; + + StringTokenizer st; + // N개의 좌표를 입력받아 배열에 저장 + for (int i = 0; i < N; i++) { + st = new StringTokenizer(br.readLine()); + arr[i][0] = Integer.parseInt(st.nextToken()); // x 좌표 + arr[i][1] = Integer.parseInt(st.nextToken()); // y 좌표 + } + + // 좌표 정렬 (Comparator 사용) + Arrays.sort(arr, new Comparator() { + @Override + public int compare(int[] e1, int[] e2) { + if (e1[0] == e2[0]) { // 첫번째 원소가 같다면 두 번째 원소끼리 비교 + return Integer.compare(e1[1], e2[1]); + } else { // x좌표 오름차순 정렬 + return Integer.compare(e1[0], e2[0]); + } + } + }); + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < N; i++) { + sb.append(arr[i][0] + " " + arr[i][1]).append('\n'); + } + System.out.println(sb); + } + } +} \ No newline at end of file diff --git "a/week23/\354\235\264\354\203\201\354\226\265/backjoon/\352\260\200\354\236\245_\352\270\264_\354\246\235\352\260\200\355\225\230\353\212\224_\353\266\200\353\266\204_\354\210\230\354\227\264_4.java" "b/week23/\354\235\264\354\203\201\354\226\265/backjoon/\352\260\200\354\236\245_\352\270\264_\354\246\235\352\260\200\355\225\230\353\212\224_\353\266\200\353\266\204_\354\210\230\354\227\264_4.java" new file mode 100644 index 0000000..629610d --- /dev/null +++ "b/week23/\354\235\264\354\203\201\354\226\265/backjoon/\352\260\200\354\236\245_\352\270\264_\354\246\235\352\260\200\355\225\230\353\212\224_\353\266\200\353\266\204_\354\210\230\354\227\264_4.java" @@ -0,0 +1,49 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + int[] sequence_array = new int[N]; + int[] dp = new int[N]; + int[] prev = new int[N]; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + sequence_array[i] = Integer.parseInt(st.nextToken()); + dp[i] = 1; + prev[i] = -1; + } + + for (int i = 0; i < N; i++) { + for (int j = 0; j < i; j++) { + if (sequence_array[i] > sequence_array[j] && dp[j] + 1 > dp[i]) { + dp[i] = dp[j] + 1; + prev[i] = j; + } + } + } + + int maxlen = 0; + int last = 0; + + for (int i = 0; i < N; i++) { + if (dp[i] > maxlen) { + maxlen = dp[i]; + last = i; + } + } + + LinkedList list = new LinkedList<>(); + while (last != -1) { + list.addFirst(sequence_array[last]); + last = prev[last]; + } + + System.out.println(maxlen); + for (int x : list) System.out.print(x + " "); + } +} diff --git "a/week23/\354\235\264\354\203\201\354\226\265/backjoon/\353\262\214\354\247\221.java" "b/week23/\354\235\264\354\203\201\354\226\265/backjoon/\353\262\214\354\247\221.java" new file mode 100644 index 0000000..f555b50 --- /dev/null +++ "b/week23/\354\235\264\354\203\201\354\226\265/backjoon/\353\262\214\354\247\221.java" @@ -0,0 +1,23 @@ +// N이 주어졌을 때 최소 개수 방을 지나서 갈 때 몇개의 방을 지나는지 ? +// 끝방 7,19,37,61 ? +// 6 ( 1 + 2 + .. + n - 1 ) + 1? -> 3 n(n-1) + 1 +// +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine()); + + int layer = 1; + int end = 1; // 현재 층의 마지막 방 번호 + + while (n > end) { + layer++; + end = 3*layer*(layer-1) + 1; // layer 기준으로 갱신 + } + System.out.println(layer); + } +} diff --git "a/week23/\354\235\264\354\203\201\354\226\265/backjoon/\354\203\210\353\241\234\354\232\264_\352\262\214\354\236\2042.java" "b/week23/\354\235\264\354\203\201\354\226\265/backjoon/\354\203\210\353\241\234\354\232\264_\352\262\214\354\236\2042.java" new file mode 100644 index 0000000..b4abad6 --- /dev/null +++ "b/week23/\354\235\264\354\203\201\354\226\265/backjoon/\354\203\210\353\241\234\354\232\264_\352\262\214\354\236\2042.java" @@ -0,0 +1,12 @@ +import java.util.*; +import java.io.*; + + +public class Main { + public static void main(String[] args) throws IOException{ + BufferedReader br = new BufferedReader(new InputStreamRedaer(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + + } +} \ No newline at end of file diff --git "a/week23/\354\235\264\354\203\201\354\226\265/backjoon/\354\242\214\355\221\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" "b/week23/\354\235\264\354\203\201\354\226\265/backjoon/\354\242\214\355\221\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..d6505ce --- /dev/null +++ "b/week23/\354\235\264\354\203\201\354\226\265/backjoon/\354\242\214\355\221\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" @@ -0,0 +1,28 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + int[][] points = new int[N][2]; + + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + points[i][0] = Integer.parseInt(st.nextToken()); // x 좌표 + points[i][1] = Integer.parseInt(st.nextToken()); // y 좌표 + } + + Arrays.sort(points, (a1, a2) -> { + if (a1[0] == a2[0]) { + return a1[1] - a2[1]; + } + return a1[0] - a2[0]; + }); + + for (int i = 0; i < N; i++) { + System.out.println(points[i][0] + " " + points[i][1]); + } + } +} diff --git "a/week23/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\230\354\213\235_\354\265\234\353\214\200\355\231\224.java" "b/week23/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\230\354\213\235_\354\265\234\353\214\200\355\231\224.java" new file mode 100644 index 0000000..6d44473 --- /dev/null +++ "b/week23/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\230\354\213\235_\354\265\234\353\214\200\355\231\224.java" @@ -0,0 +1,61 @@ +import java.util.*; + +class Solution { + public long solution(String expression) { + + List numbers = new ArrayList<>(); + List operators = new ArrayList<>(); + + StringBuilder sb = new StringBuilder(); + for (char c : expression.toCharArray()) { + if (c == '+' || c == '-' || c == '*') { + numbers.add(Long.parseLong(sb.toString())); + sb.setLength(0); // 숫자 버퍼 초기화 + operators.add(String.valueOf(c)); + } else { + sb.append(c); + } + } + numbers.add(Long.parseLong(sb.toString())); // 마지막 숫자 추가 + + // 연산자 우선순위 경우의 수 + String[][] orders = { + {"+", "-", "*"}, + {"+", "*", "-"}, + {"-", "+", "*"}, + {"-", "*", "+"}, + {"*", "+", "-"}, + {"*", "-", "+"} + }; + + long answer = 0; + for (String[] order : orders) { + answer = Math.max(answer, + Math.abs(calc(new ArrayList<>(numbers), new ArrayList<>(operators), order))); + } + return answer; + } + + // 특정 우선순위에 따라 계산 + private long calc(List nums, List ops, String[] order) { + for (String op : order) { + for (int i = 0; i < ops.size(); ) { + if (ops.get(i).equals(op)) { + long a = nums.remove(i); + long b = nums.remove(i); + nums.add(i, operate(a, b, op)); + ops.remove(i); + } else { + i++; + } + } + } + return nums.get(0); + } + + private long operate(long a, long b, String op) { + if (op.equals("+")) return a + b; + if (op.equals("-")) return a - b; + return a * b; + } +} diff --git "a/week23/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\353\252\250\355\213\260\354\275\230_\355\225\240\354\235\270\355\226\211\354\202\254.java" "b/week23/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\353\252\250\355\213\260\354\275\230_\355\225\240\354\235\270\355\226\211\354\202\254.java" new file mode 100644 index 0000000..e1f891b --- /dev/null +++ "b/week23/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\353\252\250\355\213\260\354\275\230_\355\225\240\354\235\270\355\226\211\354\202\254.java" @@ -0,0 +1,58 @@ +// 서비스 가입자 최대 > 판매액 최대 + +// n 명의 사용자에게 이모티콘 m 개를 할인하여 판매 +// 이모티콘 마다 할인율 다를 수 있음 10 20 30 40 중 ㅏ한 +// 구매 비용의 합이 일정 가격 이상이 된다면 이모티콘 구매 모두 취소 플러스 가입 + +class Solution { + static int[] discounts = {10, 20, 30, 40}; + static int maxSubs = 0; // 최대 가입자 수 + static int maxSales = 0; // 최대 매출 + + public int[] solution(int[][] users, int[] emoticons) { + dfs(0, new int[emoticons.length], users, emoticons); + return new int[]{maxSubs, maxSales}; + } + + private void dfs(int depth, int[] selected, int[][] users, int[] emoticons) { + if (depth == emoticons.length) { + evaluate(selected, users, emoticons); + return; + } + + for (int d : discounts) { + selected[depth] = d; + dfs(depth + 1, selected, users, emoticons); + } + } + + // 가입자 수와 매출 계산 + private void evaluate(int[] selected, int[][] users, int[] emoticons) { + int subs = 0; + int sales = 0; + + for (int[] user : users) { + int minDiscount = user[0]; + int limit = user[1]; + int total = 0; + + for (int i = 0; i < emoticons.length; i++) { + if (selected[i] >= minDiscount) { + total += emoticons[i] * (100 - selected[i]) / 100; + } + } + + if (total >= limit) { + subs++; // 이모티콘 플러스 가입 + } else { + sales += total; + } + } + + // 우선순위 가입자 수 → 매출 + if (subs > maxSubs || (subs == maxSubs && sales > maxSales)) { + maxSubs = subs; + maxSales = sales; + } + } +} diff --git "a/week24/\352\260\225\354\204\261\354\232\261/baekjoon/\353\206\200\354\235\264\352\263\265\354\233\220.java" "b/week24/\352\260\225\354\204\261\354\232\261/baekjoon/\353\206\200\354\235\264\352\263\265\354\233\220.java" new file mode 100644 index 0000000..fdf8dfd --- /dev/null +++ "b/week24/\352\260\225\354\204\261\354\232\261/baekjoon/\353\206\200\354\235\264\352\263\265\354\233\220.java" @@ -0,0 +1,89 @@ +package week24.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week24.강성욱.baekjoon + * FileName : 놀이공원 + * Author : Baekgwa + * Date : 2025-10-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-10-17 Baekgwa Initial creation + */ +public class 놀이공원 { + /** + * PackageName : baekgwa + * FileName : ${NAME} + * Author : Baekgwa + * Date : 2025-09-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-11 Baekgwa Initial creation + */ + + public class Main { + static long N; + static int M; + static int[] timeArray; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + N = Long.parseLong(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + timeArray = new int[M]; + st = new StringTokenizer(br.readLine()); + int maxT = 0; + for (int i = 0; i < M; i++) { + timeArray[i] = Integer.parseInt(st.nextToken()); + if (timeArray[i] > maxT) maxT = timeArray[i]; + } + + // 시작 순간 처리 + if (N <= M) { + System.out.println(N); + return; + } + + // 이분탐색 + long lo = 0, hi = (long) maxT * N; + while (lo < hi) { + long mid = (lo + hi) / 2; + if (served(mid) >= N) hi = mid; + else lo = mid + 1; + } + long time = lo; + + long before = served(time - 1); + long remain = N - before; + + for (int i = 0; i < M; i++) { + if (time % timeArray[i] == 0) { // 시간 T에 막 비는 기구 + remain--; + if (remain == 0) { + System.out.println(i + 1); + return; + } + } + } + } + + // time 안에 태운 사람수를 구하는 함수. + // 초기에 0초일때 한번 다 타므로, M 으로 초기화 + static long served(long time) { + long sum = M; + for (int i = 0; i < M; i++) { + sum += time / timeArray[i]; + } + return sum; + } + } +} diff --git "a/week24/\352\260\225\354\204\261\354\232\261/baekjoon/\353\223\243\353\263\264\354\236\241.java" "b/week24/\352\260\225\354\204\261\354\232\261/baekjoon/\353\223\243\353\263\264\354\236\241.java" new file mode 100644 index 0000000..8e33712 --- /dev/null +++ "b/week24/\352\260\225\354\204\261\354\232\261/baekjoon/\353\223\243\353\263\264\354\236\241.java" @@ -0,0 +1,64 @@ +package week24.강성욱.baekjoon; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Scanner; +import java.util.Set; +import java.util.StringTokenizer; + +/** + * PackageName : week24.강성욱.baekjoon + * FileName : 듣보잡 + * Author : Baekgwa + * Date : 2025-10-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-10-17 Baekgwa Initial creation + */ +public class 듣보잡 { + /** + * PackageName : baekgwa + * FileName : ${NAME} + * Author : Baekgwa + * Date : 2025-09-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-11 Baekgwa Initial creation + */ + + public class Main { + public static void main(String[] args) { + Set set = new HashSet<>(); + Scanner sc = new Scanner(System.in); + + StringTokenizer st = new StringTokenizer(sc.nextLine()); + int N = Integer.parseInt(st.nextToken()); + int M = Integer.parseInt(st.nextToken()); + + for (int i=0; i list = new ArrayList<>(); + for (int i=0; i stack = new ArrayDeque<>(); + + int cnt = sc.nextInt(); + + for(int i=0; i stack = new ArrayDeque<>(); + + int i = 0; + // 주어진 명령 개수(capacity)만큼 반복 수행 + while (i < capacity) { + // 한 줄을 공백 기준으로 나누기 + st = new StringTokenizer(br.readLine()); + switch (st.nextToken()) { + case "push": + // 정수 X를 스택 맨 위에 추가 + stack.push(Integer.parseInt(st.nextToken())); + break; + case "pop": + // 스택 맨 위에 있는 정수를 빼고, 그 수를 출력 + // 만약 스택에 들어있는 정수가 없는 경우 -1 출력 + System.out.println(stack.isEmpty() ? -1 : stack.pop()); + break; + case "size": + // 스택에 들어있는 정수의 개수 출력 + System.out.println(stack.size()); + break; + case "empty": + // 스택이 비어있으면 1, 아니면 0 출력 + System.out.println(stack.isEmpty() ? 1 : 0); + break; + case "top": + // 스택 맨 위에 있는 정수를 출력 + // 만약 스택에 들어있는 정수가 없는 경우 -1 출력 + System.out.println(stack.isEmpty() ? -1 : stack.peek()); + break; + } + i++; + } + br.close(); + } + } +} diff --git "a/week24/\354\235\264\354\203\201\354\226\265/backjoon/\353\223\243\353\263\264\354\236\241.java" "b/week24/\354\235\264\354\203\201\354\226\265/backjoon/\353\223\243\353\263\264\354\236\241.java" new file mode 100644 index 0000000..ee45f84 --- /dev/null +++ "b/week24/\354\235\264\354\203\201\354\226\265/backjoon/\353\223\243\353\263\264\354\236\241.java" @@ -0,0 +1,35 @@ +// + +import java.util.*; +import java.io.*; + +public class Main{ + public static void main(String[] args) throws IOException{ + + 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()); + + + Set unheard = new HashSet<>(); + for(int i = 0; i < N; i++) { + unheard.add(br.readLine()); + } + + List result = new ArrayList<>(); + for(int i = 0; i < M; i++){ + String name = br.readLine(); + if(unheard.contains(name)) { + result.add(name); + } + } + + Collections.sort(result); + System.out.println(result.size()); + for(String name : result){ + System.out.println(name); + } + } +} \ No newline at end of file diff --git "a/week24/\354\235\264\354\203\201\354\226\265/backjoon/\354\204\244\355\203\225_\353\260\260\353\213\254.java" "b/week24/\354\235\264\354\203\201\354\226\265/backjoon/\354\204\244\355\203\225_\353\260\260\353\213\254.java" new file mode 100644 index 0000000..b69afa6 --- /dev/null +++ "b/week24/\354\235\264\354\203\201\354\226\265/backjoon/\354\204\244\355\203\225_\353\260\260\353\213\254.java" @@ -0,0 +1,22 @@ +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + int count = 0; + + while (N >= 0) { + if (N % 5 == 0) { + count += N / 5; + System.out.println(count); + return; + } + N -= 3; + count++; + } + + System.out.println(-1); + } +} diff --git "a/week24/\354\235\264\354\203\201\354\226\265/backjoon/\354\212\244\355\203\235.java" "b/week24/\354\235\264\354\203\201\354\226\265/backjoon/\354\212\244\355\203\235.java" new file mode 100644 index 0000000..7de56e3 --- /dev/null +++ "b/week24/\354\235\264\354\203\201\354\226\265/backjoon/\354\212\244\355\203\235.java" @@ -0,0 +1,38 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + int N = Integer.parseInt(br.readLine()); + Stack stack = new Stack<>(); + + for (int i = 0; i < N; i++) { + String command = br.readLine(); + + if (command.startsWith("push")) { + // push X + int value = Integer.parseInt(command.split(" ")[1]); + stack.push(value); + } + else if (command.equals("pop")) { + if (stack.isEmpty()) sb.append(-1).append('\n'); + else sb.append(stack.pop()).append('\n'); + } + else if (command.equals("size")) { + sb.append(stack.size()).append('\n'); + } + else if (command.equals("empty")) { + sb.append(stack.isEmpty() ? 1 : 0).append('\n'); + } + else if (command.equals("top")) { + if (stack.isEmpty()) sb.append(-1).append('\n'); + else sb.append(stack.peek()).append('\n'); + } + } + + System.out.print(sb); + } +} diff --git "a/week24/\354\235\264\354\203\201\354\226\265/backjoon/\354\262\264\354\212\244\355\214\220_\353\213\244\354\213\234_\354\271\240\355\225\230\352\270\260.java" "b/week24/\354\235\264\354\203\201\354\226\265/backjoon/\354\262\264\354\212\244\355\214\220_\353\213\244\354\213\234_\354\271\240\355\225\230\352\270\260.java" new file mode 100644 index 0000000..a09b6ec --- /dev/null +++ "b/week24/\354\235\264\354\203\201\354\226\265/backjoon/\354\262\264\354\212\244\355\214\220_\353\213\244\354\213\234_\354\271\240\355\225\230\352\270\260.java" @@ -0,0 +1,51 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws IOException { + 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()); + + char[][] board = new char[N][M]; + for (int i = 0; i < N; i++) { + board[i] = br.readLine().toCharArray(); + } + + int answer = Integer.MAX_VALUE; + + // 모든 8x8 구간을 완전탐색 + for (int i = 0; i <= N - 8; i++) { + for (int j = 0; j <= M - 8; j++) { + answer = Math.min(answer, getRepaintCount(board, i, j)); + } + } + + System.out.println(answer); + } + + // 특정 구간에서 다시 칠해야 하는 최소 횟수 계산 + private static int getRepaintCount(char[][] board, int startRow, int startCol) { + int repaintW = 0; // 왼쪽 위가 W인 경우 + int repaintB = 0; // 왼쪽 위가 B인 경우 + + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + char current = board[startRow + i][startCol + j]; + + // (i + j)가 짝수면 시작 색과 같아야 함 + if ((i + j) % 2 == 0) { + if (current != 'W') repaintW++; + if (current != 'B') repaintB++; + } else { // (i + j)가 홀수면 반대색이어야 함 + if (current != 'B') repaintW++; + if (current != 'W') repaintB++; + } + } + } + + return Math.min(repaintW, repaintB); + } +} diff --git "a/week25/\352\260\225\354\204\261\354\232\261/baekjoon/\353\202\230\353\254\264_\355\203\210\354\266\234.java" "b/week25/\352\260\225\354\204\261\354\232\261/baekjoon/\353\202\230\353\254\264_\355\203\210\354\266\234.java" new file mode 100644 index 0000000..4895479 --- /dev/null +++ "b/week25/\352\260\225\354\204\261\354\232\261/baekjoon/\353\202\230\353\254\264_\355\203\210\354\266\234.java" @@ -0,0 +1,89 @@ +package week25.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +/** + * PackageName : week25.강성욱.baekjoon + * FileName : 나무_탈출 + * Author : Baekgwa + * Date : 2025-10-23 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-10-23 Baekgwa Initial creation + */ +public class 나무_탈출 { + /** + * PackageName : baekgwa + * FileName : ${NAME} + * Author : Baekgwa + * Date : 2025-09-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-11 Baekgwa Initial creation + */ + + // 리프노드에서, 루트 노드까지 각각 올라가는 개수의 합을 구해서 + // 짝수거나 홀수에 따라서 승자 패자가 결정되는 게임 아닌가? + // 간선을 ㄴ일딴 arrayList 이중배열로 확인 + // 1번 노드는 루트노드 확정이니깐, 1부터 찾다가 자식이 없는 노드를 발견하면 그게 리프노드. + // 그리고 그때 depth 가 리프 -> 루트 까지의 거리임 + public class Main { + + public static List> tree; + public static int totalDepthSum = 0; + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + tree = new ArrayList<>(); + for (int i = 0; i <= N; i++) { + tree.add(new ArrayList<>()); + } + + for (int i = 0; i < N - 1; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + tree.get(a).add(b); + tree.get(b).add(a); + } + + dfs(1, 0, 0); + + if (totalDepthSum % 2 == 1) { + System.out.println("Yes"); + } else { + System.out.println("No"); + } + } + + public static void dfs(int current, int parent, int depth) { + + int childCount = 0; + + for (int neighbor : tree.get(current)) { + if (neighbor == parent) { + continue; + } + + childCount++; + dfs(neighbor, current, depth + 1); + } + + if (childCount == 0) { + totalDepthSum += depth; + } + } + } +} diff --git "a/week25/\352\260\225\354\204\261\354\232\261/baekjoon/\353\217\231\354\240\204.java" "b/week25/\352\260\225\354\204\261\354\232\261/baekjoon/\353\217\231\354\240\204.java" new file mode 100644 index 0000000..d3e1147 --- /dev/null +++ "b/week25/\352\260\225\354\204\261\354\232\261/baekjoon/\353\217\231\354\240\204.java" @@ -0,0 +1,58 @@ +package week25.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week25.강성욱.baekjoon + * FileName : 동전 + * Author : Baekgwa + * Date : 2025-10-23 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-10-23 Baekgwa Initial creation + */ +public class 동전 { + // 음, 각 조건으로 분기가 될 수 있음. + // [1, 2] 두개로 1000을 만들기. + // 그럼 각 조건에서 1 추가? 2 추가? 이렇게 쭈욱 나갈 수 있음. + // 그럼 N이 20까지 들어오니깐, 20개를 모든 조합을 세는건 미친짓이다. + // 예시로, DP(10) 은, 10을 만들기 위한 방법수를 적어뒀다고 치면 + // DP(12) 는 DP(10) + 2 와 수렴하나? + + public class Main { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int testCase = Integer.parseInt(br.readLine()); + StringBuilder sb = new StringBuilder(); + + while(testCase-- > 0) { + int coinCount = Integer.parseInt(br.readLine()); + int[] coinArray = new int[coinCount]; + StringTokenizer st = new StringTokenizer(br.readLine()); + + for(int i = 0; i < coinCount; i++) { + coinArray[i] = Integer.parseInt(st.nextToken()); + } + + int target = Integer.parseInt(br.readLine()); + int[] dp = new int[target + 1]; + + dp[0] = 1; + + for(int coin : coinArray) { + for(int i = coin; i <= target; i++) { + dp[i] += dp[i - coin]; + } + } + + sb.append(dp[target]).append("\n"); + } + + System.out.println(sb); + } + } +} diff --git "a/week25/\352\260\225\354\204\261\354\232\261/programers/\354\210\234\354\234\204_\352\262\200\354\203\211.java" "b/week25/\352\260\225\354\204\261\354\232\261/programers/\354\210\234\354\234\204_\352\262\200\354\203\211.java" new file mode 100644 index 0000000..c957b80 --- /dev/null +++ "b/week25/\352\260\225\354\204\261\354\232\261/programers/\354\210\234\354\234\204_\352\262\200\354\203\211.java" @@ -0,0 +1,96 @@ +package week25.강성욱.programers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week25.강성욱.programers + * FileName : 순위_검색 + * Author : Baekgwa + * Date : 2025-10-23 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-10-23 Baekgwa Initial creation + */ +public class 순위_검색 { + // 이거 각 조합을 string 으로 이어서 그냥 map 에다가 list로 점수 저장해두며 ㄴ안되나? + // 아 - 처리가 애매하려나? + // 그건 상관없구나, 잘만하면 되게넹 + //--- + // 미리 - 를 포함한걸 만들어 두면 되겠네. + // 이진탐색 안하면 효율성에서 터짐 + class Solution { + + public static final Map> map = new HashMap<>(); + + public int[] solution(String[] info, String[] query) { + + for(String inf : info) { + String[] infoArray = inf.split(" "); + dfs(infoArray, 0, ""); // map 에다가 - 혹은 "java" 를 붙여가면서 케이스 찾아두기 + } + + for(List list : map.values()) { + Collections.sort(list); + } + + // 쪼개서 토큰화 + int[] result = new int[query.length]; + int i=0; + for(String qur : query) { + String[] queryArray = qur.split(" and | "); + String key = queryArray[0] + queryArray[1] + queryArray[2] + queryArray[3]; + int score = Integer.parseInt(queryArray[4]); + + result[i++] = findCount(key, score); + } + + return result; + } + + public void dfs(String[] info, int depth, String key) { + if(depth == 4) { + int score = Integer.parseInt(info[4]); + map.computeIfAbsent(key, k -> new ArrayList<>()).add(score); + return; + } + + String nowKey = info[depth]; + dfs(info, depth + 1, key + nowKey); + dfs(info, depth + 1, key + "-"); + } + + // targetValue 이상인걸 찾아야함 + // 이진탐색으로 처리 + public int findCount(String targetKey, int targetValue) { + if(!map.containsKey(targetKey)) { + return 0; + } + + // // 정렬 + List valueList = map.get(targetKey); + // Collections.sort(valueList); + + // 이진탐색 + int left = 0; + int right = valueList.size(); + + while(left < right) { + int mid = (left + right) / 2; + + if(valueList.get(mid) >= targetValue) { + right = mid; + } else { + left = mid + 1; + } + } + + return valueList.size() - left; + } + } +} diff --git "a/week25/\352\260\225\354\204\261\354\232\261/programers/\354\240\225\354\210\230_\354\202\274\352\260\201\355\230\225.java" "b/week25/\352\260\225\354\204\261\354\232\261/programers/\354\240\225\354\210\230_\354\202\274\352\260\201\355\230\225.java" new file mode 100644 index 0000000..280a80c --- /dev/null +++ "b/week25/\352\260\225\354\204\261\354\232\261/programers/\354\240\225\354\210\230_\354\202\274\352\260\201\355\230\225.java" @@ -0,0 +1,41 @@ +package week25.강성욱.programers; + +/** + * PackageName : week25.강성욱.programers + * FileName : 정수_삼각형 + * Author : Baekgwa + * Date : 2025-10-23 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-10-23 Baekgwa Initial creation + */ +public class 정수_삼각형 { + class Solution { + public int solution(int[][] triangle) { + int size = triangle.length; + int[][] dp = new int[size][size]; + dp[0][0] = triangle[0][0]; + + for(int y=1; y[] tree; + static boolean[] visited; + static int result = 0; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine()); + + tree = new ArrayList[n + 1]; + visited = new boolean[n + 1]; + + for (int i = 1; i <= n; i++) { + tree[i] = new ArrayList<>(); + } + + // 간선 입력 + for (int i = 0; i < n - 1; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + tree[a].add(b); + tree[b].add(a); + } + + dfs(1, 0); + + System.out.println(result % 2 == 1 ? "Yes" : "No"); + } + + static void dfs(int node, int depth) { + visited[node] = true; + boolean is_leaf = true; + + for (int next : tree[node]) { + if (!visited[next]) { + is_leaf = false; + dfs(next, depth + 1); + } + } + + if (is_leaf) { + result += depth; + } + } +} diff --git "a/week25/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\231\354\240\204.java" "b/week25/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\231\354\240\204.java" new file mode 100644 index 0000000..6676e4f --- /dev/null +++ "b/week25/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\231\354\240\204.java" @@ -0,0 +1,35 @@ +import java.util.*; +import java.io.*; + + +public class Main { + public static void main(String[] args) throws IOException{ + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int T = Integer.parseInt(br.readLine()); + + while( T-- > 0){ + int N = Integer.parseInt(br.readLine()); + int[] coins = new int[N]; + StringTokenizer st = new StringTokenizer(br.readLine()); + + for(int i = 0; i < N; i++){ + coins[i] = Integer.parseInt(st.nextToken()); + } + + int M = Integer.parseInt(br.readLine()); + + int[] dp = new int[M+1]; + dp[0] = 1; + + for(int coin : coins){ + for(int i = coin; i <= M; i++){ + dp[i] += dp[i-coin]; + } + } + System.out.println(dp[M]); + } + + } +} \ No newline at end of file diff --git "a/week25/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\234\354\234\204_\352\262\200\354\203\211.java" "b/week25/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\234\354\234\204_\352\262\200\354\203\211.java" new file mode 100644 index 0000000..bdd21be --- /dev/null +++ "b/week25/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\234\354\234\204_\352\262\200\354\203\211.java" @@ -0,0 +1,58 @@ +import java.util.*; + +class Solution { + public int[] solution(String[] info, String[] query) { + Map> map = new HashMap<>(); + + for (String s : info) { + String[] arr = s.split(" "); + String[] cond = {arr[0], arr[1], arr[2], arr[3]}; + int score = Integer.parseInt(arr[4]); + dfs(map, cond, 0, "", score); + } + + for (ArrayList list : map.values()) { + Collections.sort(list); + } + + // query 처리 + int[] answer = new int[query.length]; + int idx = 0; + for (String q : query) { + q = q.replaceAll(" and ", " "); + String[] arr = q.split(" "); + String key = arr[0] + " " + arr[1] + " " + arr[2] + " " + arr[3] + " "; + int score = Integer.parseInt(arr[4]); + + if (map.containsKey(key)) { + ArrayList list = map.get(key); + int count = list.size() - lowerBound(list, score); + answer[idx] = count; + } else { + answer[idx] = 0; + } + idx++; + } + + return answer; + } + + void dfs(Map> map, String[] cond, int depth, String key, int score) { + if (depth == 4) { + map.computeIfAbsent(key, k -> new ArrayList<>()).add(score); + return; + } + dfs(map, cond, depth + 1, key + cond[depth] + " ", score); + dfs(map, cond, depth + 1, key + "- ", score); + } + + int lowerBound(ArrayList list, int target) { + int left = 0, right = list.size(); + while (left < right) { + int mid = (left + right) / 2; + if (list.get(mid) < target) left = mid + 1; + else right = mid; + } + return left; + } +} diff --git "a/week25/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\225\354\210\230_\354\202\274\352\260\201\355\230\225.java" "b/week25/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\225\354\210\230_\354\202\274\352\260\201\355\230\225.java" new file mode 100644 index 0000000..6a49192 --- /dev/null +++ "b/week25/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\225\354\210\230_\354\202\274\352\260\201\355\230\225.java" @@ -0,0 +1,26 @@ +class Solution { + public int solution(int[][] triangle) { + int n = triangle.length; + int[][] dp = new int[n][n]; + + dp[0][0] = triangle[0][0]; + + for (int i = 1; i < n; i++) { + for (int j = 0; j <= i; j++) { + + if (j == 0) dp[i][j] = dp[i - 1][j] + triangle[i][j]; // 왼쪽 끝 + + else if (j == i) dp[i][j] = dp[i - 1][j - 1] + triangle[i][j]; // 오른쪽 끝 + + else dp[i][j] = Math.max(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j]; + } + } + + int answer = 0; + for (int j = 0; j < n; j++) { + answer = Math.max(answer, dp[n - 1][j]); + } + + return answer; + } +} diff --git "a/week26/\352\260\225\354\204\261\354\232\261/baekjoon/\354\227\260\352\262\260_\354\232\224\354\206\214\354\235\230_\352\260\234\354\210\230.java" "b/week26/\352\260\225\354\204\261\354\232\261/baekjoon/\354\227\260\352\262\260_\354\232\224\354\206\214\354\235\230_\352\260\234\354\210\230.java" new file mode 100644 index 0000000..05092de --- /dev/null +++ "b/week26/\352\260\225\354\204\261\354\232\261/baekjoon/\354\227\260\352\262\260_\354\232\224\354\206\214\354\235\230_\352\260\234\354\210\230.java" @@ -0,0 +1,66 @@ +package week26.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +/** + * PackageName : week26.강성욱.baekjoon + * FileName : 연결_요소의_개수 + * Author : Baekgwa + * Date : 25. 10. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 10. 30. Baekgwa Initial creation + */ +public class 연결_요소의_개수 { + public class Main { + public static void main(String[] args) throws IOException { + 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()); + boolean[] visited = new boolean[N+1]; + + Map> graph = new HashMap<>(); + + for(int i=0; i new ArrayList<>()).add(B); + graph.computeIfAbsent(B, k -> new ArrayList<>()).add(A); + } + + // 정점들 하나씩 돌면서 확인 + int result = 0; + for(int i=1; i<=N; i++) { + if(visited[i]) continue; + + result++; + dfs(i, graph, visited); + } + + System.out.println(result); + } + + private static void dfs(Integer node, Map> graph, boolean[] visited) { + visited[node] = true; + + if(!graph.containsKey(node)) return; + + for(Integer neighbor : graph.get(node)) { + if(visited[neighbor]) continue; + dfs(neighbor, graph, visited); + } + } + } +} diff --git "a/week26/\352\260\225\354\204\261\354\232\261/baekjoon/\354\240\234\354\204\244_\354\236\221\354\227\205.java" "b/week26/\352\260\225\354\204\261\354\232\261/baekjoon/\354\240\234\354\204\244_\354\236\221\354\227\205.java" new file mode 100644 index 0000000..1de033c --- /dev/null +++ "b/week26/\352\260\225\354\204\261\354\232\261/baekjoon/\354\240\234\354\204\244_\354\236\221\354\227\205.java" @@ -0,0 +1,140 @@ +package week26.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +/** + * PackageName : week26.강성욱.baekjoon + * FileName : 제설_작업 + * Author : Baekgwa + * Date : 25. 10. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 10. 30. Baekgwa Initial creation + */ +public class 제설_작업 { + public class Main { + + public static int[][] map; + public static long[] ySumArray; + public static long[] xSumArray; + public static int N, M; + + 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()); + M = Integer.parseInt(st.nextToken()); + + map = new int[N][M]; + ySumArray = new long[N]; + xSumArray = new long[M]; + + for (int i = 0; i < N; i++) { + st = new StringTokenizer(br.readLine()); + for (int j = 0; j < M; j++) { + map[i][j] = Integer.parseInt(st.nextToken()); + ySumArray[i] += map[i][j]; + xSumArray[j] += map[i][j]; + } + } + + long left = 1; + long right = 1_000_000_000L; + long result = right; + + while (left <= right) { + long mid = (left + right) / 2; + + if (check(mid)) { + result = mid; + right = mid - 1; + } else { + left = mid + 1; + } + } + + System.out.println(result); + } + + // 성능 P로 눈을 치울 수 있는지 확인 + public static boolean check(long P) { + long[] xSum = xSumArray.clone(); + long[] ySum = ySumArray.clone(); + boolean[] clearedRows = new boolean[N]; + boolean[] clearedCols = new boolean[M]; + + Queue q = new LinkedList<>(); + + for (int i = 0; i < N; i++) { + if (ySum[i] <= P) { + q.offer(new Job(i, 0)); + clearedRows[i] = true; + } + } + for (int j = 0; j < M; j++) { + if (xSum[j] <= P) { + q.offer(new Job(j, 1)); + clearedCols[j] = true; + } + } + + while (!q.isEmpty()) { + Job job = q.poll(); + + if (job.dir == 0) { + int r = job.point; + for (int c = 0; c < M; c++) { + if (!clearedCols[c]) { + xSum[c] -= map[r][c]; + if (xSum[c] <= P) { + clearedCols[c] = true; + q.offer(new Job(c, 1)); + } + } + } + } else { + int c = job.point; + for (int r = 0; r < N; r++) { + if (!clearedRows[r]) { + ySum[r] -= map[r][c]; + if (ySum[r] <= P) { + clearedRows[r] = true; + q.offer(new Job(r, 0)); + } + } + } + } + } + + for (int i = 0; i < N; i++) { + if (clearedRows[i]) continue; + + for (int j = 0; j < M; j++) { + if (!clearedCols[j]) { + return false; + } + } + } + + return true; + } + + public static class Job { + private int point; + private int dir; + + public Job(int point, int dir) { + this.point = point; + this.dir = dir; + } + } + } +} diff --git "a/week26/\352\260\225\354\204\261\354\232\261/programers/\353\211\264\354\212\244_\355\201\264\353\237\254\354\212\244\355\204\260\353\247\201.java" "b/week26/\352\260\225\354\204\261\354\232\261/programers/\353\211\264\354\212\244_\355\201\264\353\237\254\354\212\244\355\204\260\353\247\201.java" new file mode 100644 index 0000000..972d55c --- /dev/null +++ "b/week26/\352\260\225\354\204\261\354\232\261/programers/\353\211\264\354\212\244_\355\201\264\353\237\254\354\212\244\355\204\260\353\247\201.java" @@ -0,0 +1,79 @@ +package week26.강성욱.programers; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * PackageName : week26.강성욱.programers + * FileName : 뉴스_클러스터링 + * Author : Baekgwa + * Date : 25. 10. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 10. 30. Baekgwa Initial creation + */ +public class 뉴스_클러스터링 { + // map 으로 정리해보자. + // key : value(개수) + // 1 : 2 + // 2 : 2 + // 3 : 1 + // 다음 입력으로, {1, 2, 2, 4, 5} + // 1 찾고, 있으면 -1 + // 2 찾고, 있으면 -1 [여기서 1은 삭제] + // 2 찾고, 있으면 -1 [여기서, 2는 삭제] + // 4, 찾고 없어서 아무것도 + // 5 찾고 없어서 아무것도 + // 이렇게 하면 교집합 찾을 수 있음. + + // 2번째도 map 으로 정리 + // key : value(개수) + // 1 : 1 + // 2 : 2 + // 4 : 1 + // 5 : 1 + + // 이거 두개 기반으로, key 당 max 치의 숫자를 구하면 합집합? + // 그럼, 1번map, 2번map 둘다 iter key 돌면서 확인하면 될듯? + + class Solution { + + public static final String regex = "[A-Z]{2}"; + + public int solution(String str1, String str2) { + Map map1 = new HashMap<>(); + Map map2 = new HashMap<>(); + + for(int i=0; i v == null ? 1 : v + 1); + } + + for(int i=0; i v == null ? 1 : v + 1); + } + + Set keySet = new HashSet<>(); + keySet.addAll(map1.keySet()); + keySet.addAll(map2.keySet()); + + double innerSum = 0; + double outerSum = 0; + for(String key : keySet) { + innerSum += Math.min(map1.getOrDefault(key, 0), map2.getOrDefault(key, 0)); + outerSum += Math.max(map1.getOrDefault(key, 0), map2.getOrDefault(key, 0)); + } + + if(outerSum == 0) return 65536; + + return (int)(innerSum / outerSum * 65536); + } + } +} diff --git "a/week26/\352\260\225\354\204\261\354\232\261/programers/\354\225\274\352\267\274_\354\247\200\354\210\230.java" "b/week26/\352\260\225\354\204\261\354\232\261/programers/\354\225\274\352\267\274_\354\247\200\354\210\230.java" new file mode 100644 index 0000000..4afd60f --- /dev/null +++ "b/week26/\352\260\225\354\204\261\354\232\261/programers/\354\225\274\352\267\274_\354\247\200\354\210\230.java" @@ -0,0 +1,49 @@ +package week26.강성욱.programers; + +import java.util.PriorityQueue; + +/** + * PackageName : week26.강성욱.programers + * FileName : 야근_지수 + * Author : Baekgwa + * Date : 25. 10. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 10. 30. Baekgwa Initial creation + */ +public class 야근_지수 { + // 그럼, 전반적으로 가장 높은게 없도록 낮춰야 하잖아? + // n 만큼 - 를 하는데, 가장 큰걸 차감하면되잖아. + // 그럼 PQ 로 해서, 정렬을 가장 큰순서대로 하고 + // n 만큼 뽑고, 빼고 하면? + // n 은 50000 만큼. + // 할만할듯? + + class Solution { + public long solution(int n, int[] works) { + PriorityQueue pq = new PriorityQueue<>((a, b) -> b - a); + + for(int work : works) { + pq.offer(work); + // System.out.println(work + "넣음"); + } + + // 일처리 + for(int i=0; i 0) pq.offer(now - 1); + } + + long result = 0; + while(!pq.isEmpty()) { + int now = pq.poll(); + result += (long) now * now; + } + + return result; + } + } +} diff --git "a/week26/\354\235\264\354\203\201\354\226\265/backjoon/\354\227\260\352\262\260_\354\232\224\354\206\214\354\235\230_\352\260\234\354\210\230.java" "b/week26/\354\235\264\354\203\201\354\226\265/backjoon/\354\227\260\352\262\260_\354\232\224\354\206\214\354\235\230_\352\260\234\354\210\230.java" new file mode 100644 index 0000000..1a4a9a7 --- /dev/null +++ "b/week26/\354\235\264\354\203\201\354\226\265/backjoon/\354\227\260\352\262\260_\354\232\224\354\206\214\354\235\230_\352\260\234\354\210\230.java" @@ -0,0 +1,48 @@ +import java.util.*; +import java.io.*; + +public class Main { + static boolean[] visited; + static ArrayList[] graph; + static int result = 0; + + public static void main(String[] args) throws IOException { + 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()); // 간선의 개수 + + graph = new ArrayList[N + 1]; + visited = new boolean[N + 1]; + + for (int i = 1; i <= N; i++) { + graph[i] = new ArrayList<>(); + } + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int u = Integer.parseInt(st.nextToken()); + int v = Integer.parseInt(st.nextToken()); + + graph[u].add(v); + graph[v].add(u); + } + + for (int i = 1; i <= N; i++) { + if (!visited[i]) { + dfs(i); + result++; + } + } + + System.out.println(result); + } + + public static void dfs(int node) { + visited[node] = true; + for (int next : graph[node]) { + if (!visited[next]) dfs(next); + } + } +} diff --git "a/week26/\354\235\264\354\203\201\354\226\265/backjoon/\354\240\234\354\204\244_\354\236\221\354\227\205.java" "b/week26/\354\235\264\354\203\201\354\226\265/backjoon/\354\240\234\354\204\244_\354\236\221\354\227\205.java" new file mode 100644 index 0000000..1c69ee6 --- /dev/null +++ "b/week26/\354\235\264\354\203\201\354\226\265/backjoon/\354\240\234\354\204\244_\354\236\221\354\227\205.java" @@ -0,0 +1,60 @@ +import java.io.*; +import java.util.*; + +public class Main { + static int N, M; + static long[][] A; + static long[] rowSum, colSum; + + 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()); + M = Integer.parseInt(st.nextToken()); + + A = new long[N][M]; + rowSum = new long[N]; + colSum = new long[M]; + + for (int i = 0; i < N; i++) { + st = new StringTokenizer(br.readLine()); + for (int j = 0; j < M; j++) { + A[i][j] = Long.parseLong(st.nextToken()); + rowSum[i] += A[i][j]; + colSum[j] += A[i][j]; + } + } + + long left = 1; + long right = 0; + for (int i = 0; i < N; i++) right = Math.max(right, rowSum[i]); + for (int j = 0; j < M; j++) right = Math.max(right, colSum[j]); + + long answer = right; + + while (left <= right) { + long mid = (left + right) / 2; + if (canClearAll(mid)) { + answer = mid; + right = mid - 1; + } else { + left = mid + 1; + } + } + + System.out.println(answer); + } + + static boolean canClearAll(long P) { + for (int i = 0; i < N; i++) { + if (rowSum[i] > P) { + for (int j = 0; j < M; j++) { + if (colSum[j] > P && A[i][j] > 0) { + return false; // 해당 칸 제거 불가 + } + } + } + } + return true; + } +} diff --git "a/week26/\354\235\264\354\203\201\354\226\265/progarmmers/\353\211\264\354\212\244_\355\201\264\353\237\254\354\212\244\355\204\260\353\247\201.java" "b/week26/\354\235\264\354\203\201\354\226\265/progarmmers/\353\211\264\354\212\244_\355\201\264\353\237\254\354\212\244\355\204\260\353\247\201.java" new file mode 100644 index 0000000..36297fc --- /dev/null +++ "b/week26/\354\235\264\354\203\201\354\226\265/progarmmers/\353\211\264\354\212\244_\355\201\264\353\237\254\354\212\244\355\204\260\353\247\201.java" @@ -0,0 +1,49 @@ +import java.util.*; + +class Solution { + public int solution(String str1, String str2) { + Map m1 = make_set(str1); + Map m2 = make_set(str2); + + if (m1.isEmpty() && m2.isEmpty()) { + return 65536; + } + + int interSize = 0; // 교집합 + int unionSize = 0; // 합집합 + + Set allKeys = new HashSet<>(); + + allKeys.addAll(m1.keySet()); + allKeys.addAll(m2.keySet()); + + for (String key : allKeys) { + int c1 = m1.getOrDefault(key, 0); + int c2 = m2.getOrDefault(key, 0); + + interSize += Math.min(c1, c2); + unionSize += Math.max(c1, c2); + } + + double jaccard = (double) interSize / (double) unionSize; + return (int) Math.floor(jaccard * 65536.0); + } + + public Map make_set(String s) { + Map map = new HashMap<>(); + s = s.toLowerCase(); + + for (int i = 0; i < s.length() - 1; i++) { + char a = s.charAt(i); + char b = s.charAt(i + 1); + + if (Character.isLetter(a) && Character.isLetter(b)) { + String token = "" + a + b; // 두 글자 묶기 + + map.put(token, map.getOrDefault(token, 0) + 1); + } + } + + return map; + } +} diff --git "a/week26/\354\235\264\354\203\201\354\226\265/progarmmers/\354\225\274\352\267\274_\354\247\200\354\210\230.java" "b/week26/\354\235\264\354\203\201\354\226\265/progarmmers/\354\225\274\352\267\274_\354\247\200\354\210\230.java" new file mode 100644 index 0000000..5419f4b --- /dev/null +++ "b/week26/\354\235\264\354\203\201\354\226\265/progarmmers/\354\225\274\352\267\274_\354\247\200\354\210\230.java" @@ -0,0 +1,28 @@ +import java.util.*; + + +class Solution { + public long solution(int n, int[] works) { + long answer = 0; + PriorityQueue pq = new PriorityQueue<>(Collections.reverseOrder()); + + for(int w : works){ + pq.add(w); + } + + for(int i = 0; i < n; i++){ + if(pq.isEmpty()) break; + + int max = pq.poll(); + if(max == 0) break; + + pq.add(max-1); + } + + while(!pq.isEmpty()){ + long x = pq.poll(); + answer += x * x; + } + return answer; + } +} \ No newline at end of file diff --git "a/week27/\352\260\225\354\204\261\354\232\261/baekjoon/AtoB.java" "b/week27/\352\260\225\354\204\261\354\232\261/baekjoon/AtoB.java" new file mode 100644 index 0000000..1f2f697 --- /dev/null +++ "b/week27/\352\260\225\354\204\261\354\232\261/baekjoon/AtoB.java" @@ -0,0 +1,83 @@ +package week27.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +/** + * PackageName : week27.강성욱.baekjoon + * FileName : AtoB + * Author : Baekgwa + * Date : 25. 11. 6. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 6. Baekgwa Initial creation + */ +public class AtoB { + public class Main { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + long start = Long.parseLong(st.nextToken()); + long target = Long.parseLong(st.nextToken()); + + //bfs + int result = 0; + Queue queue = new LinkedList<>(); + queue.add(new Num(start, 1)); + + while (!queue.isEmpty()) { + Num nowNum = queue.poll(); + // 종료조건 + if (nowNum.getNumber() == target) { + result = nowNum.getDepth(); + break; + } + + // *2 연산 + long multiNum = nowNum.getNumber() * 2; + if (multiNum <= target) + queue.add(new Num(multiNum, nowNum.getDepth() + 1)); + + // 가장 오른쪽 1 추가 + long addOneNum = addOneLast(nowNum.getNumber()); + if (addOneNum <= target) + queue.add(new Num(addOneNum, nowNum.getDepth() + 1)); + } + + if (result == 0) + System.out.println(-1); + else + System.out.println(result); + } + + // num 에다가 오른쪽 끝에 1 추가해서 return + private static long addOneLast(long num) { + return num * 10 + 1; + } + + private static class Num { + private long number; + private int depth; + + public Num(long now, int depth) { + this.number = now; + this.depth = depth; + } + + public long getNumber() { + return number; + } + + public int getDepth() { + return depth; + } + } + } +} diff --git "a/week27/\352\260\225\354\204\261\354\232\261/baekjoon/\354\210\250\353\260\224\352\274\255\354\247\210_2.java" "b/week27/\352\260\225\354\204\261\354\232\261/baekjoon/\354\210\250\353\260\224\352\274\255\354\247\210_2.java" new file mode 100644 index 0000000..7259ca3 --- /dev/null +++ "b/week27/\352\260\225\354\204\261\354\232\261/baekjoon/\354\210\250\353\260\224\352\274\255\354\247\210_2.java" @@ -0,0 +1,99 @@ +package week27.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +/** + * PackageName : week27.강성욱.baekjoon + * FileName : 숨바꼭질_2 + * Author : Baekgwa + * Date : 25. 11. 6. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 6. Baekgwa Initial creation + */ +public class 숨바꼭질_2 { + public class Main { + + private static final int MAX = 200_000; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + int start = Integer.parseInt(st.nextToken()); + int end = Integer.parseInt(st.nextToken()); + + if (start == end) { + System.out.println(0); + System.out.println(1); + return; + } + + boolean[] visited = new boolean[MAX + 1]; + + // bfs + int minDis = Integer.MAX_VALUE; + int minDisCount = 0; // 최소 이동 횟수로 몇번 가능한지 + Queue queue = new LinkedList<>(); + queue.add(new Point(start, 0)); + visited[start] = true; + + while (!queue.isEmpty()) { + Point point = queue.poll(); + if (point.getDepth() > minDis) { + continue; + } + + visited[point.getPos()] = true; + + if (point.getPos() == end) { + if (minDis > point.getDepth()) { + minDis = point.getDepth(); + minDisCount = 1; // 1로 초기화 + } else if (minDis == point.getDepth()) { + minDisCount++; + } + continue; + } + + int backPos = point.getPos() - 1; + int frontPos = point.getPos() + 1; + int telPos = point.getPos() * 2; + + if (backPos >= 0 && backPos <= MAX) + queue.add(new Point(backPos, point.getDepth() + 1)); + if (frontPos >= 0 && frontPos <= MAX) + queue.add(new Point(frontPos, point.getDepth() + 1)); + if (telPos >= 0 && telPos <= MAX) + queue.add(new Point(telPos, point.getDepth() + 1)); + } + + System.out.println(minDis); + System.out.println(minDisCount); + } + + private static class Point { + private int pos; + private int depth; + + public int getPos() { + return pos; + } + + public int getDepth() { + return depth; + } + + public Point(int pos, int depth) { + this.pos = pos; + this.depth = depth; + } + } + } +} diff --git "a/week27/\352\260\225\354\204\261\354\232\261/programmers/\353\223\261\352\265\243\352\270\270.java" "b/week27/\352\260\225\354\204\261\354\232\261/programmers/\353\223\261\352\265\243\352\270\270.java" new file mode 100644 index 0000000..423978e --- /dev/null +++ "b/week27/\352\260\225\354\204\261\354\232\261/programmers/\353\223\261\352\265\243\352\270\270.java" @@ -0,0 +1,45 @@ +package week27.강성욱.programmers; + +/** + * PackageName : week27.강성욱.programmers + * FileName : 등굣길 + * Author : Baekgwa + * Date : 25. 11. 6. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 6. Baekgwa Initial creation + */ +public class 등굣길 { + class Solution { + + private static final int MOD = 1000000007; + + public int solution(int m, int n, int[][] puddles) { + long[][] countMap = new long[n + 1][m + 1]; + boolean[][] isPuddle = new boolean[n + 1][m + 1]; + for (int[] puddle : puddles) { + isPuddle[puddle[1]][puddle[0]] = true; + } + + countMap[1][1] = 1; + + for (int y = 1; y <= n; y++) { + for (int x = 1; x <= m; x++) { + // 초기는 무시 + if (y == 1 && x == 1) continue; + + if (isPuddle[y][x]) { + countMap[y][x] = 0; + } else { + long fromTop = countMap[y - 1][x]; + long fromLeft = countMap[y][x - 1]; + countMap[y][x] = (fromTop + fromLeft) % MOD; + } + } + } + return (int) countMap[n][m]; + } + } +} diff --git "a/week27/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220.java" "b/week27/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220.java" new file mode 100644 index 0000000..61a482b --- /dev/null +++ "b/week27/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220.java" @@ -0,0 +1,43 @@ +package week27.강성욱.programmers; + +import java.util.TreeMap; + +/** + * PackageName : week27.강성욱.programmers + * FileName : 이중우선순위큐 + * Author : Baekgwa + * Date : 25. 11. 6. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 6. Baekgwa Initial creation + */ +public class 이중우선순위큐 { + class Solution { + public int[] solution(String[] operations) { + TreeMap map = new TreeMap<>(); + + for (String op : operations) { + String[] parts = op.split(" "); + String order = parts[0]; + int num = Integer.parseInt(parts[1]); + + if (order.equals("I")) { + map.put(num, map.getOrDefault(num, 0) + 1); + } else if (order.equals("D")) { + if(map.isEmpty()) continue; + + int key = (num == 1) ? map.lastKey() : map.firstKey(); + int count = map.get(key); //해당 숫자가 몇개 있는지 확인 + + if (count == 1) map.remove(key); + else map.put(key, count - 1); + } + } + + if (map.isEmpty()) return new int[]{0, 0}; + return new int[]{map.lastKey(), map.firstKey()}; + } + } +} diff --git "a/week27/\354\235\264\354\203\201\354\226\265/backjoon/A_B.java" "b/week27/\354\235\264\354\203\201\354\226\265/backjoon/A_B.java" new file mode 100644 index 0000000..9f6abf4 --- /dev/null +++ "b/week27/\354\235\264\354\203\201\354\226\265/backjoon/A_B.java" @@ -0,0 +1,32 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + long a = Long.parseLong(st.nextToken()); + long b = Long.parseLong(st.nextToken()); + + int cnt = 1; + while (b != a) { + if (b < a) { + cnt = -1; + break; + } + if (b % 10 == 1) { + b /= 10; + cnt++; + } else if (b % 2 == 0) { + b /= 2; + cnt++; + } else { + cnt = -1; + break; + } + } + + System.out.println(cnt); + } +} diff --git "a/week27/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\250\353\260\224\352\274\255\354\247\210.java" "b/week27/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\250\353\260\224\352\274\255\354\247\210.java" new file mode 100644 index 0000000..ff93bda --- /dev/null +++ "b/week27/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\250\353\260\224\352\274\255\354\247\210.java" @@ -0,0 +1,58 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + 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()); + + List[] graph = new ArrayList[N + 1]; + for (int i = 1; i <= N; i++) { + graph[i] = new ArrayList<>(); + } + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + graph[a].add(b); + graph[b].add(a); + } + + int[] dist = new int[N + 1]; + Arrays.fill(dist, -1); + + Queue q = new LinkedList<>(); + q.add(1); + dist[1] = 0; + + while (!q.isEmpty()) { + int cur = q.poll(); + for (int next : graph[cur]) { + if (dist[next] == -1) { + dist[next] = dist[cur] + 1; + q.add(next); + } + } + } + + int max_dist = 0; + int barn = 0; + int count = 0; + + for (int i = 1; i <= N; i++) { + if (dist[i] > max_dist) { + max_dist = dist[i]; + barn = i; + count = 1; + } else if (dist[i] == max_dist) { + count++; + } + } + + System.out.println(barn + " " + max_dist + " " + count); + } +} diff --git "a/week27/\354\235\264\354\203\201\354\226\265/progarmmers/\353\223\261\352\265\243\352\270\270.java" "b/week27/\354\235\264\354\203\201\354\226\265/progarmmers/\353\223\261\352\265\243\352\270\270.java" new file mode 100644 index 0000000..cbbe7cb --- /dev/null +++ "b/week27/\354\235\264\354\203\201\354\226\265/progarmmers/\353\223\261\352\265\243\352\270\270.java" @@ -0,0 +1,24 @@ +class Solution { + public int solution(int m, int n, int[][] puddles) { + int answer = 0; + int mod = 1000000007; + + int[][] dp = new int[n+1][m+1]; + boolean[][] water = new boolean[n+1][m+1]; + + for(int[] p : puddles){ + water[p[1]][p[0]] = true; + } + + dp[1][1] = 1; + + for(int y = 1; y <= n; y++){ + for(int x = 1; x <= m; x++){ + if(water[y][x] || ( x == 1 && y == 1)) continue; + dp[y][x] = (dp[y -1][x] + dp[y][x-1]) % mod; + } + } + + return dp[n][m]; + } +} \ No newline at end of file diff --git "a/week27/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220.java" "b/week27/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220.java" new file mode 100644 index 0000000..d998c07 --- /dev/null +++ "b/week27/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220.java" @@ -0,0 +1,32 @@ +import java.util.*; + +class Solution { + public int[] solution(String[] operations) { + PriorityQueue minQ = new PriorityQueue<>(); + PriorityQueue maxQ = new PriorityQueue<>(Collections.reverseOrder()); + + for (String op : operations) { + String[] parts = op.split(" "); + String cmd = parts[0]; + int num = Integer.parseInt(parts[1]); + + if (cmd.equals("I")) { + minQ.offer(num); + maxQ.offer(num); + } else if (cmd.equals("D")) { + if (minQ.isEmpty() || maxQ.isEmpty()) continue; + + if (num == 1) { // 최댓값 삭제 + int max = maxQ.poll(); + minQ.remove(max); + } else { // 최솟값 삭제 + int min = minQ.poll(); + maxQ.remove(min); + } + } + } + + if (minQ.isEmpty() || maxQ.isEmpty()) return new int[]{0, 0}; + return new int[]{maxQ.peek(), minQ.peek()}; + } +} diff --git "a/week28/\352\260\225\354\204\261\354\232\261/baekjoon/\352\260\225\354\235\230\354\213\244_\353\260\260\354\240\225.java" "b/week28/\352\260\225\354\204\261\354\232\261/baekjoon/\352\260\225\354\235\230\354\213\244_\353\260\260\354\240\225.java" new file mode 100644 index 0000000..550a305 --- /dev/null +++ "b/week28/\352\260\225\354\204\261\354\232\261/baekjoon/\352\260\225\354\235\230\354\213\244_\353\260\260\354\240\225.java" @@ -0,0 +1,68 @@ +package week28.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.PriorityQueue; +import java.util.StringTokenizer; + +/** + * PackageName : week28.강성욱.baekjoon + * FileName : 강의실_배정 + * Author : Baekgwa + * Date : 25. 11. 14. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 14. Baekgwa Initial creation + */ +public class 강의실_배정 { + public class Main { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + Lecture[] lectures = new Lecture[N]; + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int s = Integer.parseInt(st.nextToken()); + int t = Integer.parseInt(st.nextToken()); + lectures[i] = new Lecture(s, t); + } + Arrays.sort(lectures, (a, b) -> a.getStartTime() - b.getStartTime()); + + PriorityQueue pq = new PriorityQueue<>((a, b) -> a.getEndTime() - b.getEndTime()); + pq.offer(lectures[0]); + + for (int i = 1; i < N; i++) { + if (pq.peek().getEndTime() <= lectures[i].getStartTime()) { + pq.poll(); + } + pq.offer(lectures[i]); + } + + System.out.println(pq.size()); + } + + private static class Lecture { + private int startTime; + private int endTime; + + public Lecture(int startTime, int endTime) { + this.startTime = startTime; + this.endTime = endTime; + } + + public int getStartTime() { + return startTime; + } + + public int getEndTime() { + return endTime; + } + } + } +} diff --git "a/week28/\352\260\225\354\204\261\354\232\261/baekjoon/\353\217\231\354\240\2042.java" "b/week28/\352\260\225\354\204\261\354\232\261/baekjoon/\353\217\231\354\240\2042.java" new file mode 100644 index 0000000..b7a8bff --- /dev/null +++ "b/week28/\352\260\225\354\204\261\354\232\261/baekjoon/\353\217\231\354\240\2042.java" @@ -0,0 +1,67 @@ +package week28.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.StringTokenizer; + +/** + * PackageName : week28.강성욱.baekjoon + * FileName : 동전2 + * Author : Baekgwa + * Date : 25. 11. 14. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 14. Baekgwa Initial creation + */ +public class 동전2 { + public class Main { + + public static int[] dp; + public static List coinList = new ArrayList<>(); + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + int n = Integer.parseInt(st.nextToken()); //동전 종류 + int k = Integer.parseInt(st.nextToken()); //목표 k + + //목표치 n 에 대해 몇개로 도달했는지 확인하는 지표. + //즉, dp[100] 은 100을 만들기 위해 최소 몇개를 활용했는지 기록하는 메모이제이션 + dp = new int[k + 1]; + Arrays.fill(dp, Integer.MAX_VALUE); + dp[0] = 0; + + // 동류 종류 입력 + for(int i=0; i target || dp[next] <= nowDepth) continue; + + dp[next] = nowDepth; + dfs(next, target, nowDepth); + } + } + } +} diff --git "a/week28/\352\260\225\354\204\261\354\232\261/programmers/\353\213\250\354\206\215\354\271\264\353\251\224\353\235\274.java" "b/week28/\352\260\225\354\204\261\354\232\261/programmers/\353\213\250\354\206\215\354\271\264\353\251\224\353\235\274.java" new file mode 100644 index 0000000..69c1560 --- /dev/null +++ "b/week28/\352\260\225\354\204\261\354\232\261/programmers/\353\213\250\354\206\215\354\271\264\353\251\224\353\235\274.java" @@ -0,0 +1,43 @@ +package week28.강성욱.programmers; + +import java.util.Arrays; + +/** + * PackageName : week28.강성욱.programmers + * FileName : 단속카메라 + * Author : Baekgwa + * Date : 25. 11. 14. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 14. Baekgwa Initial creation + */ +public class 단속카메라 { + + class Solution { + public int solution(int[][] routes) { + Arrays.sort(routes, (a, b) -> { + if (a[1] == b[1]) { + return a[0] - b[0]; // 종료 지점이 같으면 시작 지점 기준 오름차순 + } + return a[1] - b[1]; // 종료 지점 기준 오름차순 + }); + + int result = 0; + int camera = Integer.MIN_VALUE; + + for (int[] route : routes) { + int start = route[0]; + int end = route[1]; + + if (start > camera) { + camera = end; + result++; + } + } + + return result; + } + } +} diff --git "a/week28/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\352\262\214\354\236\204.java" "b/week28/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..1a4dbf5 --- /dev/null +++ "b/week28/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\352\262\214\354\236\204.java" @@ -0,0 +1,55 @@ +package week28.강성욱.programmers; + +import java.util.TreeMap; + +/** + * PackageName : week28.강성욱.programmers + * FileName : 숫자_게임 + * Author : Baekgwa + * Date : 25. 11. 14. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 14. Baekgwa Initial creation + */ +public class 숫자_게임 { + // 음 가장 작은 차이로 이기는게 그냥 베스트 아닌가? + // 5, 1, 3, 7 + // 6, 2, 8, 패배 + // 만약 패배하는 케이스에서는 가장 작은 숫자를 내버리기? ㅇㅇ 그럼 될듯? + // 그럼 TreeSet 사용해볼까? + // 아 같은숫자 여러개 나오네.. 그럼 Map 으로 + + class Solution { + public int solution(int[] A, int[] B) { + TreeMap treeMap = new TreeMap<>(); //key : 숫자, value : 등장 개수 + + for (int b : B) { + treeMap.put(b, treeMap.getOrDefault(b, 0) + 1); + } + + int winCount = 0; + + for (int a : A) { + Integer key = treeMap.higherKey(a); + + if (key != null) { + winCount++; + } else { + key = treeMap.firstKey(); + } + + // TreeMap 에서 감소 혹은 삭제 처리 + int count = treeMap.get(key); + if (count == 1) { + treeMap.remove(key); + } else { + treeMap.put(key, count - 1); + } + } + + return winCount; + } + } +} diff --git "a/week28/\354\235\264\354\203\201\354\226\265/backjoon/\352\260\225\354\235\230\354\213\244_\353\260\260\354\240\225.java" "b/week28/\354\235\264\354\203\201\354\226\265/backjoon/\352\260\225\354\235\230\354\213\244_\353\260\260\354\240\225.java" new file mode 100644 index 0000000..cbfe75f --- /dev/null +++ "b/week28/\354\235\264\354\203\201\354\226\265/backjoon/\352\260\225\354\235\230\354\213\244_\353\260\260\354\240\225.java" @@ -0,0 +1,40 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + int[][] lectures = new int[N][2]; + + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + lectures[i][0] = Integer.parseInt(st.nextToken()); // 시작 시간 + lectures[i][1] = Integer.parseInt(st.nextToken()); // 종료 시간 + } + + List events = new ArrayList<>(); + + for (int i = 0; i < N; i++) { + events.add(new int[]{lectures[i][0], 1}); // 시작: +1 + events.add(new int[]{lectures[i][1], -1}); // 종료: -1 + } + + + events.sort((a, b) -> { + if (a[0] == b[0]) return a[1] - b[1]; + return a[0] - b[0]; + }); + + int now = 0; + int maxRoom = 0; + + for (int[] e : events) { + now += e[1]; + maxRoom = Math.max(maxRoom, now); + } + + System.out.println(maxRoom); + } +} diff --git "a/week28/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\231\354\240\204_2.java" "b/week28/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\231\354\240\204_2.java" new file mode 100644 index 0000000..82af9c8 --- /dev/null +++ "b/week28/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\231\354\240\204_2.java" @@ -0,0 +1,29 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + StringTokenizer st = new StringTokenizer(br.readLine()); + int n = Integer.parseInt(st.nextToken()); + int k = Integer.parseInt(st.nextToken()); + + int[] coins = new int[n]; + for (int i = 0; i < n; i++) { + coins[i] = Integer.parseInt(br.readLine()); + } + + int[] dp = new int[k + 1]; + Arrays.fill(dp, 10001); + dp[0] = 0; + + for (int coin : coins) { + for (int i = coin; i <= k; i++) { + dp[i] = Math.min(dp[i], dp[i - coin] + 1); + } + } + + System.out.println(dp[k] == 10001 ? -1 : dp[k]); + } +} diff --git "a/week28/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\250\354\206\215\354\271\264\353\251\224\353\235\274.java" "b/week28/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\250\354\206\215\354\271\264\353\251\224\353\235\274.java" new file mode 100644 index 0000000..80bff35 --- /dev/null +++ "b/week28/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\250\354\206\215\354\271\264\353\251\224\353\235\274.java" @@ -0,0 +1,19 @@ +import java.util.*; + +class Solution { + public int solution(int[][] routes) { + Arrays.sort(routes, (a, b) -> Integer.compare(a[1], b[1])); + + int cameras = 1; + int cameraPos = routes[0][1]; + + for (int i = 1; i < routes.length; i++) { + if (routes[i][0] > cameraPos) { + cameras++; + cameraPos = routes[i][1]; // 위치 갱신 + } + } + + return cameras; + } +} diff --git "a/week28/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\352\262\214\354\236\204.java" "b/week28/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..55b5f99 --- /dev/null +++ "b/week28/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\352\262\214\354\236\204.java" @@ -0,0 +1,22 @@ +import java.util.*; + +class Solution { + public int solution(int[] A, int[] B) { + + Arrays.sort(A); + Arrays.sort(B); + + int i = 0; + int j = 0; + int win = 0; + + while( i < A.length && j < B.length) { + if(B[j] > A[i]){ + win ++; + i++; + } + j++; + } + return win; + } +} \ No newline at end of file diff --git "a/week29/\352\260\225\354\204\261\354\232\261/backjoon/\354\210\230_\353\254\266\352\270\260.java" "b/week29/\352\260\225\354\204\261\354\232\261/backjoon/\354\210\230_\353\254\266\352\270\260.java" new file mode 100644 index 0000000..122a1db --- /dev/null +++ "b/week29/\352\260\225\354\204\261\354\232\261/backjoon/\354\210\230_\353\254\266\352\270\260.java" @@ -0,0 +1,70 @@ +package week29.강성욱.backjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Collections; +import java.util.PriorityQueue; + +/** + * PackageName : week29.강성욱.backjoon + * FileName : 수_묶기 + * Author : Baekgwa + * Date : 25. 11. 21. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 21. Baekgwa Initial creation + */ +public class 수_묶기 { + public class Main { + // 음, 거의 대부분의 상황에서 묶는게 정배 + // 음수는 음수끼리 묶는게 베스트 -> 그럽 곱했을 때, 양수로 변경되잖아. + // 양수도, 큰수끼리 묶는게 베스트 -> + // 그럼, 양수, 음수 집합을 만들고 + // 최대끼리 합해서 처리하면 되는거 아냐? + // 음 집합을 만드려면 O(n)? + // 아 근데 입력받을때, PQ 두개에 넣고 돌리면 될듯? + + public static int result = 0; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + PriorityQueue positivePq = new PriorityQueue<>(Collections.reverseOrder()); + PriorityQueue negativePq = new PriorityQueue<>(); + + int count = Integer.parseInt(br.readLine()); + for (int i = 0; i < count; i++) { + int num = Integer.parseInt(br.readLine()); + if(num > 0) positivePq.add(num); + else negativePq.add(num); + } + + // 양수부터 차례로, 2개씩 빼서 처리. + // 마지막 내부적으로, 더했을때 곱했을때 비교해서 result 에 반영해야함 + calc(positivePq); + + // 음수처리. + // 음수는 가장 작은수끼리 곱해서 음수로 만들어서 처리해야함 + calc(negativePq); + + System.out.println(result); + } + + private static void calc(PriorityQueue pq) { + while(pq.size() > 1) { //2개 이상 있을때만 + int a = pq.poll(); + int b = pq.poll(); + + int sum = a + b; + int prod = a * b; + result += Math.max(sum, prod); + } + if(!pq.isEmpty()) { + result += pq.poll(); + } + } + } +} diff --git "a/week29/\352\260\225\354\204\261\354\232\261/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\260.java" "b/week29/\352\260\225\354\204\261\354\232\261/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..be0ff21 --- /dev/null +++ "b/week29/\352\260\225\354\204\261\354\232\261/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,99 @@ +package week29.강성욱.backjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.PriorityQueue; +import java.util.StringTokenizer; + +/** + * PackageName : week29.강성욱.backjoon + * FileName : 최소비용_구하기 + * Author : Baekgwa + * Date : 25. 11. 21. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 21. Baekgwa Initial creation + */ +public class 최소비용_구하기 { + public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int cityCount = Integer.parseInt(br.readLine()); + + // 연결 그래프 초기화 + ArrayList> graph = new ArrayList<>(); + for (int i = 0; i <= cityCount; i++) { + graph.add(new ArrayList<>()); + } + + // 연결 그래프 추가 + int count = Integer.parseInt(br.readLine()); + for (int i = 0; i < count; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int from = Integer.parseInt(st.nextToken()); + int to = Integer.parseInt(st.nextToken()); + int cost = Integer.parseInt(st.nextToken()); + graph.get(from).add(new Edge(to, cost)); + } + + // 시작/도착 지점 확인 + StringTokenizer st = new StringTokenizer(br.readLine()); + int startNode = Integer.parseInt(st.nextToken()); + int endNode = Integer.parseInt(st.nextToken()); + + // 다익스트라 처리 + int[] dist = new int[cityCount + 1]; //시작정점에서의 최소 거리를 저장할 dist 테이블 + Arrays.fill(dist, Integer.MAX_VALUE); // 초기값은, 모두 확인안된것을 의미하도록 MAX_VALUE 로 초기화 + dist[startNode] = 0; //시작정점은 시작과 동시에 도착 판정 + PriorityQueue pq = new PriorityQueue<>( + (a, b) -> a.getCost() - b.getCost()); // 이동 비용 기준으로 오름차순. (작은 것 부터) + pq.offer(new Edge(startNode, 0)); //시작을 startNode 부터 진행 + + while (!pq.isEmpty()) { + Edge now = pq.poll(); + int nowNode = now.getNode(); // 현재 노드 + int nowCost = now.getCost(); // 시작지점 부터, 현재 노드까지 사용한 비용 + + if (dist[nowNode] < nowCost) + continue; // 다른 우선순위로 인해 해당 정점까지의 최소비용이 변경되어 더 작은 경우로 가지가 뻗어진 경우, 해당 Edge 는 관리하지 않음. + + // 현재 위치에서 갈 수 있는 경로들 모두 탐색 + for (Edge edge : graph.get(nowNode)) { + int to = edge.getNode(); + int nextCost = edge.getCost() + nowCost; + + // 현재 가는곳이 더 작은 비용을 내고 갈 수 있다면, 추가 + if (dist[to] > nextCost) { + dist[to] = nextCost; + pq.offer(new Edge(to, nextCost)); + } + } + } + + System.out.println(dist[endNode]); + } + + private static class Edge { + private int node; + private int cost; + + public Edge(int node, int cost) { + this.node = node; + this.cost = cost; + } + + public int getNode() { + return node; + } + + public int getCost() { + return cost; + } + } + } +} diff --git "a/week29/\352\260\225\354\204\261\354\232\261/programmers/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224.java" "b/week29/\352\260\225\354\204\261\354\232\261/programmers/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224.java" new file mode 100644 index 0000000..fe9a40c --- /dev/null +++ "b/week29/\352\260\225\354\204\261\354\232\261/programmers/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224.java" @@ -0,0 +1,72 @@ +package week29.강성욱.programmers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; + +/** + * PackageName : week29.강성욱.programmers + * FileName : 베스트앨범 + * Author : Baekgwa + * Date : 25. 11. 21. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 21. Baekgwa Initial creation + */ +public class 베스트앨범 { + // 장르별로, 많은걸 찾아야함. + // 장르별, 노래 정보를 top2 가져올 수 있어야함. + + class Solution { + public int[] solution(String[] genres, int[] plays) { + + Map genreTotal = new HashMap<>(); //key : 장르, value : 횟수 + Map> genreSongs = new HashMap<>(); //key : 장르, value : 노래 정보 + + for (int id = 0; id < genres.length; id++) { + String genre = genres[id]; + int play = plays[id]; + + genreTotal.put(genre, genreTotal.getOrDefault(genre, 0) + play); + + genreSongs.putIfAbsent(genre, new PriorityQueue<>((a, b) -> b.plays - a.plays)); + genreSongs.get(genre).offer(new Song(genre, id, play)); + } + + // 장르별 순서 확인 + List order = new ArrayList<>(genreTotal.keySet()); + order.sort((a, b) -> genreTotal.get(b) - genreTotal.get(a)); + + List resultList = new ArrayList<>(); + + for (String genre : order) { + PriorityQueue pq = genreSongs.get(genre); + + int cnt = 0; + //최대 2곡 넣음 + for(int i=0; i<2; i++) { + if(pq.isEmpty()) break; //비어있으면 못넣음 + resultList.add(pq.poll().id); + } + } + + return resultList.stream().mapToInt(i -> i).toArray(); + } + + private class Song { + private String genre; + private int id; + private int plays; + + public Song(String genre, int id, int plays) { + this.genre = genre; + this.id = id; + this.plays = plays; + } + } + } +} diff --git "a/week29/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\352\263\240\354\235\230_\354\247\221\355\225\251.java" "b/week29/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\352\263\240\354\235\230_\354\247\221\355\225\251.java" new file mode 100644 index 0000000..0887afe --- /dev/null +++ "b/week29/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\352\263\240\354\235\230_\354\247\221\355\225\251.java" @@ -0,0 +1,36 @@ +package week29.강성욱.programmers; + +/** + * PackageName : week29.강성욱.programmers + * FileName : 최고의_집합 + * Author : Baekgwa + * Date : 25. 11. 21. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 21. Baekgwa Initial creation + */ +public class 최고의_집합 { + class Solution { + public int[] solution(int n, int s) { + //균등하게 분배 + int[] result = new int[n]; + + int div = s/n; + int rem = s%n; //나머지 + + if(div == 0) return new int[]{-1}; //불가능 + + for(int i=n-1; i>=0; i--) { + result[i] = div; + if(rem > 0) { + result[i]++; + rem--; + } + } + + return result; + } + } +} diff --git "a/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\230_\353\254\266\352\270\260.java" "b/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\230_\353\254\266\352\270\260.java" new file mode 100644 index 0000000..b2ed352 --- /dev/null +++ "b/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\230_\353\254\266\352\270\260.java" @@ -0,0 +1,64 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + + List plus_numbers = new ArrayList<>(); + List minus_numbers = new ArrayList<>(); + + int ones = 0; + int zeros = 0; + + for (int i = 0; i < N; i++) { + int num = Integer.parseInt(br.readLine()); + + if (num > 1) plus_numbers.add(num); + else if (num == 1) ones++; + else if (num == 0) zeros++; + else minus_numbers.add(num); + } + + Collections.sort(plus_numbers, Collections.reverseOrder()); + Collections.sort(minus_numbers); + + long result = 0; + + for (int i = 0; i < plus_numbers.size(); ) { + if (i + 1 < plus_numbers.size()) { + int a = plus_numbers.get(i); + int b = plus_numbers.get(i + 1); + result += a * b; + i += 2; + } else { + result += plus_numbers.get(i); + i += 1; + } + } + + result += ones; + + for (int i = 0; i < minus_numbers.size(); ) { + if (i + 1 < minus_numbers.size()) { + int a = minus_numbers.get(i); + int b = minus_numbers.get(i + 1); + result += a * b; + i += 2; + } else { + if (zeros > 0) { + zeros--; + i += 1; + } else { + result += minus_numbers.get(i); + i += 1; + } + } + } + + System.out.println(result); + } +} diff --git "a/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\260.java" "b/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..ed98e3c --- /dev/null +++ "b/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,73 @@ +import java.io.*; +import java.util.*; + +public class Main{ + + static class Node { + int v, cost; + Node(int v, int cost){ + this.v = v; + this.cost = cost; + } + } + + static List> graph; + static int[] dist; + static boolean[] visit; + static int N, M; + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); // 도시 수 + M = Integer.parseInt(br.readLine()); // 버스 수 + + graph = new ArrayList<>(); + for(int i = 0; i <= N; i++){ + graph.add(new ArrayList<>()); + } + + for(int i = 0; i < M; i++){ + StringTokenizer st = new StringTokenizer(br.readLine()); + int from = Integer.parseInt(st.nextToken()); + int to = Integer.parseInt(st.nextToken()); + int cost = Integer.parseInt(st.nextToken()); + + graph.get(from).add(new Node(to, cost)); + } + + StringTokenizer st = new StringTokenizer(br.readLine()); + int start = Integer.parseInt(st.nextToken()); + int end = Integer.parseInt(st.nextToken()); + + dist = new int[N+1]; + visit = new boolean[N+1]; + + Arrays.fill(dist, Integer.MAX_VALUE); + + dijkstra(start); + + System.out.println(dist[end]); + } + + static void dijkstra(int start){ + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1.cost - o2.cost); + pq.add(new Node(start, 0)); + dist[start] = 0; + + while(!pq.isEmpty()){ + Node now = pq.poll(); + + if(visit[now.v]) continue; + visit[now.v] = true; + + for(Node next : graph.get(now.v)){ + if(!visit[next.v] && dist[next.v] > dist[now.v] + next.cost){ + dist[next.v] = dist[now.v] + next.cost; + pq.add(new Node(next.v, dist[next.v])); + } + } + } + } +} diff --git "a/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224.java" "b/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224.java" new file mode 100644 index 0000000..ee8f95b --- /dev/null +++ "b/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224.java" @@ -0,0 +1,51 @@ +import java.util.*; + +class Solution { + public int[] solution(String[] genres, int[] plays) { + + Map genreSum = new HashMap<>(); + Map> genreMap = new HashMap<>(); + + for (int i = 0; i < genres.length; i++) { + String g = genres[i]; + int p = plays[i]; + + // 총 재생수 누적 + genreSum.put(g, genreSum.getOrDefault(g, 0) + p); + + if (!genreMap.containsKey(g)) { + genreMap.put(g, new ArrayList<>()); + } + + // 재생수, 고유번호 + genreMap.get(g).add(new int[]{p, i}); + } + + List genreList = new ArrayList<>(genreSum.keySet()); + genreList.sort((a, b) -> genreSum.get(b) - genreSum.get(a)); + + List result = new ArrayList<>(); + + for (String g : genreList) { + List list = genreMap.get(g); + + list.sort((a, b) -> { + if (b[0] != a[0]) return b[0] - a[0]; + return a[1] - b[1]; + }); + + // 2개까지 + result.add(list.get(0)[1]); + if (list.size() > 1) { + result.add(list.get(1)[1]); + } + } + + int[] answer = new int[result.size()]; + for (int i = 0; i < result.size(); i++) { + answer[i] = result.get(i); + } + + return answer; + } +} diff --git "a/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\352\263\240\354\235\230_\354\247\221\355\225\251.java" "b/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\352\263\240\354\235\230_\354\247\221\355\225\251.java" new file mode 100644 index 0000000..a8f6541 --- /dev/null +++ "b/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\352\263\240\354\235\230_\354\247\221\355\225\251.java" @@ -0,0 +1,22 @@ +import java.util.*; + +class Solution { + public int[] solution(int n, int s) { + if (s < n) { + return new int[]{-1}; + } + + int[] answer = new int[n]; + + int m = s / n; + int r = s % n; + + Arrays.fill(answer, m); + + for (int i = n - r; i < n; i++) { + answer[i]++; + } + + return answer; + } +} diff --git "a/week3/\352\271\200\353\202\230\354\235\200/programmers/K\353\262\210\354\247\270\354\210\230.java" "b/week3/\352\271\200\353\202\230\354\235\200/programmers/K\353\262\210\354\247\270\354\210\230.java" new file mode 100644 index 0000000..a3cdf8a --- /dev/null +++ "b/week3/\352\271\200\353\202\230\354\235\200/programmers/K\353\262\210\354\247\270\354\210\230.java" @@ -0,0 +1,27 @@ +package week3.김나은.programmers; + +import java.util.Arrays; + +class K번째수 { + + class Solution { + + public int[] solution(int[] array, int[][] commands) { + + int[] answer = new int[commands.length]; + + // i, j, k를 담은 배열 순회 + for (int i = 0; i < commands.length; i++) { + // i - 1번째 수부터 j직전까지 배열 추출 + int[] temp = Arrays.copyOfRange(array, commands[i][0] - 1, commands[i][1]); + + // 추출한 배열 오름차순 정렬 + Arrays.sort(temp); + + // K번째 수 answer 배열에 담기 + answer[i] = temp[commands[i][2] - 1]; + } + return answer; + } + } +} diff --git "a/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\352\263\265\354\234\240\352\270\260_\354\204\244\354\271\230.java" "b/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\352\263\265\354\234\240\352\270\260_\354\204\244\354\271\230.java" new file mode 100644 index 0000000..1879f40 --- /dev/null +++ "b/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\352\263\265\354\234\240\352\270\260_\354\204\244\354\271\230.java" @@ -0,0 +1,80 @@ +package week30.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +/** + * PackageName : week30.강성욱.baekjoon + * FileName : 공유기_설치 + * Author : Baekgwa + * Date : 25. 11. 24. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 24. Baekgwa Initial creation + */ +public class 공유기_설치 { + public class Main { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + int N = Integer.parseInt(st.nextToken()); + int C = Integer.parseInt(st.nextToken()); + + int[] map = new int[N]; + for (int i=0; i= gap) { + nowCount++; + before = nowHousePos; + } + + if(maxCount <= nowCount) return true; // 공유기 설치가 완료되면 더 이상 볼 필요가 없음 + } + + return maxCount <= nowCount; + } + } +} diff --git "a/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\354\226\264\353\221\220\354\232\264_\352\265\264\353\213\244\353\246\254.java" "b/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\354\226\264\353\221\220\354\232\264_\352\265\264\353\213\244\353\246\254.java" new file mode 100644 index 0000000..78ec9ce --- /dev/null +++ "b/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\354\226\264\353\221\220\354\232\264_\352\265\264\353\213\244\353\246\254.java" @@ -0,0 +1,67 @@ +package week30.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week30.강성욱.baekjoon + * FileName : 어두운_굴다리 + * Author : Baekgwa + * Date : 25. 11. 24. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 24. Baekgwa Initial creation + */ +public class 어두운_굴다리 { + public class Main { + static int N, M; + static int[] pos; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + N = Integer.parseInt(br.readLine()); + M = Integer.parseInt(br.readLine()); + + pos = new int[M]; + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < M; i++) { + pos[i] = Integer.parseInt(st.nextToken()); + } + + int left = 0; + int right = N; + int mid; + + while (left < right) { + mid = (left + right) / 2; + + // 가능 여부 확인 + if (check(mid)) { //가능 + right = mid; + } else { // 불가능 + left = mid + 1; + } + } + + System.out.println(left); + } + + private static boolean check(int h) { + int reach = 0; + + for (int x : pos) { + if (x - h > reach) + return false; + reach = x + h; // 현재 높이 + 포지션 만큼 커버 가능 + if (reach >= N) + return true; + } + + return reach >= N; + } + } +} diff --git "a/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\2602.java" "b/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\2602.java" new file mode 100644 index 0000000..9397c04 --- /dev/null +++ "b/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\2602.java" @@ -0,0 +1,128 @@ +package week30.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.PriorityQueue; +import java.util.StringTokenizer; + +/** + * PackageName : week30.강성욱.baekjoon + * FileName : 최소비용_구하기2 + * Author : Baekgwa + * Date : 25. 11. 24. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 24. Baekgwa Initial creation + */ +public class 최소비용_구하기2 { + public class Main { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine()); // 도시의 개수 + int m = Integer.parseInt(br.readLine()); // 버스의 개수 + + // 그래프 초기화 + List> graph = new ArrayList<>(); + for (int i = 0; i <= n; i++) { + graph.add(new ArrayList<>()); + } + + // 그래프 (간선) 추가 + for (int i = 0; i < m; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int from = Integer.parseInt(st.nextToken()); + int to = Integer.parseInt(st.nextToken()); + int cost = Integer.parseInt(st.nextToken()); + + graph.get(from).add(new Edge(to, cost)); + } + + // 시작 / 출발 노드 확인 + StringTokenizer st = new StringTokenizer(br.readLine()); + int start = Integer.parseInt(st.nextToken()); + int end = Integer.parseInt(st.nextToken()); + + // PQ 선언 및 최소거리 테이블 초기화 + int[] dist = new int[n + 1]; + Arrays.fill(dist, Integer.MAX_VALUE); + dist[start] = 0; + + // 경로 추적을 위한 테이블 + int[] preCity = new int[n + 1]; + + PriorityQueue pq = new PriorityQueue<>((a, b) -> a.getCost() - b.getCost()); + pq.offer(new Edge(start, 0)); + + // 다익스트라 시작 + while (!pq.isEmpty()) { + Edge now = pq.poll(); + int from = now.getNode(); + int nowCost = now.getCost(); // 해당 노드까지 도달하기 위해 사용한 비용 + + if (dist[from] < nowCost) + continue; + + for (Edge nextEdge : graph.get(from)) { + int to = nextEdge.getNode(); + int nextCost = nextEdge.getCost() + nowCost; + + // 이동할 곳이 현재 노드를 거쳐서 진행하는 것보다 더 이득인 경우에는, 여기 가지는 뻗지않고 종료 + if (dist[to] <= nextCost) + continue; + + // 이동하여, 최소 거리 테이블 업데이트 및 pq 추가, + 경로 추적 + dist[to] = nextCost; + pq.offer(new Edge(to, nextCost)); + preCity[to] = from; + } + } + + // 최소 비용 출력 + System.out.println(dist[end]); + + // 도시의 개수 및 경로 출력 + StringBuilder sb = new StringBuilder(); + List visited = new ArrayList<>(); + int now = end; + while (now != 0) { + visited.add(now); + if(now == start) break; + now = preCity[now]; + } + // visited = visited.reversed(); + Collections.reverse(visited); + for (Integer i : visited) { + sb.append(i).append(" "); + } + + System.out.println(visited.size()); + System.out.println(sb); + } + + public static class Edge { + private int node; + private int cost; + + public Edge(int node, int cost) { + this.node = node; + this.cost = cost; + } + + public int getNode() { + return node; + } + + public int getCost() { + return cost; + } + } + } +} diff --git "a/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\355\207\264\354\202\254.java" "b/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\355\207\264\354\202\254.java" new file mode 100644 index 0000000..ca0a11b --- /dev/null +++ "b/week30/\352\260\225\354\204\261\354\232\261/baekjoon/\355\207\264\354\202\254.java" @@ -0,0 +1,50 @@ +package week30.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week30.강성욱.baekjoon + * FileName : 퇴사 + * Author : Baekgwa + * Date : 25. 11. 24. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 11. 24. Baekgwa Initial creation + */ +public class 퇴사 { + public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + + int[] T = new int[N + 1]; + int[] P = new int[N + 1]; + + for (int i = 1; i <= N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + T[i] = Integer.parseInt(st.nextToken()); + P[i] = Integer.parseInt(st.nextToken()); + } + + int[] dp = new int[N + 2]; + + for (int i = N; i >= 1; i--) { + int nextDay = i + T[i]; + + if (nextDay > N + 1) { + dp[i] = dp[i + 1]; + } + else { + dp[i] = Math.max(dp[i + 1], P[i] + dp[nextDay]); + } + } + System.out.println(dp[1]); + } + } +} diff --git "a/week30/\354\235\264\354\203\201\354\226\265/backjoon/\352\263\265\354\234\240\352\270\260_\354\204\244\354\271\230.java" "b/week30/\354\235\264\354\203\201\354\226\265/backjoon/\352\263\265\354\234\240\352\270\260_\354\204\244\354\271\230.java" new file mode 100644 index 0000000..b4ee557 --- /dev/null +++ "b/week30/\354\235\264\354\203\201\354\226\265/backjoon/\352\263\265\354\234\240\352\270\260_\354\204\244\354\271\230.java" @@ -0,0 +1,53 @@ +import java.util.*; +import java.io.*; + + +public class Main{ + public static void main(String[] args) throws IOException{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + StringTokenizer st = new StringTokenizer(br.readLine()); + int N = Integer.parseInt(st.nextToken()); + int C = Integer.parseInt(st.nextToken()); + + int[] pos = new int[N]; + + for(int i = 0; i < N; i++){ + pos[i] = Integer.parseInt(br.readLine()); + } + + Arrays.sort(pos); + + int low = 1; + int high = pos[N - 1] - pos[0] + 1; + + while (low < high) { + int mid = (low + high) / 2; + + if (check(mid, pos, C)) { + low = mid + 1; // 더 큰 거리 시도 + } else { + high = mid; // 거리 줄여야 함 + } + } + + System.out.println(low - 1); + + } + + static boolean check(int D, int[] pos, int C){ + int count = 1; + int last = pos[0]; + + for(int i = 1; i < pos.length; i++){ + if(pos[i] - last >= D){ + count ++; + last = pos[i]; + } + if ( count >= C) return true; + + } + return false; + } + +} \ No newline at end of file diff --git "a/week30/\354\235\264\354\203\201\354\226\265/backjoon/\354\226\264\353\221\220\354\232\264_\352\265\264\353\213\244\353\246\254.java" "b/week30/\354\235\264\354\203\201\354\226\265/backjoon/\354\226\264\353\221\220\354\232\264_\352\265\264\353\213\244\353\246\254.java" new file mode 100644 index 0000000..64d15db --- /dev/null +++ "b/week30/\354\235\264\354\203\201\354\226\265/backjoon/\354\226\264\353\221\220\354\232\264_\352\265\264\353\213\244\353\246\254.java" @@ -0,0 +1,53 @@ +import java.util.*; +import java.io.*; + +public class Main{ + public static void main(String[] args) throws IOException{ + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); // 길이 + int M = Integer.parseInt(br.readLine()); // 개수 + + int[] pos = new int[M]; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for(int i = 0; i < M; i++){ + pos[i] = Integer.parseInt(st.nextToken()); + } + + int low = 0; + int high = N; + + + + while(low < high){ + int mid = (low + high) / 2; + + if(check(mid,pos,N)) { + high = mid; + } else { + low = mid + 1; + } + } + + System.out.println(low); + } + + static boolean check(int H, int[] pos, int N){ + int cover = 0; + + for(int x : pos){ + + if ( cover < x - H ) return false; + + cover = x + H; + + // 끝까지 밝힘 + if( cover >= N ) return true; + } + + return cover >= N; + } + +} \ No newline at end of file diff --git "a/week30/\354\235\264\354\203\201\354\226\265/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\2602.java" "b/week30/\354\235\264\354\203\201\354\226\265/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\2602.java" new file mode 100644 index 0000000..668d57b --- /dev/null +++ "b/week30/\354\235\264\354\203\201\354\226\265/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\2602.java" @@ -0,0 +1,90 @@ +import java.io.*; +import java.util.*; + +public class Main{ + + static class Node { + int v, cost; + Node(int v, int cost){ + this.v = v; + this.cost = cost; + } + } + + static List> graph; + static int[] dist; + static boolean[] visit; + static int N, M; + static int[] prev; + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); // 도시 수 + M = Integer.parseInt(br.readLine()); // 버스 수 + + graph = new ArrayList<>(); + for(int i = 0; i <= N; i++){ + graph.add(new ArrayList<>()); + } + + for(int i = 0; i < M; i++){ + StringTokenizer st = new StringTokenizer(br.readLine()); + int from = Integer.parseInt(st.nextToken()); + int to = Integer.parseInt(st.nextToken()); + int cost = Integer.parseInt(st.nextToken()); + + graph.get(from).add(new Node(to, cost)); + } + + StringTokenizer st = new StringTokenizer(br.readLine()); + int start = Integer.parseInt(st.nextToken()); + int end = Integer.parseInt(st.nextToken()); + + dist = new int[N+1]; + visit = new boolean[N+1]; + prev = new int[N+1]; + + Arrays.fill(dist, Integer.MAX_VALUE); + + dijkstra(start); + + + List path = new ArrayList<>(); + int cur = end; + while(true){ + path.add(cur); + if(cur == start) break; + cur = prev[cur]; + } + + Collections.reverse(path); + + System.out.println(dist[end]); + System.out.println(path.size()); + for(int city : path) System.out.print(city + " "); + } + + + static void dijkstra(int start){ + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1.cost - o2.cost); + pq.add(new Node(start, 0)); + dist[start] = 0; + + while(!pq.isEmpty()){ + Node now = pq.poll(); + + if(visit[now.v]) continue; + visit[now.v] = true; + + for(Node next : graph.get(now.v)){ + if(!visit[next.v] && dist[next.v] > dist[now.v] + next.cost){ + dist[next.v] = dist[now.v] + next.cost; + prev[next.v] = now.v; + pq.add(new Node(next.v, dist[next.v])); + } + } + } + } +} \ No newline at end of file diff --git "a/week30/\354\235\264\354\203\201\354\226\265/backjoon/\355\207\264\354\202\254.java" "b/week30/\354\235\264\354\203\201\354\226\265/backjoon/\355\207\264\354\202\254.java" new file mode 100644 index 0000000..942f89a --- /dev/null +++ "b/week30/\354\235\264\354\203\201\354\226\265/backjoon/\355\207\264\354\202\254.java" @@ -0,0 +1,38 @@ +import java.util.*; +import java.io.*; + + +public class Main { + public static void main(String[] args) throws IOException{ + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + + int[] T = new int[N]; + int[] P = new int[N]; + + for(int i = 0; i < N; i++){ + StringTokenizer st = new StringTokenizer(br.readLine()); + T[i] = Integer.parseInt(st.nextToken()); + P[i] = Integer.parseInt(st.nextToken()); + + } + + int[] dp = new int[N+2]; + + for(int i = 0; i < N; i++){ + int finish = i + T[i]; + + dp[i+1] = Math.max(dp[i+1], dp[i]); + + if(finish <= N){ + dp[finish] = Math.max(dp[finish], dp[i] + P[i]); + } + } + + int answer = Math.max(dp[N],dp[N+1]); + System.out.println(answer); + + } +} \ No newline at end of file diff --git "a/week31/\352\260\225\354\204\261\354\232\261/baekjoon/\353\250\271\354\235\204_\352\262\203\354\235\270\352\260\200_\353\250\271\355\236\220_\352\262\203\354\235\270\352\260\200.java" "b/week31/\352\260\225\354\204\261\354\232\261/baekjoon/\353\250\271\354\235\204_\352\262\203\354\235\270\352\260\200_\353\250\271\355\236\220_\352\262\203\354\235\270\352\260\200.java" new file mode 100644 index 0000000..619769f --- /dev/null +++ "b/week31/\352\260\225\354\204\261\354\232\261/baekjoon/\353\250\271\354\235\204_\352\262\203\354\235\270\352\260\200_\353\250\271\355\236\220_\352\262\203\354\235\270\352\260\200.java" @@ -0,0 +1,72 @@ +package week31.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +/** + * PackageName : week31.강성욱.baekjoon + * FileName : 먹을_것인가_먹힐_것인가 + * Author : Baekgwa + * Date : 25. 12. 2. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 2. Baekgwa Initial creation + */ +public class 먹을_것인가_먹힐_것인가 { + public class Main { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int testCase = Integer.parseInt(br.readLine()); + StringBuilder sb = new StringBuilder(); + + for(int i=0; i 0 && b[idx -1] == nowA) { + idx--; + } + count = idx; + } + + result += count; + } + + sb.append(result).append("\n"); + } + + System.out.println(sb); + } + } +} diff --git "a/week31/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\203\354\226\264\353\262\204\353\246\260_\352\264\204\355\230\270.java" "b/week31/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\203\354\226\264\353\262\204\353\246\260_\352\264\204\355\230\270.java" new file mode 100644 index 0000000..5db1750 --- /dev/null +++ "b/week31/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\203\354\226\264\353\262\204\353\246\260_\352\264\204\355\230\270.java" @@ -0,0 +1,48 @@ +package week31.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * PackageName : week31.강성욱.baekjoon + * FileName : 잃어버린_괄호 + * Author : Baekgwa + * Date : 25. 12. 2. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 2. Baekgwa Initial creation + */ +public class 잃어버린_괄호 { + public class Main { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String[] split = br.readLine().split("-"); // - 기준으로 나눔 + + int result = 0; + + result += sum(split[0]); + + for (int i = 1; i < split.length; i++) { + result -= sum(split[i]); + } + + System.out.println(result); + } + + private static int sum(String split) { + // 이 안에는 + 밖에없음 + String[] array = split.split("\\+"); + + int result = 0; + for (String s : array) { + result += Integer.parseInt(s); + } + + return result; + } + } +} diff --git "a/week31/\352\260\225\354\204\261\354\232\261/programmers/\352\270\260\354\247\200\352\265\255_\354\204\244\354\271\230.java" "b/week31/\352\260\225\354\204\261\354\232\261/programmers/\352\270\260\354\247\200\352\265\255_\354\204\244\354\271\230.java" new file mode 100644 index 0000000..3f70324 --- /dev/null +++ "b/week31/\352\260\225\354\204\261\354\232\261/programmers/\352\270\260\354\247\200\352\265\255_\354\204\244\354\271\230.java" @@ -0,0 +1,52 @@ +package week31.강성욱.programmers; + +/** + * PackageName : week31.강성욱.programmers + * FileName : 기지국_설치 + * Author : Baekgwa + * Date : 25. 12. 2. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 2. Baekgwa Initial creation + */ +public class 기지국_설치 { + // 간격으로 확인? + // 그냥 설치를 하면서, 이번에 설치한 부분이, 기존 설치된 기지국에 영향을 받는곳에 있다면 스킵? + // 빈 구간을 확인해야함. + // 이걸 List 로 정리해서 각 구간별로 추가로 설치해야될껄 계산하면 될듯? + + class Solution { + public int solution(int n, int[] stations, int w) { + // 전파 된 범위 확인 + int start = 1; + int result = 0; + int cover = w * 2 + 1; + + for(int station : stations) { + int left = start; + int right = station - w - 1; + + result += calc(left, right, cover); + + start = station + w + 1; + } + + //만약 끝까지 가지 못하면, 빈곳 한번 더 처리해야함. + // start ~ 끝까지 + if(start <= n) { + result += calc(start, n, cover); + } + // System.out.println(emptyList.toString()); + + return result; + } + + private int calc(int left, int right, int cover) { + int gap = right - left + 1; + if (gap <= 0) return 0; + return (gap + cover - 1) / cover; + } + } +} diff --git "a/week31/\352\260\225\354\204\261\354\232\261/programmers/\353\271\204\353\260\200_\354\275\224\353\223\234_\355\225\264\353\217\205.java" "b/week31/\352\260\225\354\204\261\354\232\261/programmers/\353\271\204\353\260\200_\354\275\224\353\223\234_\355\225\264\353\217\205.java" new file mode 100644 index 0000000..833a1dc --- /dev/null +++ "b/week31/\352\260\225\354\204\261\354\232\261/programmers/\353\271\204\353\260\200_\354\275\224\353\223\234_\355\225\264\353\217\205.java" @@ -0,0 +1,81 @@ +package week31.강성욱.programmers; + +import java.util.ArrayList; +import java.util.List; + +/** + * PackageName : week31.강성욱.programmers + * FileName : 비밀_코드_해독 + * Author : Baekgwa + * Date : 25. 12. 2. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 2. Baekgwa Initial creation + */ +public class 비밀_코드_해독 { + // 조합 다 만들어서 처리 + // 30c5 + // 30 * 29 * 28 * 27 * 26 / 5! + class Solution { + public static List> combList = new ArrayList<>(); + + public int solution(int n, int[][] q, int[] ans) { + //백트래킹을 활용한 조합 만들기 + makeComb(1, n, new ArrayList<>()); + + int result = validComb(q, ans); + + return result; + } + + // 생성된 조합들을 조회하며 검증 확인 + private int validComb(int[][] q, int[] ans) { + int count = 0; + + // contains로 검증하면 될듯? + for(List comb : combList) { + + boolean isValid = true; + + for(int idx=0; idx nowComb) { + // 5개 다 채우면, 끝 + if(nowComb.size() >= 5) { + combList.add(new ArrayList<>(nowComb)); + return; + } + + // 1 + // -> 1, 2 + // -> 1, 2, 3 + // -> 1, 2, 3, 4... + // -> 1, 3 + for(int i=start; i<=n; i++) { + nowComb.add(i); + makeComb(i+1, n, nowComb); + nowComb.remove(nowComb.size() -1); //백트래킹, 마지막꺼 지우기 + } + } + } +} diff --git "a/week31/\354\235\264\354\203\201\354\226\265/backjoon/\353\250\271\354\235\204_\352\262\203\354\235\270\352\260\200_\353\250\271\355\236\220_\352\262\203\354\235\270\352\260\200.java" "b/week31/\354\235\264\354\203\201\354\226\265/backjoon/\353\250\271\354\235\204_\352\262\203\354\235\270\352\260\200_\353\250\271\355\236\220_\352\262\203\354\235\270\352\260\200.java" new file mode 100644 index 0000000..263b7ac --- /dev/null +++ "b/week31/\354\235\264\354\203\201\354\226\265/backjoon/\353\250\271\354\235\204_\352\262\203\354\235\270\352\260\200_\353\250\271\355\236\220_\352\262\203\354\235\270\352\260\200.java" @@ -0,0 +1,57 @@ +import java.util.*; +import java.io.*; + +public class Main{ + public static void main(String[] args) throws IOException{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + int T = Integer.parseInt(br.readLine()); + + while(T -- > 0) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int N = Integer.parseInt(st.nextToken()); + int M = Integer.parseInt(st.nextToken()); + + int[] A = new int[N]; + int[] B = new int[M]; + + st = new StringTokenizer(br.readLine()); + for(int i = 0; i < N; i++){ + A[i] = Integer.parseInt(st.nextToken()); + } + + st = new StringTokenizer(br.readLine()); + for(int i = 0; i < M; i++){ + B[i] = Integer.parseInt(st.nextToken()); + } + + Arrays.sort(B); + + int count = 0; + + for(int x : A) { + int idx = check(B,x); + count += idx; + } + sb.append(count).append("\n"); + } + System.out.print(sb.toString()); + } + + public static int check(int[] arr, int target){ + int left = 0; + int right = arr.length; + + while ( left < right){ + int mid = (left + right) / 2; + + if(arr[mid] < target){ + left = mid + 1; + } else { + right = mid; + } + } + return left; + } +} diff --git "a/week31/\354\235\264\354\203\201\354\226\265/backjoon/\354\236\203\354\226\264\353\262\204\353\246\260_\352\264\204\355\230\270.java" "b/week31/\354\235\264\354\203\201\354\226\265/backjoon/\354\236\203\354\226\264\353\262\204\353\246\260_\352\264\204\355\230\270.java" new file mode 100644 index 0000000..575eb31 --- /dev/null +++ "b/week31/\354\235\264\354\203\201\354\226\265/backjoon/\354\236\203\354\226\264\353\262\204\353\246\260_\352\264\204\355\230\270.java" @@ -0,0 +1,51 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + String expression = br.readLine(); + + List numbers = new ArrayList<>(); + List op = new ArrayList<>(); + + StringBuilder sb = new StringBuilder(); + + for(int i = 0 ; i < expression.length(); i++){ + char c = expression.charAt(i); + + if(c == '+' || c == '-'){ + numbers.add(Integer.parseInt(sb.toString())); + op.add(c); + sb.setLength(0); + } else { + sb.append(c); + } + } + numbers.add(Integer.parseInt(sb.toString())); + + + int result = numbers.get(0); + boolean minusmode = false; + + int idx = 1; + + for(int i = 0; i < op.size(); i++){ + char oper = op.get(i); + + if(oper == '-'){ + minusmode = true; + result -= numbers.get(idx++); + } else { + if(minusmode){ + result -= numbers.get(idx++); + } else{ + result += numbers.get(idx++); + } + } + } + + System.out.println(result); + } +} diff --git "a/week31/\354\235\264\354\203\201\354\226\265/progarmmers/\352\270\260\354\247\200\352\265\255_\354\204\244\354\271\230.java" "b/week31/\354\235\264\354\203\201\354\226\265/progarmmers/\352\270\260\354\247\200\352\265\255_\354\204\244\354\271\230.java" new file mode 100644 index 0000000..36d8972 --- /dev/null +++ "b/week31/\354\235\264\354\203\201\354\226\265/progarmmers/\352\270\260\354\247\200\352\265\255_\354\204\244\354\271\230.java" @@ -0,0 +1,26 @@ +class Solution { + public int solution(int n, int[] stations, int w) { + int answer = 0; + + int cover = 2 * w + 1; + int pos = 1; + + for(int st : stations){ + int left = st - w; + + if(pos < left) { + int gap = left - pos; + answer += (gap + cover - 1) / cover; + } + + pos = st + w + 1; + } + + if(pos <= n){ + int gap = n - pos + 1; + answer += (gap + cover - 1) / cover; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week31/\354\235\264\354\203\201\354\226\265/progarmmers/\353\271\204\353\260\200_\354\275\224\353\223\234_\355\225\264\353\217\205.java" "b/week31/\354\235\264\354\203\201\354\226\265/progarmmers/\353\271\204\353\260\200_\354\275\224\353\223\234_\355\225\264\353\217\205.java" new file mode 100644 index 0000000..c1e75ea --- /dev/null +++ "b/week31/\354\235\264\354\203\201\354\226\265/progarmmers/\353\271\204\353\260\200_\354\275\224\353\223\234_\355\225\264\353\217\205.java" @@ -0,0 +1,45 @@ +import java.util.*; + +class Solution { + public int solution(int n, int[][] q, int[] ans) { + int answer = 0; + + int[] numbers = new int[n]; + for (int i = 0; i < n; i++) numbers[i] = i + 1; + + whgkq(numbers, new ArrayList<>(), q, ans, 0); + + answer = validcount; + return answer; + } + + int validcount = 0; + + public void whgkq(int[] numbers, List current, int[][] q, int[] ans, int idx) { + if (current.size() == 5) { + if (isvalid(current, q, ans)) validcount++; + return; + } + if (idx >= numbers.length) return; + + current.add(numbers[idx]); + whgkq(numbers, current, q, ans, idx + 1); + + current.remove(current.size() - 1); + whgkq(numbers, current, q, ans, idx + 1); + } + + public boolean isvalid(List current, int[][] q, int[] ans) { + Set set = new HashSet<>(current); + + for (int i = 0; i < q.length; i++) { + int count = 0; + for (int k : q[i]) { + if (set.contains(k)) count++; + } + + if (ans[i] != count) return false; + } + return true; + } +} diff --git "a/week32/\352\260\225\354\204\261\354\232\261/baekjoon/\352\263\204\353\213\250_\354\230\244\353\245\264\352\270\260.java" "b/week32/\352\260\225\354\204\261\354\232\261/baekjoon/\352\263\204\353\213\250_\354\230\244\353\245\264\352\270\260.java" new file mode 100644 index 0000000..8decb36 --- /dev/null +++ "b/week32/\352\260\225\354\204\261\354\232\261/baekjoon/\352\263\204\353\213\250_\354\230\244\353\245\264\352\270\260.java" @@ -0,0 +1,44 @@ +package week32.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * PackageName : week32.강성욱.baekjoon + * FileName : 계단_오르기 + * Author : Baekgwa + * Date : 25. 12. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 12. Baekgwa Initial creation + */ +public class 계단_오르기 { + public class Main { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int count = Integer.parseInt(br.readLine()); + int[] score = new int[count + 1]; + + for (int i = 1; i <= count; i++) { + score[i] = Integer.parseInt(br.readLine()); + } + + int[] dp = new int[count + 1]; + dp[1] = score[1]; + + if (count >= 2) { + dp[2] = score[1] + score[2]; + } + + for (int i = 3; i <= count; i++) { + dp[i] = Math.max(dp[i - 2], dp[i - 3] + score[i - 1]) + score[i]; + } + + System.out.println(dp[count]); + } + } +} diff --git "a/week32/\352\260\225\354\204\261\354\232\261/baekjoon/\353\241\234\353\230\220.java" "b/week32/\352\260\225\354\204\261\354\232\261/baekjoon/\353\241\234\353\230\220.java" new file mode 100644 index 0000000..513bd57 --- /dev/null +++ "b/week32/\352\260\225\354\204\261\354\232\261/baekjoon/\353\241\234\353\230\220.java" @@ -0,0 +1,64 @@ +package week32.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week32.강성욱.baekjoon + * FileName : 로또 + * Author : Baekgwa + * Date : 25. 12. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 12. Baekgwa Initial creation + */ +public class 로또 { + public class Main { + + static int k; + static int[] s; + static int[] picked = new int[6]; + static StringBuilder sb = new StringBuilder(); + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + while(true) { + String line = br.readLine(); + if (line.equals("0")) break; + + StringTokenizer st = new StringTokenizer(line); + k = Integer.parseInt(st.nextToken()); + + s = new int[k]; + for (int i = 0; i < k; i++) { + s[i] = Integer.parseInt(st.nextToken()); + } + + back(0, 0); + sb.append("\n"); + } + + System.out.println(sb.toString()); + } + + private static void back(int depth, int start) { + if (depth == 6) { + for (int i = 0; i < 6; i++) { + sb.append(picked[i]).append(" "); + } + sb.append("\n"); + return; + } + + for (int i = start; i < k; i++) { + picked[depth] = s[i]; + back(depth + 1, i + 1); + } + } + } +} diff --git "a/week32/\352\260\225\354\204\261\354\232\261/programmers/\354\212\244\355\213\260\354\273\244_\353\252\250\354\234\274\352\270\260_2.java" "b/week32/\352\260\225\354\204\261\354\232\261/programmers/\354\212\244\355\213\260\354\273\244_\353\252\250\354\234\274\352\270\260_2.java" new file mode 100644 index 0000000..8c41407 --- /dev/null +++ "b/week32/\352\260\225\354\204\261\354\232\261/programmers/\354\212\244\355\213\260\354\273\244_\353\252\250\354\234\274\352\270\260_2.java" @@ -0,0 +1,38 @@ +package week32.강성욱.programmers; + +/** + * PackageName : week32.강성욱.programmers + * FileName : 스티커_모으기_2 + * Author : Baekgwa + * Date : 25. 12. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 12. Baekgwa Initial creation + */ +public class 스티커_모으기_2 { + class Solution { + public int solution(int[] sticker) { + int n = sticker.length; + if (n == 1) return sticker[0]; + if (n == 2) return Math.max(sticker[0], sticker[1]); + + int[] dp1 = new int[n]; + dp1[0] = sticker[0]; + dp1[1] = sticker[0]; + for (int i = 2; i < n - 1; i++) { + dp1[i] = Math.max(dp1[i - 1], dp1[i - 2] + sticker[i]); + } + + int[] dp2 = new int[n]; + dp2[0] = 0; + dp2[1] = sticker[1]; + for (int i = 2; i < n; i++) { + dp2[i] = Math.max(dp2[i - 1], dp2[i - 2] + sticker[i]); + } + + return Math.max(dp1[n - 2], dp2[n - 1]); + } + } +} diff --git "a/week32/\354\235\264\354\203\201\354\226\265/backjoon/\352\263\204\353\213\250_\354\230\244\353\245\264\352\270\260.java" "b/week32/\354\235\264\354\203\201\354\226\265/backjoon/\352\263\204\353\213\250_\354\230\244\353\245\264\352\270\260.java" new file mode 100644 index 0000000..4fac18a --- /dev/null +++ "b/week32/\354\235\264\354\203\201\354\226\265/backjoon/\352\263\204\353\213\250_\354\230\244\353\245\264\352\270\260.java" @@ -0,0 +1,36 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int n = Integer.parseInt(br.readLine()); + int[] score = new int[n + 1]; + int[] dp = new int[n + 1]; + + for (int i = 1; i <= n; i++) { + score[i] = Integer.parseInt(br.readLine()); + } + + if (n == 1) { + System.out.println(score[1]); + return; + } + if (n == 2) { + System.out.println(score[1] + score[2]); + return; + } + + dp[1] = score[1]; + dp[2] = score[1] + score[2]; + dp[3] = Math.max(score[1], score[2]) + score[3]; + + for (int i = 4; i <= n; i++) { + dp[i] = Math.max(dp[i - 2], dp[i - 3] + score[i - 1]) + score[i]; + } + + System.out.println(dp[n]); + } +} diff --git "a/week32/\354\235\264\354\203\201\354\226\265/backjoon/\353\241\234\353\230\220.java" "b/week32/\354\235\264\354\203\201\354\226\265/backjoon/\353\241\234\353\230\220.java" new file mode 100644 index 0000000..96920e1 --- /dev/null +++ "b/week32/\354\235\264\354\203\201\354\226\265/backjoon/\353\241\234\353\230\220.java" @@ -0,0 +1,49 @@ +import java.util.*; +import java.io.*; + +public class Main { + + static int k; + static int[] S; + static int[] pick = new int[6]; + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + while (true) { + + StringTokenizer st = new StringTokenizer(br.readLine()); + k = Integer.parseInt(st.nextToken()); + + if (k == 0) break; + + S = new int[k]; + for (int i = 0; i < k; i++) { + S[i] = Integer.parseInt(st.nextToken()); + } + + dfs(0, 0, sb); + sb.append("\n"); + } + + System.out.print(sb.toString()); + } + + public static void dfs(int start, int depth, StringBuilder sb) { + + if (depth == 6) { + for (int i = 0; i < 6; i++) { + sb.append(pick[i]).append(" "); + } + sb.append("\n"); + return; + } + + for (int i = start; i < k; i++) { + pick[depth] = S[i]; + dfs(i + 1, depth + 1, sb); + } + } +} diff --git "a/week32/\354\235\264\354\203\201\354\226\265/progarmmers/\354\212\244\355\213\260\354\273\244_\353\252\250\354\234\274\352\270\260.java" "b/week32/\354\235\264\354\203\201\354\226\265/progarmmers/\354\212\244\355\213\260\354\273\244_\353\252\250\354\234\274\352\270\260.java" new file mode 100644 index 0000000..381af94 --- /dev/null +++ "b/week32/\354\235\264\354\203\201\354\226\265/progarmmers/\354\212\244\355\213\260\354\273\244_\353\252\250\354\234\274\352\270\260.java" @@ -0,0 +1,28 @@ +class Solution { + public int solution(int sticker[]) { + int answer = 0; + + int n = sticker.length; + + if (n == 1) return sticker[0]; + + int[] dp_first = new int[n]; // 첫 번째 사용, 마지막 x + int[] dp_second = new int[n]; // 두 번째 사용, 마지막 o + + dp_first[0] = sticker[0]; + dp_first[1] = dp_first[0]; + + dp_second[0] = 0; + dp_second[1] = sticker[1]; + + for(int i = 2; i < n -1 ; i++){ + dp_first[i] = Math.max(dp_first[i-1],dp_first[i-2]+sticker[i]); + } + for(int i = 2; i < n ; i++){ + dp_second[i] = Math.max(dp_second[i-1],dp_second[i-2]+sticker[i]); + } + + + return Math.max(dp_first[n-2],dp_second[n-1]); + } +} \ No newline at end of file diff --git "a/week33/\352\260\225\354\204\261\354\232\261/baekjoon/\354\210\234\354\204\234\354\214\215\354\235\230_\352\263\261\354\235\230_\355\225\251.java" "b/week33/\352\260\225\354\204\261\354\232\261/baekjoon/\354\210\234\354\204\234\354\214\215\354\235\230_\352\263\261\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..acedefb --- /dev/null +++ "b/week33/\352\260\225\354\204\261\354\232\261/baekjoon/\354\210\234\354\204\234\354\214\215\354\235\230_\352\263\261\354\235\230_\355\225\251.java" @@ -0,0 +1,62 @@ +package week33.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week33 + * FileName : 순서쌍의_곱의_합 + * Author : Baekgwa + * Date : 25. 12. 16. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 16. Baekgwa Initial creation + */ +public class 순서쌍의_곱의_합 { + public class Main { + // 100,000C2 + // 10000000000 / 2 + // 5,000,000,000 50억? 불가능. + + // [2, 3, 4, 5, 6, 7] 이면 + // (2 * 3) + (2 * 4) + (2 * 5) + (2 * 6) + (2 * 7) + // 6 + 8 + 10 + 12 + 14 = 50 + // 이걸 바꾸면? + // 2 * (3 + 4 + 5 + 6 + 7) 으로 대체 가능? + // = 50 + // 아 이렇게 풀면 될듯? + // 그럼, 미리 1번인덱스 부터 n 인덱스 까지 합을 구하고, 하나씩 처리하면 되겠네 + + // 이거 더해놓는거 long 써야할듯? 10,000 이, 100,000 번 나오면? + // 1,000,000,000 + // 아 상관없네 + // 아 정답이 long 이어야 하것네 + + public static void main(String[] args) throws IOException { + int sum = 0; + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int count = Integer.parseInt(br.readLine()); + int[] map = new int[count]; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < count; i++) { + map[i] = Integer.parseInt(st.nextToken()); + if(i == 0) continue; + sum += map[i]; + } + + long result = 0; + for(int idx=1; idx oil = new PriorityQueue<>(Collections.reverseOrder()); // 지나온 곳 중, 오일 양 기준 PQ + PriorityQueue pos = new PriorityQueue<>(Comparator.comparingInt(a -> a.pos)); // 주유소 위치 + + StringTokenizer st; + for (int i = 0; i < N; i++) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); // 시작위치 에서 주유소 까지의 거리 + int b = Integer.parseInt(st.nextToken()); // 주유소에서 채울 수 있는 연료의 양 + pos.offer(new GasStation(a, b)); + } + + st = new StringTokenizer(br.readLine()); + int L = Integer.parseInt(st.nextToken()); // 도착지점 + int P = Integer.parseInt(st.nextToken()); // 현재 가지고 있는 기름 + + // 초반 처리 + int nowPos = P; //현재 위치는 기름만큼 갈 수 있음. + while(!pos.isEmpty()) { + GasStation peek = pos.peek(); + if(peek.getPos() > nowPos) break; + oil.offer(pos.poll().getOil()); + } + + // 반복을 통한 주유소 확인 + int visitCount = 0; + while(L > nowPos) { + // 도달하지 못했는데, 더이상 추가로 들릴 수 있는 주유소가 없다면, 마을에 도착 불가 + if(oil.isEmpty()) { + System.out.println(-1); + return; + } + + // 아직 도착지점에 도달하지 못함. + // 가장 큰 기름을 주는 주유소를 들렸다고 가정하고, pq 에서 뽑아쓰기 + Integer heapOil = oil.poll(); + nowPos += heapOil; // 최대 기름만큼 추가로 이동 + visitCount++; // 주유소 방문 횟수 증가 + + // 이동한 만큼, 주유소 정보 업데이트 + while(!pos.isEmpty()) { + GasStation peek = pos.peek(); + if(peek.getPos() > nowPos) break; + oil.offer(pos.poll().getOil()); + } + } + + System.out.println(visitCount); + } + + public static class GasStation { + private final int pos; + private final int oil; + + public GasStation(int pos, int oil) { + this.pos = pos; + this.oil = oil; + } + + public int getPos() { + return pos; + } + + public int getOil() { + return oil; + } + } + } +} diff --git "a/week33/\352\260\225\354\204\261\354\232\261/baekjoon/\354\230\244\355\201\260\354\210\230.java" "b/week33/\352\260\225\354\204\261\354\232\261/baekjoon/\354\230\244\355\201\260\354\210\230.java" new file mode 100644 index 0000000..19ee0e9 --- /dev/null +++ "b/week33/\352\260\225\354\204\261\354\232\261/baekjoon/\354\230\244\355\201\260\354\210\230.java" @@ -0,0 +1,63 @@ +package week33.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.StringTokenizer; + +/** + * PackageName : week33.강성욱.baekjoon + * FileName : 오큰수 + * Author : Baekgwa + * Date : 25. 12. 16. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 16. Baekgwa Initial creation + */ +public class 오큰수 { + public class Main { + // 오큰수 + // 0 번부터 시작해서 처리못하면, stack 에 넣기 + // 즉, stack 에 쌓이는 순서는, 항상 더 작은거 부터 나오게 됨 + // 따라서 가다가 어? 이건 오큰수가 아닌데 하면, 스택에 남아있는 모든건 현재 탐색에서는 오큰수 판별이 불가. + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int count = Integer.parseInt(br.readLine()); + + int[] map = new int[count]; + int[] result = new int[count]; + Arrays.fill(result, -1); + + ArrayDeque stack = new ArrayDeque<>(); + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < count; i++) { + // 입력 받기 + map[i] = Integer.parseInt(st.nextToken()); + + while (!stack.isEmpty()) { + // 인덱스 들어있음 + // 2, 3 + if (map[stack.peek()] >= map[i]) + break; + result[stack.pop()] = map[i]; + } + + stack.push(i); + } + + // 출력 정리 + StringBuilder sb = new StringBuilder(); + for (int now : result) { + sb.append(now).append(" "); + } + sb.deleteCharAt(sb.length() - 1); + System.out.println(sb); + } + } + +} diff --git "a/week33/\352\260\225\354\204\261\354\232\261/baekjoon/\354\271\264\354\225\275\352\263\274_\352\260\225\355\222\215.java" "b/week33/\352\260\225\354\204\261\354\232\261/baekjoon/\354\271\264\354\225\275\352\263\274_\352\260\225\355\222\215.java" new file mode 100644 index 0000000..6ff3db9 --- /dev/null +++ "b/week33/\352\260\225\354\204\261\354\232\261/baekjoon/\354\271\264\354\225\275\352\263\274_\352\260\225\355\222\215.java" @@ -0,0 +1,76 @@ +package week33.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +/** + * PackageName : week33.강성욱.baekjoon + * FileName : 카약과_강풍 + * Author : Baekgwa + * Date : 25. 12. 16. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 16. Baekgwa Initial creation + */ +public class 카약과_강풍 { + public class Main { + // 5팀 + // 2팀 부서짐 + // 1팀 여분 + // 1팀 ... 5팀 + // 1, 0, 2, 0, 1 + // 1, 1, 1, 0, 1 + // 범위도 안크고 그냥 구현하면 되지 않나? + // 뒤에꺼 빌려올 수 있음? 아니면 앞에꺼? 확인해서 처리하면 될듯 + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + StringTokenizer st = new StringTokenizer(br.readLine()); + int N = Integer.parseInt(st.nextToken());// 팀수 + int S = Integer.parseInt(st.nextToken());// 손상된 카약 개수 + int R = Integer.parseInt(st.nextToken()); // 더 가져온 팀의 개수 + + int[] map = new int[N]; + Arrays.fill(map, 1); + + // 손상된 팀 처리 + st = new StringTokenizer(br.readLine()); + for(int i=0; i= 1) continue; // 1개 이상 있으면 넘어가 + + // 앞뒤로 확인해서 빌려올 수 있는지 확인 + if(i != 0 && map[i-1] >= 2) { + --map[i-1]; + continue; + } + if(i != N-1 && map[i+1] >= 2){ + --map[i+1]; + continue; + } + + failCount++; + } + + System.out.println(failCount); + } + } +} diff --git "a/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\234\354\204\234\354\214\215\354\235\230_\352\263\261\354\235\230_\355\225\251.java" "b/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\234\354\204\234\354\214\215\354\235\230_\352\263\261\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..c0050df --- /dev/null +++ "b/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\234\354\204\234\354\214\215\354\235\230_\352\263\261\354\235\230_\355\225\251.java" @@ -0,0 +1,34 @@ +import java.util.*; +import java.io.*; + +// a1 a2 a3 a4 +// a1a2+a1a3+a1a4 a2a3+a2a4 a3a4 +// a1(a2+a3+a4) , a2(a3+a4) +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + int[] arr = new int[N]; + + long sum = 0; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + sum += arr[i]; + } + + long result = 0; + + for (int i = 0; i < N; i++) { + result += arr[i] * (sum - arr[i]); + sum -= arr[i]; + } + + System.out.println(result); + } +} diff --git "a/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\227\260\353\243\214_\354\261\204\354\232\260\352\270\260.java" "b/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\227\260\353\243\214_\354\261\204\354\232\260\352\270\260.java" new file mode 100644 index 0000000..6ae4ca6 --- /dev/null +++ "b/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\227\260\353\243\214_\354\261\204\354\232\260\352\270\260.java" @@ -0,0 +1,56 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + + int[] dist = new int[N]; + int[] fuel = new int[N]; + + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + dist[i] = Integer.parseInt(st.nextToken()); + fuel[i] = Integer.parseInt(st.nextToken()); + } + + StringTokenizer st = new StringTokenizer(br.readLine()); + int L = Integer.parseInt(st.nextToken()); // 마을까지 거리 + int P = Integer.parseInt(st.nextToken()); // 초기 연료 + + int[][] stations = new int[N][2]; + for (int i = 0; i < N; i++) { + stations[i][0] = dist[i]; + stations[i][1] = fuel[i]; + } + Arrays.sort(stations, (a, b) -> a[0] - b[0]); + + PriorityQueue pq = new PriorityQueue<>(Collections.reverseOrder()); + + int idx = 0; + int answer = 0; + + // 현재 연료 P로 마을에 도착할 수 있을 때까지 + while (P < L) { + + // 현재 연료로 갈 수 있는 주유소 전부 pq에 넣기 + while (idx < N && stations[idx][0] <= P) { + pq.add(stations[idx][1]); + idx++; + } + + if (pq.isEmpty()) { + System.out.println(-1); + return; + } + + P += pq.poll(); + answer++; + } + + System.out.println(answer); + } +} diff --git "a/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\230\244\355\201\260\354\210\230.java" "b/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\230\244\355\201\260\354\210\230.java" new file mode 100644 index 0000000..e903b68 --- /dev/null +++ "b/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\230\244\355\201\260\354\210\230.java" @@ -0,0 +1,38 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + + int[] arr = new int[N]; + int[] nge = new int[N]; + + Stack stack = new Stack<>(); + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + for (int i = 0; i < N; i++) { + while (!stack.isEmpty() && arr[stack.peek()] < arr[i]) { + nge[stack.pop()] = arr[i]; + } + stack.push(i); + } + + while (!stack.isEmpty()) { + nge[stack.pop()] = -1; + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < N; i++) { + sb.append(nge[i]).append(" "); + } + System.out.println(sb); + } +} diff --git "a/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\271\264\354\225\275\352\263\274_\352\260\225\355\222\215.java" "b/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\271\264\354\225\275\352\263\274_\352\260\225\355\222\215.java" new file mode 100644 index 0000000..99297e8 --- /dev/null +++ "b/week33/\354\235\264\354\203\201\354\226\265/backjoon/\354\271\264\354\225\275\352\263\274_\352\260\225\355\222\215.java" @@ -0,0 +1,52 @@ + +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int N = Integer.parseInt(st.nextToken()); // 전체 팀 수 + int S = Integer.parseInt(st.nextToken()); // 카약이 손상된 팀의 수 + int R = Integer.parseInt(st.nextToken()); // 가약을 더 가져온 팀의 수 + + int[] broken = new int[S]; + int[] extra = new int[R]; + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < S; i++) { + broken[i] = Integer.parseInt(st.nextToken()); + } + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < R; i++) { + extra[i] = Integer.parseInt(st.nextToken()); + } + + int[] team = new int[N + 1]; + + for (int x : broken) team[x]--; + for (int x : extra) team[x]++; + + for (int i = 1; i <= N; i++) { + if (team[i] == -1) { + if (i > 1 && team[i - 1] == 1) { + team[i]++; + team[i - 1]--; + } else if (i < N && team[i + 1] == 1) { + team[i]++; + team[i + 1]--; + } + } + } + + int answer = 0; + for (int i = 1; i <= N; i++) { + if (team[i] == -1) answer++; + } + + System.out.println(answer); + } +} diff --git "a/week34/\352\260\225\354\204\261\354\232\261/baekjoon/\353\221\220_\354\232\251\354\225\241.java" "b/week34/\352\260\225\354\204\261\354\232\261/baekjoon/\353\221\220_\354\232\251\354\225\241.java" new file mode 100644 index 0000000..33970cf --- /dev/null +++ "b/week34/\352\260\225\354\204\261\354\232\261/baekjoon/\353\221\220_\354\232\251\354\225\241.java" @@ -0,0 +1,80 @@ +package week34.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.StringTokenizer; + +/** + * PackageName : week34.강성욱.baekjoon + * FileName : 두_용액 + * Author : Baekgwa + * Date : 25. 12. 22. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 22. Baekgwa Initial creation + */ +public class 두_용액 { + public class Main { + // 어짜피 두개만 선택함. + // -2, 4, -99, -1, 98 + // 정렬해둘까? + // -99, -2, -1, 4, 98 + // 다 확인하면? 100,000^2 = 10,000,000,000 = 백억은 좀; + // 투포인터? + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); //용액 종류 + int[] map = new int[N]; + StringTokenizer st = new StringTokenizer(br.readLine()); + for(int i=0; i result = new ArrayList<>(); + + while(left < right) { + int leftVal = map[left]; + int rightVal = map[right]; + + int sum = leftVal + rightVal; + + // 현재값이 가장 작은 값인지 확인해보기 + // 0에 가까운걸 찾기 때문에, 절대값으로 변환해서 사용 + if(nowMin > Math.abs(sum)) { + nowMin = Math.abs(sum); + result.clear(); + result.add(leftVal); + result.add(rightVal); + } + + // 현재 값에 따라서, 포인터 움직이기 + if(sum == 0) { + // 0 이면 더 이상 탐색할 필요도 없이, 완벽한 혼합용액 + break; + } else if(sum < 0) { + // 음수인 경우에는 left 를 늘려야함 + left++; + } else { + right--; + } + } + + System.out.println(result.get(0) + " " + result.get(1)); + } + } +} diff --git "a/week34/\352\260\225\354\204\261\354\232\261/baekjoon/\354\271\264\353\223\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" "b/week34/\352\260\225\354\204\261\354\232\261/baekjoon/\354\271\264\353\223\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..f8af528 --- /dev/null +++ "b/week34/\352\260\225\354\204\261\354\232\261/baekjoon/\354\271\264\353\223\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" @@ -0,0 +1,62 @@ +package week34.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.PriorityQueue; + +/** + * PackageName : week34.강성욱.baekjoon + * FileName : 카드_정렬하기 + * Author : Baekgwa + * Date : 25. 12. 22. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 22. Baekgwa Initial creation + */ +public class 카드_정렬하기 { + public class Main { + + // 가장 작은거끼리 합해나가는게 더 이득인가? + // 50, 51, 60, 100 + // (50 + 51) + (101 + 60) + (161 + 100) = 523 + // (50 + 51) + (60 + 100) + (101 + 106) = 468 + // 한번만 정렬할게 아니고, 계속 꾸준히 정렬이 필요 + // 뭉치가 하나만 들어올 수가 있어서, 그거 처리필요. + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + PriorityQueue pq = new PriorityQueue<>(); + + int N = Integer.parseInt(br.readLine()); // 카드 묶음 수 + + for(int i=0; i= 2) continue; + distinct++; + } + + // 쿠폰으로 먹는거 중복 확인 + max = distinct; + if(count[c] == 0) { + max++; + } + + // 전체 확인 + while(left < N) { + int now = belt[left]; // 이번에 뺄 스시 + count[now]--; + if(count[now] == 0) { + distinct--; + } + + // 스시 더하기 + right = (left + k) % N; + now = belt[right]; + count[now]++; + if(count[now] == 1) { + distinct++; + } + + int current = distinct; + if(count[c] == 0) { + current++; + } + + max = Math.max(max, current); + + left++; + } + + System.out.println(max); + } + } +} diff --git "a/week34/\354\235\264\354\203\201\354\226\265/backjoon/\353\221\220_\354\232\251\354\225\241.java" "b/week34/\354\235\264\354\203\201\354\226\265/backjoon/\353\221\220_\354\232\251\354\225\241.java" new file mode 100644 index 0000000..1d77067 --- /dev/null +++ "b/week34/\354\235\264\354\203\201\354\226\265/backjoon/\353\221\220_\354\232\251\354\225\241.java" @@ -0,0 +1,43 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + + long[] arr = new long[N]; + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + arr[i] = Long.parseLong(st.nextToken()); + } + + Arrays.sort(arr); + + int left = 0; + int right = N - 1; + + long best = Long.MAX_VALUE; + long ans1 = 0, ans2 = 0; + + while (left < right) { + long sum = arr[left] + arr[right]; + + if (Math.abs(sum) < best) { + best = Math.abs(sum); + ans1 = arr[left]; + ans2 = arr[right]; + } + + if (sum < 0) { + left++; + } else { + right--; + } + } + + System.out.print(ans1 + " "+ ans2); + } +} diff --git "a/week34/\354\235\264\354\203\201\354\226\265/backjoon/\354\271\264\353\223\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" "b/week34/\354\235\264\354\203\201\354\226\265/backjoon/\354\271\264\353\223\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..a6fe5b6 --- /dev/null +++ "b/week34/\354\235\264\354\203\201\354\226\265/backjoon/\354\271\264\353\223\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" @@ -0,0 +1,29 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + PriorityQueue pq = new PriorityQueue<>(); + + for (int i = 0; i < N; i++) { + int x = Integer.parseInt(br.readLine()); + pq.add(x); + } + + int sum = 0; + + while (pq.size() > 1) { + int a = pq.poll(); + int b = pq.poll(); + int part_sum = a + b; + + sum += part_sum; + pq.add(part_sum); + } + + System.out.print(sum); + } +} diff --git "a/week34/\354\235\264\354\203\201\354\226\265/backjoon/\355\217\254\353\217\204\354\243\274_\354\213\234\354\213\235.java" "b/week34/\354\235\264\354\203\201\354\226\265/backjoon/\355\217\254\353\217\204\354\243\274_\354\213\234\354\213\235.java" new file mode 100644 index 0000000..f9d8105 --- /dev/null +++ "b/week34/\354\235\264\354\203\201\354\226\265/backjoon/\355\217\254\353\217\204\354\243\274_\354\213\234\354\213\235.java" @@ -0,0 +1,31 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + int[] arr = new int[N+1]; + + for (int i = 1; i < N+1; i++) { + arr[i] = Integer.parseInt(br.readLine()); + } + + int[] dp = new int[N + 1]; + dp[1] = arr[1]; + if( N >= 2 ) dp[2] = arr[1] + arr[2]; + + for(int i = 3; i <= N; i++){ + dp[i] = Math.max( + dp[i-1], + Math.max( + dp[i-2] + arr[i], + dp[i-3] + arr[i-1] + arr[i] + ) + ); + } + + System.out.print(dp[N]); + } +} diff --git "a/week34/\354\235\264\354\203\201\354\226\265/backjoon/\355\232\214\354\240\204\354\264\210\353\260\245.java" "b/week34/\354\235\264\354\203\201\354\226\265/backjoon/\355\232\214\354\240\204\354\264\210\353\260\245.java" new file mode 100644 index 0000000..3be76db --- /dev/null +++ "b/week34/\354\235\264\354\203\201\354\226\265/backjoon/\355\232\214\354\240\204\354\264\210\353\260\245.java" @@ -0,0 +1,53 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws IOException { + 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()); + + // 초밥 종류 , 해당 초밥을 원하는 손님들 (번호 작은 순) + Map> want = new HashMap<>(); + + // 각 손님이 먹은 초밥 개수 + int[] answer = new int[N + 1]; + + for (int i = 1; i <= N; i++) { + st = new StringTokenizer(br.readLine()); + int k = Integer.parseInt(st.nextToken()); + + for (int j = 0; j < k; j++) { + int sushi = Integer.parseInt(st.nextToken()); + + if (!want.containsKey(sushi)) { + want.put(sushi, new PriorityQueue<>()); + } + want.get(sushi).add(i); + } + } + + // 만들어지는 초밥 처리 + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < M; i++) { + int sushi = Integer.parseInt(st.nextToken()); + + if (want.containsKey(sushi)) { + PriorityQueue pq = want.get(sushi); + + if (!pq.isEmpty()) { + int who = pq.poll(); // 가장 앞 손님이 먹음 + answer[who]++; + } + } + } + + StringBuilder sb = new StringBuilder(); + for (int i = 1; i <= N; i++) { + sb.append(answer[i]).append(" "); + } + System.out.println(sb.toString().trim()); + } +} diff --git "a/week35/\352\260\225\354\204\261\354\232\261/baekjoon/\352\267\274\354\206\220\354\213\244.java" "b/week35/\352\260\225\354\204\261\354\232\261/baekjoon/\352\267\274\354\206\220\354\213\244.java" new file mode 100644 index 0000000..7de9e26 --- /dev/null +++ "b/week35/\352\260\225\354\204\261\354\232\261/baekjoon/\352\267\274\354\206\220\354\213\244.java" @@ -0,0 +1,73 @@ +package week35.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week35.강성욱.baekjoon + * FileName : 근손실 + * Author : Baekgwa + * Date : 25. 12. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 30. Baekgwa Initial creation + */ +public class 근손실 { + public class Main { + + // 모든 케이스를 다 확인하면? + // 최대 8개 운동키트 순열 8! + // 4만 + // 한 조합당 확인해야 하는 횟수 8번 + // 32만 + // 할만한듯? + + private static int[] list; + private static boolean[] visited; + private static int K; + private static int N; + private static int count = 0; + + 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()); + K = Integer.parseInt(st.nextToken()); + + list = new int[N]; + visited = new boolean[N]; + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + list[i] = Integer.parseInt(st.nextToken()); + } + + dfs(0, 500); + System.out.println(count); + } + + private static void dfs(int day, int weight) { + if(weight < 500) { + return; + } + + if(day == N) { + count++; + return; + } + + for(int i=0; i= 2 && (n - m) % 2 == 0) { + System.out.println("NO"); + } else { + System.out.println("YES"); + } + } + } + } +} diff --git "a/week35/\352\260\225\354\204\261\354\232\261/baekjoon/\354\204\234\352\260\225\352\267\270\353\235\274\354\232\264\353\223\234.java" "b/week35/\352\260\225\354\204\261\354\232\261/baekjoon/\354\204\234\352\260\225\352\267\270\353\235\274\354\232\264\353\223\234.java" new file mode 100644 index 0000000..56211a4 --- /dev/null +++ "b/week35/\352\260\225\354\204\261\354\232\261/baekjoon/\354\204\234\352\260\225\352\267\270\353\235\274\354\232\264\353\223\234.java" @@ -0,0 +1,82 @@ +package week35.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week35.강성욱.baekjoon + * FileName : 서강그라운드 + * Author : Baekgwa + * Date : 25. 12. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 30. Baekgwa Initial creation + */ +public class 서강그라운드 { + public class Main { + public static void main(String[] args) throws IOException { + 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()); + int r = Integer.parseInt(st.nextToken()); + + int[] items = new int[n + 1]; + st = new StringTokenizer(br.readLine()); + for (int i = 1; i <= n; i++) { + items[i] = Integer.parseInt(st.nextToken()); + } + + int[][] dist = new int[n + 1][n + 1]; + + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + if (i == j) + dist[i][j] = 0; + else + dist[i][j] = Integer.MAX_VALUE; + } + } + + for (int i = 0; i < r; i++) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + int l = Integer.parseInt(st.nextToken()); + + dist[a][b] = Math.min(dist[a][b], l); + dist[b][a] = Math.min(dist[b][a], l); + } + + for (int k = 1; k <= n; k++) { + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + if (dist[i][j] > dist[i][k] + dist[k][j]) { + dist[i][j] = dist[i][k] + dist[k][j]; + } + } + } + } + + int max = 0; + + // 각 지역을 시작점으로 아이템 합 계산 + for (int start = 1; start <= n; start++) { + int sum = 0; + for (int end = 1; end <= n; end++) { + if (dist[start][end] <= m) { + sum += items[end]; + } + } + max = Math.max(max, sum); + } + + System.out.println(max); + } + } +} diff --git "a/week35/\352\260\225\354\204\261\354\232\261/baekjoon/\354\240\201\353\241\235\354\203\211\354\225\275.java" "b/week35/\352\260\225\354\204\261\354\232\261/baekjoon/\354\240\201\353\241\235\354\203\211\354\225\275.java" new file mode 100644 index 0000000..a0f4704 --- /dev/null +++ "b/week35/\352\260\225\354\204\261\354\232\261/baekjoon/\354\240\201\353\241\235\354\203\211\354\225\275.java" @@ -0,0 +1,85 @@ +package week35.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week35.강성욱.baekjoon + * FileName : 적록색약 + * Author : Baekgwa + * Date : 25. 12. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 25. 12. 30. Baekgwa Initial creation + */ +public class 적록색약 { + public class Main { + + private static int N; + private static char[][] map; + private static int[] dx = {-1, 0, 1, 0}; + private static int[] dy = {0, -1, 0, 1}; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + N = Integer.parseInt(br.readLine()); + map = new char[N][N]; + for(int i=0; i q = new LinkedList<>(); + + // 이미 방문한 곳이면 pass (다른 구역에 포함되면) + if(visited[y][x]) continue; + q.offer(new int[]{y, x}); + visited[y][x] = true; + + while(!q.isEmpty()) { + int[] nowPos = q.poll(); + int nowY = nowPos[0]; + int nowX = nowPos[1]; + + for(int i=0; i<4; i++) { + int ny = nowY + dy[i]; + int nx = nowX + dx[i]; + + if(ny < 0 || ny >= N || nx < 0 || nx >= N) continue; + if(visited[ny][nx]) continue; + if(isNormal && map[ny][nx] != nowChar) continue; + if(!isNormal) { + if(nowChar == 'B' && map[ny][nx] != 'B') continue; + if(nowChar != 'B' && map[ny][nx] == 'B') continue; + } + q.offer(new int[]{ny, nx}); + visited[ny][nx] = true; + } + } + + count++; + } + } + + return count; + } + } +} diff --git "a/week35/\354\235\264\354\203\201\354\226\265/backjoon/\352\267\274\354\206\220\354\213\244.java" "b/week35/\354\235\264\354\203\201\354\226\265/backjoon/\352\267\274\354\206\220\354\213\244.java" new file mode 100644 index 0000000..b895fb0 --- /dev/null +++ "b/week35/\354\235\264\354\203\201\354\226\265/backjoon/\352\267\274\354\206\220\354\213\244.java" @@ -0,0 +1,46 @@ +import java.util.*; +import java.io.*; + +public class Main { + + static int N, K; + static int[] A; + static boolean[] used; + static int count = 0; + + 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()); + K = Integer.parseInt(st.nextToken()); + + A = new int[N]; + used = new boolean[N]; + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + A[i] = Integer.parseInt(st.nextToken()); + } + + dfs(0, 500); + System.out.println(count); + } + + static void dfs(int day, int weight) { + if (weight < 500) return; + + if (day == N) { + count++; + return; + } + + for (int i = 0; i < N; i++) { + if (!used[i]) { + used[i] = true; + dfs(day + 1, weight + A[i] - K); + used[i] = false; + } + } + } +} diff --git "a/week35/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\214\352\262\214\354\236\204nm.java" "b/week35/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\214\352\262\214\354\236\204nm.java" new file mode 100644 index 0000000..af0b389 --- /dev/null +++ "b/week35/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\214\352\262\214\354\236\204nm.java" @@ -0,0 +1,25 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + int T = Integer.parseInt(br.readLine()); + + for (int i = 0; i < T; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + long n = Long.parseLong(st.nextToken()); + long m = Long.parseLong(st.nextToken()); + + if (n >= 2 && m >= 2 && (n % 2 == m % 2)) { + sb.append("NO\n"); + } else { + sb.append("YES\n"); + } + } + + System.out.print(sb); + } +} diff --git "a/week35/\354\235\264\354\203\201\354\226\265/backjoon/\354\204\234\352\260\225\352\267\270\353\235\274\354\232\264\353\223\234.java" "b/week35/\354\235\264\354\203\201\354\226\265/backjoon/\354\204\234\352\260\225\352\267\270\353\235\274\354\232\264\353\223\234.java" new file mode 100644 index 0000000..0c27cbb --- /dev/null +++ "b/week35/\354\235\264\354\203\201\354\226\265/backjoon/\354\204\234\352\260\225\352\267\270\353\235\274\354\232\264\353\223\234.java" @@ -0,0 +1,96 @@ +import java.util.*; +import java.io.*; + +public class Main { + + static class Edge { + int to; + int cost; + Edge(int to, int cost){ + this.to = to; + this.cost = cost; + } + } + + static int n, m, r; + static int[] items; + static List[] graph; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + st = new StringTokenizer(br.readLine()); + n = Integer.parseInt(st.nextToken()); // 지역 개수 + m = Integer.parseInt(st.nextToken()); // 수색 범위 + r = Integer.parseInt(st.nextToken()); // 길 개수 + + items = new int[n + 1]; + + st = new StringTokenizer(br.readLine()); + for (int i = 1; i <= n; i++) { + items[i] = Integer.parseInt(st.nextToken()); + } + + graph = new ArrayList[n + 1]; + for (int i = 1; i <= n; i++) { + graph[i] = new ArrayList<>(); + } + + for (int i = 0; i < r; i++) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + int l = Integer.parseInt(st.nextToken()); + + graph[a].add(new Edge(b, l)); + graph[b].add(new Edge(a, l)); + } + + int answer = 0; + + // 모든 지역을 시작점으로 다익스트라 + for (int i = 1; i <= n; i++) { + answer = Math.max(answer, dijkstra(i)); + } + + System.out.println(answer); + } + + static int dijkstra(int start) { + int[] dist = new int[n + 1]; + Arrays.fill(dist, Integer.MAX_VALUE); + dist[start] = 0; + + PriorityQueue pq = + new PriorityQueue<>((a, b) -> Integer.compare(a[1], b[1])); + + pq.add(new int[]{start, 0}); + + while (!pq.isEmpty()) { + int[] cur = pq.poll(); + int now = cur[0]; + int cost = cur[1]; + + if (cost > dist[now]) continue; + + for (Edge e : graph[now]) { + int next = e.to; + int nextCost = cost + e.cost; + + if (nextCost < dist[next]) { + dist[next] = nextCost; + pq.add(new int[]{next, nextCost}); + } + } + } + + int sum = 0; + for (int i = 1; i <= n; i++) { + if (dist[i] <= m) { + sum += items[i]; + } + } + return sum; + } +} diff --git "a/week35/\354\235\264\354\203\201\354\226\265/backjoon/\354\240\201\353\241\235\354\203\211\354\225\275.java" "b/week35/\354\235\264\354\203\201\354\226\265/backjoon/\354\240\201\353\241\235\354\203\211\354\225\275.java" new file mode 100644 index 0000000..3ca7957 --- /dev/null +++ "b/week35/\354\235\264\354\203\201\354\226\265/backjoon/\354\240\201\353\241\235\354\203\211\354\225\275.java" @@ -0,0 +1,88 @@ +import java.util.*; +import java.io.*; + +public class Main { + + static int N; + static char[][] map; + static boolean[][] visited; + + static int[] dx = {-1, 1, 0, 0}; + static int[] dy = {0, 0, -1, 1}; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); + map = new char[N][N]; + + for (int i = 0; i < N; i++) { + String line = br.readLine(); + for (int j = 0; j < N; j++) { + map[i][j] = line.charAt(j); + } + } + + // 일반 시야 + visited = new boolean[N][N]; + int normal = 0; + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + if (!visited[i][j]) { + bfs(i, j, false); + normal++; + } + } + } + + // 적록색약 + visited = new boolean[N][N]; + int blind = 0; + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + if (!visited[i][j]) { + bfs(i, j, true); + blind++; + } + } + } + + System.out.println(normal + " " + blind); + } + + static void bfs(int x, int y, boolean colorblind) { + Queue q = new LinkedList<>(); + q.add(new int[]{x, y}); + visited[x][y] = true; + + char start = map[x][y]; + + while (!q.isEmpty()) { + int[] cur = q.poll(); + + for (int d = 0; d < 4; d++) { + int nx = cur[0] + dx[d]; + int ny = cur[1] + dy[d]; + + if (nx < 0 || ny < 0 || nx >= N || ny >= N) continue; + if (visited[nx][ny]) continue; + + char next = map[nx][ny]; + + if (sameColor(start, next, colorblind)) { + visited[nx][ny] = true; + q.add(new int[]{nx, ny}); + } + } + } + } + + static boolean sameColor(char a, char b, boolean blind) { + if (!blind) return a == b; + + if (a == 'B' || b == 'B') return a == b; + return true; + } +} diff --git "a/week36/\352\260\225\354\204\261\354\232\261/baekjoon/\353\217\204\354\230\201\354\235\264\352\260\200_\353\247\214\353\223\240_\353\247\233\354\236\210\353\212\224_\354\235\214\354\213\235.java" "b/week36/\352\260\225\354\204\261\354\232\261/baekjoon/\353\217\204\354\230\201\354\235\264\352\260\200_\353\247\214\353\223\240_\353\247\233\354\236\210\353\212\224_\354\235\214\354\213\235.java" new file mode 100644 index 0000000..a68aa27 --- /dev/null +++ "b/week36/\352\260\225\354\204\261\354\232\261/baekjoon/\353\217\204\354\230\201\354\235\264\352\260\200_\353\247\214\353\223\240_\353\247\233\354\236\210\353\212\224_\354\235\214\354\213\235.java" @@ -0,0 +1,81 @@ +package week36.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week36.강성욱.baekjoon + * FileName : 도영이가_만든_맛있는_음식 + * Author : Baekgwa + * Date : 26. 1. 7. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 7. Baekgwa Initial creation + */ +public class 도영이가_만든_맛있는_음식 { + public class Main { + // 먼저 생각나는건, 재료의 개수를 모든 조합에 넣어보기 + // 줄일 수 있나? + // 정렬해두면? 너무 까다롭다. + // 10개니깐 할만 할꺼 같기두? + // 2^10 = 1024 조합 인데, 1개 공집합 빼면 1023개네 + + private static long minDiff = Long.MAX_VALUE; + private static int N; + private static Material[] materials; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); // 재료의 개수 + materials = new Material[N]; + StringTokenizer st; + for(int i=0; i 0) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int N = Integer.parseInt(st.nextToken()); // 방의 개수 + int M = Integer.parseInt(st.nextToken()); // 비밀통로의 개수 + + List> graph = new ArrayList<>(); + for(int i=0; i<=N; i++) { + graph.add(new ArrayList<>()); + } + + for(int i=0; i(graph)); + } + + // 친구들 모두가 가장 가까운 최적의 정점 확인 + int minDist = Integer.MAX_VALUE; + int minNode = -1; + + for(int i=1; i<=N; i++) { + int sum = 0; + for (int[] distance : dist) { + sum += distance[i]; + } + + if(minDist > sum) { + minDist = sum; + minNode = i; + } + } + + sb.append(minNode).append("\n"); + } + + System.out.println(sb.toString()); + } + + public static int[] dijkstra(int startNode, int N, List> graph) { + int[] dist = new int[N+1]; + Arrays.fill(dist, Integer.MAX_VALUE); + dist[startNode] = 0; + + PriorityQueue pq = new PriorityQueue<>(Comparator.comparing(Edge::getCost)); + pq.offer(new Edge(startNode, 0)); + + while(!pq.isEmpty()) { + Edge e = pq.poll(); + int nowCost = e.getCost(); // 현재 위치에 도달하기 위한 비용 + int nowNode = e.getNode(); // 현재 위치 + + if(nowCost > dist[nowNode]) continue; // 지금이 최소 비용이 아니면 패스, 더 볼필요 x + + // 현재 위치에서 갈 수 있는 모든 곳 넣기 + for (Edge edge : graph.get(nowNode)) { + int next = edge.getNode(); + int nextCost = edge.getCost() + nowCost; + + if(dist[next] <= nextCost) continue; + + dist[next] = nextCost; + pq.offer(new Edge(next, nextCost)); + } + } + + return dist; + } + + public static class Edge { + private int node; + private int cost; + + public Edge(int node, int cost) { + this.node = node; + this.cost = cost; + } + + public int getNode() { + return node; + } + + public int getCost() { + return cost; + } + } + } +} diff --git "a/week36/\352\260\225\354\204\261\354\232\261/baekjoon/\354\227\254\355\226\211_\352\260\200\354\236\220.java" "b/week36/\352\260\225\354\204\261\354\232\261/baekjoon/\354\227\254\355\226\211_\352\260\200\354\236\220.java" new file mode 100644 index 0000000..3f88198 --- /dev/null +++ "b/week36/\352\260\225\354\204\261\354\232\261/baekjoon/\354\227\254\355\226\211_\352\260\200\354\236\220.java" @@ -0,0 +1,83 @@ +package week36.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +/** + * PackageName : week36.강성욱.baekjoon + * FileName : 여행_가자 + * Author : Baekgwa + * Date : 26. 1. 7. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 7. Baekgwa Initial creation + */ +public class 여행_가자 { + public class Main { + + // 1. 유니온 파인드 적용 + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); // 도시 수 + int M = Integer.parseInt(br.readLine()); // 여행할 도시 수 + + int[] parent = new int[N+1]; + Arrays.fill(parent, -1); + + // 도시 연결 + for (int i = 1; i <= N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int j = 1; j <= N; j++) { + int isConnect = Integer.parseInt(st.nextToken()); + if (isConnect == 1) { + union(parent, i, j); + } + } + } + + StringTokenizer st= new StringTokenizer(br.readLine()); + int first = Integer.parseInt(st.nextToken()); + for(int i=1; i a 로 결합 + private static void union(int[] parent, int a, int b) { + + int rootNodeA = find(parent, a); + int rootNodeB = find(parent, b); + + if(rootNodeA == rootNodeB) return; + + parent[rootNodeA] = rootNodeB; + } + + // x의 최상위 루트 노드를 찾는 메서드 + private static int find(int[] parent, int x) { + + if(parent[x] == -1) { + return x; + } + + return find(parent, parent[x]); + } + + private static boolean isSameUnion(int[] parent, int a, int b) { + return find(parent, a) == find(parent, b); + } + } +} diff --git "a/week36/\352\260\225\354\204\261\354\232\261/baekjoon/\354\266\234\354\204\235\354\262\264\355\201\254.java" "b/week36/\352\260\225\354\204\261\354\232\261/baekjoon/\354\266\234\354\204\235\354\262\264\355\201\254.java" new file mode 100644 index 0000000..03ab17e --- /dev/null +++ "b/week36/\352\260\225\354\204\261\354\232\261/baekjoon/\354\266\234\354\204\235\354\262\264\355\201\254.java" @@ -0,0 +1,97 @@ +package week36.강성욱.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 : week36.강성욱.baekjoon + * FileName : 출석체크 + * Author : Baekgwa + * Date : 26. 1. 7. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 7. Baekgwa Initial creation + */ +public class 출석체크 { + public class Main { + + // 학생수 N + // 졸고 있는 학생 수 K + // 출석 코드를 보낼 학생의 수(시작) Q + // 주어질 구간의 수 M + // N K Q M + // 10 1 3 1 + // 7 -> 졸고 있는 학생의 입장 번호 + // 3 5 7 -> 출석 코드를 받는 학생들의 입장 번호 + // 출석을 못한 학생수를 구할 구간 + // 3 12 + + // 그럼 + // 3 4 5 6 7 8 9 10 11 12 + // O X O O X X O O X O + // 0 1 1 1 2 3 3 3 4 4 + + 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 K = Integer.parseInt(st.nextToken()); // 졸고 있는 학생 수 + int Q = Integer.parseInt(st.nextToken()); // 출석코드 받는 학생 수 + int M = Integer.parseInt(st.nextToken()); // 구간 수 + + boolean[] sleep = new boolean[N + 3]; // 자는지 확인 용 + Arrays.fill(sleep, false); + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < K; i++) { + int sleepNum = Integer.parseInt(st.nextToken()); + sleep[sleepNum] = true; + } + + List start = new ArrayList<>(); + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < Q; i++) { + int startNum = Integer.parseInt(st.nextToken()); + start.add(startNum); + } + + // 전체 확인 처리 + boolean[] map = new boolean[N + 3]; + for (int sta : start) { + if (sleep[sta]) + continue; // 처음 받는놈이 자면 패스 + + for (int i = sta; i <= N + 2; i += sta) { + if (sleep[i]) + continue; + + map[i] = true; + } + } + + // 미리 누적합 구해두기 + int[] result = new int[N + 3]; + for (int i = 3; i <= N + 2; i++) { + result[i] = result[i - 1] + (map[i] ? 0 : 1); + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int S = Integer.parseInt(st.nextToken()); //범위 시작 + int E = Integer.parseInt(st.nextToken()); //범위 종료 + + int count = result[E] - result[S-1]; + sb.append(count).append("\n"); + } + + System.out.println(sb); + } + } +} diff --git "a/week36/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\204\354\230\201\354\235\264\352\260\200_\353\247\214\353\223\240_\353\247\233\354\236\210\353\212\224_\354\235\214\354\213\235.java" "b/week36/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\204\354\230\201\354\235\264\352\260\200_\353\247\214\353\223\240_\353\247\233\354\236\210\353\212\224_\354\235\214\354\213\235.java" new file mode 100644 index 0000000..e189624 --- /dev/null +++ "b/week36/\354\235\264\354\203\201\354\226\265/backjoon/\353\217\204\354\230\201\354\235\264\352\260\200_\353\247\214\353\223\240_\353\247\233\354\236\210\353\212\224_\354\235\214\354\213\235.java" @@ -0,0 +1,47 @@ +import java.io.*; +import java.util.*; + +public class Main { + + static int N; + static int[] S, B; + static int answer = Integer.MAX_VALUE; + + static void dfs(int idx, long sour, long bitter, boolean used) { + if (idx == N) { + if (used) { + answer = Math.min(answer, (int)Math.abs(sour - bitter)); + } + return; + } + + // 현재 재료 사용 + dfs(idx + 1, + sour * S[idx], + bitter + B[idx], + true); + + // 현재 재료 사용 안 함 + dfs(idx + 1, + sour, + bitter, + used); + } + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + N = Integer.parseInt(br.readLine()); + + S = new int[N]; + B = new int[N]; + + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + S[i] = Integer.parseInt(st.nextToken()); + B[i] = Integer.parseInt(st.nextToken()); + } + + dfs(0, 1, 0, false); + System.out.println(answer); + } +} diff --git "a/week36/\354\235\264\354\203\201\354\226\265/backjoon/\353\271\204\353\260\200_\353\252\250\354\236\204.java" "b/week36/\354\235\264\354\203\201\354\226\265/backjoon/\353\271\204\353\260\200_\353\252\250\354\236\204.java" new file mode 100644 index 0000000..51868ec --- /dev/null +++ "b/week36/\354\235\264\354\203\201\354\226\265/backjoon/\353\271\204\353\260\200_\353\252\250\354\236\204.java" @@ -0,0 +1,104 @@ +import java.io.*; +import java.util.*; + +public class Main { + + static class Edge { + int to; + int cost; + Edge(int to, int cost) { + this.to = to; + this.cost = cost; + } + } + + static List[] graph; + static int N; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + int T = Integer.parseInt(br.readLine()); + + for (int tc = 0; tc < T; tc++) { + + st = new StringTokenizer(br.readLine()); + N = Integer.parseInt(st.nextToken()); + int M = Integer.parseInt(st.nextToken()); + + graph = new ArrayList[N + 1]; + for (int i = 1; i <= N; i++) { + graph[i] = new ArrayList<>(); + } + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + int c = Integer.parseInt(st.nextToken()); + + graph[a].add(new Edge(b, c)); + graph[b].add(new Edge(a, c)); + } + + int K = Integer.parseInt(br.readLine()); + st = new StringTokenizer(br.readLine()); + + int[] friends = new int[K]; + for (int i = 0; i < K; i++) { + friends[i] = Integer.parseInt(st.nextToken()); + } + + int[] sum = new int[N + 1]; + + for(int f : friends){ + int[] dist = dijkstra(f); + for(int i = 1; i <= N; i++){ + sum[i] += dist[i]; + } + } + + int answer = 1; + int min = sum[1]; + for(int i = 2; i <= N; i++){ + if(sum[i] < min ){ + min = sum[i]; + answer = i; + } + } + + System.out.println(answer); + } + } + + static int[] dijkstra(int start) { + int[] dist = new int[N + 1]; + Arrays.fill(dist, Integer.MAX_VALUE); + dist[start] = 0; + + PriorityQueue pq = + new PriorityQueue<>((a, b) -> Integer.compare(a[1], b[1])); + + pq.add(new int[]{start, 0}); + + while (!pq.isEmpty()) { + int[] cur = pq.poll(); + int now = cur[0]; + int cost = cur[1]; + + if (cost > dist[now]) continue; + + for (Edge e : graph[now]) { + int next = e.to; + int nextCost = cost + e.cost; + + if (nextCost < dist[next]) { + dist[next] = nextCost; + pq.add(new int[]{next, nextCost}); + } + } + } + return dist; + } +} diff --git "a/week36/\354\235\264\354\203\201\354\226\265/backjoon/\354\227\254\355\226\211_\352\260\200\354\236\220.java" "b/week36/\354\235\264\354\203\201\354\226\265/backjoon/\354\227\254\355\226\211_\352\260\200\354\236\220.java" new file mode 100644 index 0000000..70ffa30 --- /dev/null +++ "b/week36/\354\235\264\354\203\201\354\226\265/backjoon/\354\227\254\355\226\211_\352\260\200\354\236\220.java" @@ -0,0 +1,54 @@ +import java.io.*; +import java.util.*; + + +public class Main{ + + static int[] parent; + + static int find(int x){ + if(parent[x] == x) return x; + return parent[x] = find(parent[x]); + } + + static void union(int a, int b){ + a = find(a); + b = find(b); + if (a != b) parent[b] = a; + } + + + public static void main(String[] args) throws IOException{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + int M = Integer.parseInt(br.readLine()); + + parent = new int[N + 1]; + for(int i = 1; i <= N; i++) parent[i] = i; + + for(int i = 1; i <= N; i ++){ + StringTokenizer st = new StringTokenizer(br.readLine()); + for(int j = 1; j <= N; j++){ + int connected = Integer.parseInt(st.nextToken()); + if(connected == 1){ + union(i,j); + } + } + } + + StringTokenizer st = new StringTokenizer(br.readLine()); + int first_city = Integer.parseInt(st.nextToken()); + int root = find(first_city); + + while(st.hasMoreTokens()){ + int city = Integer.parseInt(st.nextToken()); + if(find(city) != root){ + System.out.println("NO"); + return; + } + } + + System.out.println("YES"); + } +} diff --git "a/week36/\354\235\264\354\203\201\354\226\265/backjoon/\354\266\234\354\204\235\354\262\264\355\201\254.java" "b/week36/\354\235\264\354\203\201\354\226\265/backjoon/\354\266\234\354\204\235\354\262\264\355\201\254.java" new file mode 100644 index 0000000..eb38568 --- /dev/null +++ "b/week36/\354\235\264\354\203\201\354\226\265/backjoon/\354\266\234\354\204\235\354\262\264\355\201\254.java" @@ -0,0 +1,51 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + st = new StringTokenizer(br.readLine()); + int N = Integer.parseInt(st.nextToken()); + int K = Integer.parseInt(st.nextToken()); + int Q = Integer.parseInt(st.nextToken()); + int M = Integer.parseInt(st.nextToken()); + + boolean[] sleep = new boolean[N + 3]; // 졸고 있는 학생 + boolean[] attend = new boolean[N + 3]; // 출석한 학생 + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < K; i++) { + sleep[Integer.parseInt(st.nextToken())] = true; + } + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < Q; i++) { + int x = Integer.parseInt(st.nextToken()); + if (sleep[x]) continue; // 졸고 있으면 전파 X + + for (int j = x; j <= N + 2; j += x) { + if (!sleep[j]) { + attend[j] = true; + } + } + } + + int[] prefix = new int[N + 3]; + for (int i = 3; i <= N + 2; i++) { + prefix[i] = prefix[i - 1] + (attend[i] ? 0 : 1); + } + + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int S = Integer.parseInt(st.nextToken()); + int E = Integer.parseInt(st.nextToken()); + sb.append(prefix[E] - prefix[S - 1]).append('\n'); + } + + System.out.print(sb); + } +} diff --git "a/week37/\352\260\225\354\204\261\354\232\261/baekjoon/DFS\354\231\200_BFS.java" "b/week37/\352\260\225\354\204\261\354\232\261/baekjoon/DFS\354\231\200_BFS.java" new file mode 100644 index 0000000..42eb1d4 --- /dev/null +++ "b/week37/\352\260\225\354\204\261\354\232\261/baekjoon/DFS\354\231\200_BFS.java" @@ -0,0 +1,108 @@ +package week37.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.StringTokenizer; + +/** + * PackageName : week37.강성욱.baekjoon + * FileName : DFS와_BFS + * Author : Baekgwa + * Date : 26. 1. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 12. Baekgwa Initial creation + */ +public class DFS와_BFS { + public class Main { + + private static List dfsResult = new ArrayList<>(); + private static boolean[] dfsVisited; + + private static List bfsResult = new ArrayList<>(); + private static boolean[] bfsVisited; + + 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()); + int V = Integer.parseInt(st.nextToken()); // 시작 정점 + + // List> graph = new ArrayList<>(); + // for(int i=0; i<=N; i++) graph.add(new PriorityQueue<>()); // 방문할 곳 많으면, 작은순서로 해야해서 그냥 PQ 쓰기 + List> graph = new ArrayList<>(); + for(int i=0; i<=N; i++) graph.add(new ArrayList<>()); + + for(int i=0; i list) { + StringBuilder sb = new StringBuilder(); + + for (int now : list) { + sb.append(now).append(" "); + } + + sb.deleteCharAt(sb.length()-1); + + return sb.toString(); + } + + private static void dfs(List> graph, int now) { + dfsResult.add(now); + dfsVisited[now] = true; + + for (int nextNode : graph.get(now)) { + if(dfsVisited[nextNode]) continue; + dfs(graph, nextNode); + } + } + + private static void bfs(List> graph, int now) { + Queue q = new LinkedList<>(); + bfsVisited[now] = true; + q.offer(now); + + while (!q.isEmpty()) { + int nowNode = q.poll(); + bfsResult.add(nowNode); + + for(int nextNode : graph.get(nowNode)) { + if(bfsVisited[nextNode]) continue; + + bfsVisited[nextNode] = true; + q.offer(nextNode); + } + } + } + } +} diff --git "a/week37/\352\260\225\354\204\261\354\232\261/baekjoon/\354\244\204_\354\204\270\354\232\260\352\270\260.java" "b/week37/\352\260\225\354\204\261\354\232\261/baekjoon/\354\244\204_\354\204\270\354\232\260\352\270\260.java" new file mode 100644 index 0000000..f15bf32 --- /dev/null +++ "b/week37/\352\260\225\354\204\261\354\232\261/baekjoon/\354\244\204_\354\204\270\354\232\260\352\270\260.java" @@ -0,0 +1,79 @@ +package week37.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.StringTokenizer; + +/** + * PackageName : week37.강성욱.baekjoon + * FileName : 줄_세우기 + * Author : Baekgwa + * Date : 26. 1. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 12. Baekgwa Initial creation + */ +public class 줄_세우기 { + public class Main { + 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()); // 비교 횟수 + + List> effectList = new ArrayList<>(); //각 정점이 어떤 정점들에게 영향을 끼쳤는지 확인하기 위한 리스트 + for (int i = 0; i <= N; i++) { + effectList.add(new ArrayList<>()); + } + + int[] ingress = new int[N + 1]; //각 정점이 result 에 저장되기 전에, 먼저 처리되어야 하는 정점의 개수 + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + // 학생 A가 B 앞에 있어야함. + int A = Integer.parseInt(st.nextToken()); + int B = Integer.parseInt(st.nextToken()); + + ingress[B]++; // B 정점은, 누군진 몰라도, 앞에 정점 하나가 먼저 처리되어야 등장이 가능 + effectList.get(A).add(B); // A 정점은, B 정점에게 영향을 끼쳤다. + } + + // ingress[Node] 의 값이 0인 친구들을 넣을 곳 + // 즉, q에는 현재 언제 나와도 상관없는 정점들의 큐 + Queue q = new LinkedList<>(); + insertZeroIngressNode(ingress, q); + + StringBuilder sb= new StringBuilder(); + + while(!q.isEmpty()) { + Integer nowNode = q.poll(); + sb.append(nowNode).append(" "); + + for (int effectedNode : effectList.get(nowNode)) { + ingress[effectedNode]--; + + if(ingress[effectedNode] == 0) { + q.add(effectedNode); + } + } + } + + System.out.println(sb.toString()); + } + + private static void insertZeroIngressNode(int[] ingress, Queue q) { + for(int i=1; i 0) { + StringTokenizer st = new StringTokenizer(br.readLine()); + + int x1 = Integer.parseInt(st.nextToken()); + int y1 = Integer.parseInt(st.nextToken()); + int r1 = Integer.parseInt(st.nextToken()); + + int x2 = Integer.parseInt(st.nextToken()); + int y2 = Integer.parseInt(st.nextToken()); + int r2 = Integer.parseInt(st.nextToken()); + + sb.append(countIntersection(x1, y1, r1, x2, y2, r2)).append('\n'); + } + + System.out.print(sb); + } + + private static int countIntersection( + int x1, int y1, int r1, + int x2, int y2, int r2 + ) { + long dx = x1 - x2; + long dy = y1 - y2; + + long distSq = dx * dx + dy * dy; + long sumR = r1 + r2; + long diffR = Math.abs(r1 - r2); + + long sumRSq = sumR * sumR; + long diffRSq = diffR * diffR; + + // 중심이 같고 반지름도 같음 → 무한대 + if (distSq == 0 && r1 == r2) { + return -1; + } + + // 교점 없음 + if (distSq > sumRSq) { + return 0; + } + if (distSq < diffRSq) { + return 0; + } + + // 한 점에서 만남 + if (distSq == sumRSq) { + return 1; + } + if (distSq == diffRSq) { + return 1; + } + + // 두 점에서 만남 + return 2; + } + } +} diff --git "a/week37/\352\260\225\354\204\261\354\232\261/baekjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\2603.java" "b/week37/\352\260\225\354\204\261\354\232\261/baekjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\2603.java" new file mode 100644 index 0000000..08843bb --- /dev/null +++ "b/week37/\352\260\225\354\204\261\354\232\261/baekjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\2603.java" @@ -0,0 +1,71 @@ +package week37.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.PriorityQueue; +import java.util.StringTokenizer; + +/** + * PackageName : week37.강성욱.baekjoon + * FileName : 파일_합치기3 + * Author : Baekgwa + * Date : 26. 1. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 12. Baekgwa Initial creation + */ +public class 파일_합치기3 { + public class Main { + + // 항상 최소한의 합과 합으로 구해나가면 되는거 아냐? + // 1, 1, 1, 100, 200 + // 2 1 100 200 /비용:2 + // 3 100 200 / 비용 2+3 + // 103 200 / 비용 2 + 3 + 103 + // ... + + // 아 40, 45, 55, 60 + // 이런케이스에는 좀 문제가 되겠네 + // 85, 55, 60 / 비용 : 85 + // 여기서, 55랑 60 을 더하는게 낫네 + // 85, 115 / 비용 : 85 + 115 + // 200 / 비용 : 85 + 115 + 200 + + // 만약 저기서, 그대로 앞에서 부터 진행했으면 + // 140, 60 / 비용 : 85 + 140 + // 200 / 비용 85 + 140 + 200 + // 아 이렇게 풀면 안되네... 순서는 정해진대로 들어가야 하구나 + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int testCase = Integer.parseInt(br.readLine()); + + StringBuilder result = new StringBuilder(); + + while(testCase-- > 0) { + int K = Integer.parseInt(br.readLine()); // 소설의 장 수 + + PriorityQueue pq = new PriorityQueue<>(); + StringTokenizer st = new StringTokenizer(br.readLine()); + for(int i=0; i= 2) { + long left = pq.poll(); + long right = pq.poll(); + + long nowSum = left + right; + cost += nowSum; + pq.add(nowSum); + } + + result.append(cost).append("\n"); + } + + System.out.println(result.toString()); + } + } +} diff --git "a/week37/\354\235\264\354\203\201\354\226\265/backjoon/DFS\354\231\200BFS.java" "b/week37/\354\235\264\354\203\201\354\226\265/backjoon/DFS\354\231\200BFS.java" new file mode 100644 index 0000000..6d70f0d --- /dev/null +++ "b/week37/\354\235\264\354\203\201\354\226\265/backjoon/DFS\354\231\200BFS.java" @@ -0,0 +1,76 @@ +import java.util.*; +import java.io.*; + + +public class Main{ + + static int N,M,V; + static List[] graph; + + static boolean[] visited; + + 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()); + M = Integer.parseInt(st.nextToken()); + V = Integer.parseInt(st.nextToken()); + + graph = new ArrayList[N+1]; + for(int i = 1; i <= N; i++){ + graph[i] = new ArrayList<>(); + } + + for(int i = 0; i < M; i++){ + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + + graph[a].add(b); + graph[b].add(a); + } + + for(int i = 1; i <= N; i++){ + Collections.sort(graph[i]); + } + + visited = new boolean[N+1]; + dfs(V); + System.out.println(); + + visited = new boolean[N+1]; + bfs(V); + } + + static void dfs(int v){ + visited[v] = true; + System.out.print(v + " "); + + for(int next : graph[v]){ + if(!visited[next]){ + dfs(next); + } + } + + } + static void bfs(int start){ + Queue q = new LinkedList<>(); + q.offer(start); + visited[start] = true; + + while(!q.isEmpty()){ + + int cur = q.poll(); + System.out.print(cur + " "); + + for(int next : graph[cur]){ + if(!visited[next]){ + visited[next] = true; + q.offer(next); + } + } + } + } +} diff --git "a/week37/\354\235\264\354\203\201\354\226\265/backjoon/\354\244\204_\354\204\270\354\232\260\352\270\260.java" "b/week37/\354\235\264\354\203\201\354\226\265/backjoon/\354\244\204_\354\204\270\354\232\260\352\270\260.java" new file mode 100644 index 0000000..0ebd8d0 --- /dev/null +++ "b/week37/\354\235\264\354\203\201\354\226\265/backjoon/\354\244\204_\354\204\270\354\232\260\352\270\260.java" @@ -0,0 +1,60 @@ +import java.util.*; +import java.io.*; + +public class Main { + + static int N, M; + static List[] graph; + static int[] indegree; + + 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()); + M = Integer.parseInt(st.nextToken()); + + graph = new ArrayList[N + 1]; + indegree = new int[N + 1]; + + for (int i = 1; i <= N; i++) { + graph[i] = new ArrayList<>(); + } + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int A = Integer.parseInt(st.nextToken()); + int B = Integer.parseInt(st.nextToken()); + + // A -> B + graph[A].add(B); + indegree[B]++; + } + + bfs(); + } + + static void bfs() { + Queue q = new LinkedList<>(); + + // 위상이 0 인 애 부터 줄을 선다. + for (int i = 1; i <= N; i++) { + if (indegree[i] == 0) { + q.offer(i); + } + } + + while (!q.isEmpty()) { + int cur = q.poll(); + System.out.print(cur + " "); + + for (int next : graph[cur]) { + indegree[next]--; + if (indegree[next] == 0) { + q.offer(next); + } + } + } + } +} diff --git "a/week37/\354\235\264\354\203\201\354\226\265/backjoon/\355\204\260\353\240\233.java" "b/week37/\354\235\264\354\203\201\354\226\265/backjoon/\355\204\260\353\240\233.java" new file mode 100644 index 0000000..2e2d003 --- /dev/null +++ "b/week37/\354\235\264\354\203\201\354\226\265/backjoon/\355\204\260\353\240\233.java" @@ -0,0 +1,55 @@ +// (1) 같은 원 -1 +// (2) 교점이 없음 0 +// (3) 원 안에 원 0 +// (4) 한 점에서 만남 1 +// (5) 두 점에서 만남 + +import java.util.*; +import java.io.*; + +public class Main{ + public static void main(String[] args) throws IOException{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + int N = Integer.parseInt(br.readLine()); + + for(int i = 0; i < N; i++){ + StringTokenizer st = new StringTokenizer(br.readLine()); + + int x1 = Integer.parseInt(st.nextToken()); + int y1 = Integer.parseInt(st.nextToken()); + int r1 = Integer.parseInt(st.nextToken()); + + int x2 = Integer.parseInt(st.nextToken()); + int y2 = Integer.parseInt(st.nextToken()); + int r2 = Integer.parseInt(st.nextToken()); + + int result = circle_option(x1, y1, r1 , x2, y2, r2); + sb.append(result).append('\n'); + } + System.out.print(sb); + } + + public static int circle_option(int x1, int y1, int r1, int x2, int y2, int r2){ + + int dx = x1 - x2; + int dy = y1 - y2; + int d = dx*dx + dy*dy; + + int sum = r1 + r2; + int diff = Math.abs(r1 - r2); + + if (d == 0 && r1 == r2) { + return -1; + } else if (d > sum*sum) { + return 0; + } else if (d < diff*diff) { + return 0; + } else if (d == sum*sum || d == diff*diff) { + return 1; + } else { + return 2; + } + } +} diff --git "a/week37/\354\235\264\354\203\201\354\226\265/backjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\2603.java" "b/week37/\354\235\264\354\203\201\354\226\265/backjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\2603.java" new file mode 100644 index 0000000..28cd795 --- /dev/null +++ "b/week37/\354\235\264\354\203\201\354\226\265/backjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\2603.java" @@ -0,0 +1,41 @@ +import java.util.*; +import java.io.*; + +public class Main { + + static int T; + static int K; + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + T = Integer.parseInt(br.readLine()); + + for (int t = 0; t < T; t++) { + + PriorityQueue pq = new PriorityQueue<>(); + + K = Integer.parseInt(br.readLine()); + st = new StringTokenizer(br.readLine()); + + for (int i = 0; i < K; i++) { + pq.offer(Long.parseLong(st.nextToken())); + } + + long sum = 0; + + while (pq.size() > 1) { + long a = pq.poll(); + long b = pq.poll(); + + long part = a + b; + sum += part; + pq.offer(part); + } + + System.out.println(sum); + } + } +} 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(); + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + int c = Integer.parseInt(st.nextToken()); + + graph.add(new Edge(a, b, c)); + } + + + + long[] dist = new long[N+1]; + + if(!BellmanFord(N,M,1,dist)){ + System.out.println(-1); + } else{ + for(int i = 2; i <= N; i++){ + if(dist[i] == INF){ + System.out.println(-1); + } else{ + System.out.println(dist[i]); + } + } + } + } + + static ArrayList graph; + static final long INF = (long)1e18; + + public static boolean BellmanFord(int n, int m, int start, long[] dist) { + Arrays.fill(dist, INF); + dist[start] = 0; + + for (int i = 1; i < n; i++) { + for (int j = 0; j < m; j++) { + Edge edge = graph.get(j); + + if (dist[edge.v] != INF && + dist[edge.w] > dist[edge.v] + edge.cost) { + dist[edge.w] = dist[edge.v] + edge.cost; + } + } + } + + for (int j = 0; j < m; j++) { + Edge edge = graph.get(j); + if (dist[edge.v] != INF && + dist[edge.w] > dist[edge.v] + edge.cost) { + return false; // 음수 사이클 존재 + } + } + + return true; + } + +} \ No newline at end of file diff --git "a/week38/\354\235\264\354\203\201\354\226\265/backjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\260.java" "b/week38/\354\235\264\354\203\201\354\226\265/backjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\260.java" new file mode 100644 index 0000000..b5bef00 --- /dev/null +++ "b/week38/\354\235\264\354\203\201\354\226\265/backjoon/\355\214\214\354\235\274_\355\225\251\354\271\230\352\270\260.java" @@ -0,0 +1,43 @@ +import java.util.*; +import java.io.*; + +public class Main { + static final long INF = (long)1e18; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + int T = Integer.parseInt(br.readLine()); + + while (T-- > 0) { + int K = Integer.parseInt(br.readLine()); + + int[] files = new int[K+1]; + long[] prefix = new long[K+1]; + st = new StringTokenizer(br.readLine()); + + for (int i = 1; i <= K; i++) { + files[i] = Integer.parseInt(st.nextToken()); + prefix[i] = prefix[i-1] + files[i]; + } + + long[][] dp = new long[K+1][K+1]; + + for (int len = 2; len <= K; len++) { + for (int i = 1; i + len - 1 <= K; i++) { + int j = i + len - 1; + dp[i][j] = INF; + + for (int k = i; k < j; k++) { + long cost = dp[i][k] + dp[k+1][j] + + (prefix[j] - prefix[i-1]); + dp[i][j] = Math.min(dp[i][j], cost); + } + } + } + + System.out.println(dp[1][K]); + } + } +} diff --git "a/week38/\354\235\264\354\203\201\354\226\265/progarmmers/N_Queen.java" "b/week38/\354\235\264\354\203\201\354\226\265/progarmmers/N_Queen.java" new file mode 100644 index 0000000..afb9418 --- /dev/null +++ "b/week38/\354\235\264\354\203\201\354\226\265/progarmmers/N_Queen.java" @@ -0,0 +1,38 @@ +class Solution { + int count = 0; + boolean[] col; + boolean[] diag1; // 오른쪽 아래 대각 + boolean[] diag2; // 왼쪽 아래 대각 + + public int solution(int n) { + col = new boolean[n]; + diag1 = new boolean[2 * n]; + diag2 = new boolean[2 * n]; + + dfs(0, n); + return count; + } + + void dfs(int row, int n) { + if (row == n) { + count++; + return; + } + + for (int i = 0; i < n; i++) { + if (col[i] || diag1[row + i] || diag2[row - i + n - 1]) { + continue; + } + + col[i] = true; + diag1[row + i] = true; + diag2[row - i + n - 1] = true; + + dfs(row + 1, n); + + col[i] = false; + diag1[row + i] = false; + diag2[row - i + n - 1] = false; + } + } +} diff --git "a/week38/\354\235\264\354\203\201\354\226\265/progarmmers/\354\236\205\352\265\255\354\213\254\354\202\254.java" "b/week38/\354\235\264\354\203\201\354\226\265/progarmmers/\354\236\205\352\265\255\354\213\254\354\202\254.java" new file mode 100644 index 0000000..922726e --- /dev/null +++ "b/week38/\354\235\264\354\203\201\354\226\265/progarmmers/\354\236\205\352\265\255\354\213\254\354\202\254.java" @@ -0,0 +1,34 @@ +import java.util.Arrays; + +class Solution { + public long solution(int n, int[] times) { + return binarySearch(n, times); + } + + public long binarySearch(int n, int[] times) { + Arrays.sort(times); + + long left = 1; + long right = (long) times[times.length - 1] * n; + long answer = right; + + while (left <= right) { + long mid = (left + right) / 2; + + long people = 0; + for (int i = 0; i < times.length; i++) { + people += mid / times[i]; + if (people >= n) break; // 최적화 + } + + if (people >= n) { + answer = mid; + right = mid - 1; + } else { + left = mid + 1; + } + } + + return answer; + } +} diff --git "a/week39/\352\260\225\354\204\261\354\232\261/baekjoon/A\354\231\200_B.java" "b/week39/\352\260\225\354\204\261\354\232\261/baekjoon/A\354\231\200_B.java" new file mode 100644 index 0000000..8b6ad1e --- /dev/null +++ "b/week39/\352\260\225\354\204\261\354\232\261/baekjoon/A\354\231\200_B.java" @@ -0,0 +1,54 @@ +package week39.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * PackageName : week39.강성욱.baekjoon + * FileName : A와_B + * Author : Baekgwa + * Date : 26. 1. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 30. Baekgwa Initial creation + */ +public class A와_B { + public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String start = br.readLine(); + String end = br.readLine(); + + while(true) { + if(end.length() < start.length()) { + System.out.println(0); + return; + } + + String lastChar = end.substring(end.length()-1, end.length()); + end = end.substring(0, end.length()-1); + + // B 였으면, B 빼고 뒤집기 + if(lastChar.equals("B")) { + end = reverseEnd(end); + } + + if(end.equals(start)) { + System.out.println(1); + return; + } + } + } + + private static String reverseEnd(String end) { + StringBuilder sb = new StringBuilder(); + for(int i=end.length()-1;i>=0;i--) { + sb.append(end.charAt(i)); + } + return sb.toString(); + } + } +} diff --git "a/week39/\352\260\225\354\204\261\354\232\261/baekjoon/\352\265\254\353\221\220_\354\210\230\354\204\240\352\263\265.java" "b/week39/\352\260\225\354\204\261\354\232\261/baekjoon/\352\265\254\353\221\220_\354\210\230\354\204\240\352\263\265.java" new file mode 100644 index 0000000..d681e15 --- /dev/null +++ "b/week39/\352\260\225\354\204\261\354\232\261/baekjoon/\352\265\254\353\221\220_\354\210\230\354\204\240\352\263\265.java" @@ -0,0 +1,82 @@ +package week39.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.PriorityQueue; +import java.util.StringTokenizer; + +/** + * PackageName : week39.강성욱.baekjoon + * FileName : 구두_수선공 + * Author : Baekgwa + * Date : 26. 2. 2. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 2. 2. Baekgwa Initial creation + */ +public class 구두_수선공 { + public class Main { + // 음 생각을 해보자. + // 지연이 될 수록 더 손해인걸 먼저 골라야겠네. + // (index) T S + // (1) 3 4 = 3/4 = 0.75 + // (2) 1 1000 = 1/1000 = 0.001 + // (3) 2 2 = 2/2 = 1 + // (4) 5 5 = 5/5 = 1 + // 작을 수록 급하다고 보면될듯? + // 2, 1, (3, 4) 인데, 34는 오름차순 정렬로 가져가기. + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); //작업 개수 + + PriorityQueue pq = new PriorityQueue<>((a, b) -> { + int compare = Double.compare(a.getPriority(), b.getPriority()); + + // 둘이 같으면 인덱스 기준 + if (compare == 0) { + return Integer.compare(a.getIndex(), b.getIndex()); + } + + return compare; + }); + + for (int i = 1; i <= N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int T = Integer.parseInt(st.nextToken()); + int S = Integer.parseInt(st.nextToken()); + + pq.offer(new Job(i, T, S)); + } + + StringBuilder sb = new StringBuilder(); + while (!pq.isEmpty()) { + Job job = pq.poll(); + sb.append(job.index).append(" "); + } + + System.out.println(sb); + } + + private static class Job { + private final int index; + private final double priority; + + public Job(int index, int T, int S) { + this.index = index; + this.priority = (double)T / S; + } + + public double getPriority() { + return priority; + } + + public int getIndex() { + return index; + } + } + } +} diff --git "a/week39/\352\260\225\354\204\261\354\232\261/baekjoon/\353\202\264\353\246\254\353\247\211_\352\270\270.java" "b/week39/\352\260\225\354\204\261\354\232\261/baekjoon/\353\202\264\353\246\254\353\247\211_\352\270\270.java" new file mode 100644 index 0000000..7d0e150 --- /dev/null +++ "b/week39/\352\260\225\354\204\261\354\232\261/baekjoon/\353\202\264\353\246\254\353\247\211_\352\270\270.java" @@ -0,0 +1,72 @@ +package week39.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week39.강성욱.baekjoon + * FileName : 내리막_길 + * Author : Baekgwa + * Date : 26. 1. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 1. 30. Baekgwa Initial creation + */ +public class 내리막_길 { + public class Main { + + private static int M, N; + private static int[][] map; + private static int[][] dp; + private static final int[] dy = {0, -1, 0, 1}; + private static final int[] dx = {-1, 0, 1, 0}; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + M = Integer.parseInt(st.nextToken()); + N = Integer.parseInt(st.nextToken()); + + map = new int[M][N]; + dp = new int[M][N]; + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + for (int j = 0; j < N; j++) { + map[i][j] = Integer.parseInt(st.nextToken()); + dp[i][j] = -1; + } + } + + System.out.println(dfs(0, 0)); + } + + static int dfs(int y, int x) { + if (y == M - 1 && x == N - 1) { + return 1; + } + + if (dp[y][x] != -1) { + return dp[y][x]; + } + + dp[y][x] = 0; + for (int i = 0; i < 4; i++) { + int ny = y + dy[i]; + int nx = x + dx[i]; + + if(ny < 0 || ny >= M || nx < 0 || nx >= N) continue; + if(map[y][x] <= map[ny][nx]) continue; + + dp[y][x] += dfs(ny, nx); + } + + return dp[y][x]; + } + } +} diff --git "a/week39/\352\260\225\354\204\261\354\232\261/baekjoon/\354\235\264\354\240\204_\354\210\234\354\227\264.java" "b/week39/\352\260\225\354\204\261\354\232\261/baekjoon/\354\235\264\354\240\204_\354\210\234\354\227\264.java" new file mode 100644 index 0000000..918e28e --- /dev/null +++ "b/week39/\352\260\225\354\204\261\354\232\261/baekjoon/\354\235\264\354\240\204_\354\210\234\354\227\264.java" @@ -0,0 +1,98 @@ +package week39.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +/** + * PackageName : week39.강성욱.baekjoon + * FileName : 이전_순열 + * Author : Baekgwa + * Date : 26. 2. 2. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 2. 2. Baekgwa Initial creation + */ +public class 이전_순열 { + public class Main { + // 5 4 3 1 2 일때는? + // 5 4 2 3 1 이 바로 그전임 + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int[] numbArray = new int[N]; + for(int i=0; i=0; idx--) { + // 이전과 대비해서 이번께 더 크다면? + if(beforeVal < numbArray[idx]) { + targetIdx = idx; + break; + } + + beforeVal = numbArray[idx]; + } + + // 만약 쭉 내림차순으로 진행되면, 이전 순열은 존재하지 않음. + if(targetIdx == -1) { + System.out.println(-1); + return; + } + + // targetIdx 기준으로, 아래쪽 탐색해면서 가장 큰거 찾기 + // 그친구랑 바꿔야함 + // 나머지는 모두 List 에 담아뒀다가 정렬해서 붙이기 + List tempList = new ArrayList<>(); + tempList.add(numbArray[targetIdx]); + for(int idx=targetIdx+1; idx Integer.compare(b, a)); + + int targetVal = numbArray[targetIdx]; + int bestCandidate = -1; + + for(int i=0; i Integer.compare(b, a)); + + for (int now : tempList) { + sb.append(now).append(" "); + } + + System.out.println(sb); + } + } +} diff --git "a/week39/\354\235\264\354\203\201\354\226\265/backjoon/A\354\231\200_B.java" "b/week39/\354\235\264\354\203\201\354\226\265/backjoon/A\354\231\200_B.java" new file mode 100644 index 0000000..3546d54 --- /dev/null +++ "b/week39/\354\235\264\354\203\201\354\226\265/backjoon/A\354\231\200_B.java" @@ -0,0 +1,29 @@ +import java.io.*; + +public class Main { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + String S = br.readLine(); + StringBuilder T = new StringBuilder(br.readLine()); + + while (T.length() > S.length()) { + char last = T.charAt(T.length() - 1); + + if (last == 'A') { + // 맨 뒤 A 제거 + T.deleteCharAt(T.length() - 1); + } else { + // 맨 뒤 B 제거 후 뒤집기 + T.deleteCharAt(T.length() - 1); + T.reverse(); + } + } + + if (T.toString().equals(S)) { + System.out.println(1); + } else { + System.out.println(0); + } + } +} diff --git "a/week39/\354\235\264\354\203\201\354\226\265/backjoon/\352\265\254\353\221\220_\354\210\230\354\204\240\352\263\265.java" "b/week39/\354\235\264\354\203\201\354\226\265/backjoon/\352\265\254\353\221\220_\354\210\230\354\204\240\352\263\265.java" new file mode 100644 index 0000000..c831eac --- /dev/null +++ "b/week39/\354\235\264\354\203\201\354\226\265/backjoon/\352\265\254\353\221\220_\354\210\230\354\204\240\352\263\265.java" @@ -0,0 +1,29 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + List tasks = new ArrayList<>(); + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int T = Integer.parseInt(st.nextToken()); + int S = Integer.parseInt(st.nextToken()); + tasks.add(new int[]{T, S, i + 1}); // 시간 , 벌금 , 순서 + } + + tasks.sort((a, b) -> { + long comp = (long)b[1] * a[0] - (long)a[1] * b[0]; // + if (comp != 0) return comp > 0 ? 1 : -1; + return a[2] - b[2]; + }); + + StringBuilder sb = new StringBuilder(); + for (int[] task : tasks) { + sb.append(task[2]).append(" "); + } + System.out.println(sb.toString().trim()); + } +} diff --git "a/week39/\354\235\264\354\203\201\354\226\265/backjoon/\353\202\264\353\246\254\353\247\211\352\270\270.java" "b/week39/\354\235\264\354\203\201\354\226\265/backjoon/\353\202\264\353\246\254\353\247\211\352\270\270.java" new file mode 100644 index 0000000..28acf0c --- /dev/null +++ "b/week39/\354\235\264\354\203\201\354\226\265/backjoon/\353\202\264\353\246\254\353\247\211\352\270\270.java" @@ -0,0 +1,22 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int M = Integer.parseInt(st.nextToken()); + int N = Integer.parseInt(st.nextToken()); + + int[][] map = new int[M][N]; + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + for (int j = 0; j < N; j++) { + map[i][j] = Integer.parseInt(st.nextToken()); + } + } + + } +} diff --git "a/week39/\354\235\264\354\203\201\354\226\265/backjoon/\354\235\264\354\240\204_\354\210\234\354\227\264.java" "b/week39/\354\235\264\354\203\201\354\226\265/backjoon/\354\235\264\354\240\204_\354\210\234\354\227\264.java" new file mode 100644 index 0000000..fced62d --- /dev/null +++ "b/week39/\354\235\264\354\203\201\354\226\265/backjoon/\354\235\264\354\240\204_\354\210\234\354\227\264.java" @@ -0,0 +1,57 @@ +import java.io.*; +import java.util.*; + +public class Main { + + static void swap(int[] arr, int a, int b) { + int tmp = arr[a]; + arr[a] = arr[b]; + arr[b] = tmp; + } + + static void reverse(int[] arr, int start, int end) { + while (start < end) { + swap(arr, start, end); + start++; + end--; + } + } + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + int N = Integer.parseInt(br.readLine()); + int[] arr = new int[N]; + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + int i = N - 1; + while (i > 0 && arr[i - 1] < arr[i]) { // 오름차순 깨지는 구간 + i--; + } + + if (i == 0) { + System.out.println(-1); + return; + } + + int j = N - 1; + while (arr[j] > arr[i - 1]) { // 내림차순 깨지는 구간 + j--; + } + + swap(arr, i - 1, j); + + reverse(arr, i, N - 1); + + StringBuilder sb = new StringBuilder(); + for (int k = 0; k < N; k++) { + sb.append(arr[k]).append(" "); + } + System.out.println(sb.toString().trim()); + } +} diff --git "a/week40/\352\260\225\354\204\261\354\232\261/baekjoon/\354\210\253\354\236\220\352\263\240\353\245\264\352\270\260.java" "b/week40/\352\260\225\354\204\261\354\232\261/baekjoon/\354\210\253\354\236\220\352\263\240\353\245\264\352\270\260.java" new file mode 100644 index 0000000..92e80f0 --- /dev/null +++ "b/week40/\352\260\225\354\204\261\354\232\261/baekjoon/\354\210\253\354\236\220\352\263\240\353\245\264\352\270\260.java" @@ -0,0 +1,82 @@ +package week40.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week40.강성욱.baekjoon + * FileName : 숫자고르기 + * Author : Baekgwa + * Date : 26. 2. 6. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 2. 6. Baekgwa Initial creation + */ +public class 숫자고르기 { + public class Main { + // 1번줄의 집합에 순서대로 들어가있음. + // 즉, 중복된 숫자를 가지는 집합인 답을 절때로 없음. + // 이거 2번에 나오는걸 map 으로 가지고 있기? + // 그럼 일딴 위에꺼 무시하고, 아래꺼 기준으로 뽑을 수는 있는데. + // 그거 중에서 매칭 안되는걸 (1번 집합이랑 매칭해봤을때) 어케 필터링 해야하지? + private static int N; + private static int[] arr; + private static boolean[] visited; + private static boolean[] finished; + private static final List result = new ArrayList<>(); + private static final List path = new ArrayList<>(); + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); + arr = new int[N + 1]; + visited = new boolean[N + 1]; + finished = new boolean[N + 1]; + + for (int i = 1; i <= N; i++) { + arr[i] = Integer.parseInt(br.readLine()); + } + + for (int i = 1; i <= N; i++) { + if (!visited[i]) { + dfs(i); + } + } + + Collections.sort(result); + + System.out.println(result.size()); + for (int num : result) { + System.out.println(num); + } + } + + private static void dfs(int current) { + visited[current] = true; + path.add(current); + int next = arr[current]; + + if (!visited[next]) { + dfs(next); + } else { + if (!finished[next]) { + int idx = path.indexOf(next); + for (int i = idx; i < path.size(); i++) { + result.add(path.get(i)); + } + + } + } + + finished[current] = true; + path.remove(path.size() - 1); + } + } +} diff --git "a/week40/\352\260\225\354\204\261\354\232\261/programers/\354\204\254_\354\227\260\352\262\260\355\225\230\352\270\260.java" "b/week40/\352\260\225\354\204\261\354\232\261/programers/\354\204\254_\354\227\260\352\262\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..abde734 --- /dev/null +++ "b/week40/\352\260\225\354\204\261\354\232\261/programers/\354\204\254_\354\227\260\352\262\260\355\225\230\352\270\260.java" @@ -0,0 +1,123 @@ +package week40.강성욱.programers; + +import java.util.Arrays; + +/** + * PackageName : week40.강성욱.programers + * FileName : 섬_연결하기 + * Author : Baekgwa + * Date : 26. 2. 6. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 2. 6. Baekgwa Initial creation + */ +public class 섬_연결하기 { + // 전부 다 확인하기에는 너무 많음 ㅠ + // 그래프? + // union-find 까지는 굳이? + // 가장 비용이 적은 것 대로 정렬을 해서 나열을 한다면? + // 그리고 초기에는 다리는 0 이니깐, 연결 된 대로, list 로 관리해서 그걸 넣는다면? + // 근데 그게 과연 항상 옳은 방법? + // 그게 맞는거 아냐? + // N개가 있으면 다리는 최소 N개는 놔야함. + // 쭉 반복해서 넣다가 list 에 N개만큼 차는 순간 다 연결된거 아냐? + // 이렇게 되면, 섬이 전체 하나로 연결됬는지 유무는 확인이 불가능하네. + // 결국 union-find 해야할듯? + class Solution { + public int solution(int n, int[][] costs) { + Arrays.sort(costs, (a, b) -> Integer.compare(a[2], b[2])); + + int[] parent = new int[n]; + for(int i=0; i pq = new PriorityQueue<>((a, b) -> Integer.compare(a.getCost(), b.getCost())); + // boolean[] isConnected = new boolean[n]; + // int connectCount = 0; + // int totalCost = 0; + + // for(int[] cost : costs) { + // pq.offer(new Edge(cost)); + // } + + // while(true) { + // Edge nowEdge = pq.poll(); + // int start = nowEdge.getStart(); + // int end = nowEdge.getEnd(); + + // // 이미 두개 다 섬이 연결된 상태면 굳이 할 필요가 없음 여기는 + // if(isConnected[start] && isConnected[end]) continue; + + // // 이제 섬 연결하기. + // if(!isConnected[start]) { + // connectCount++; + // isConnected[start] = true; + // } + + // if(!isConnected[end]) { + // connectCount++; + // isConnected[end] = true; + // } + + // totalCost += nowEdge.getCost(); + + // if(connectCount == n) break; + // } + + // return totalCost; + // } + + // private class Edge { + // private int start; + // private int end; + // private int cost; + + // public Edge(int[] info) { + // this.start = info[0]; + // this.end = info[1]; + // this.cost = info[2]; + // } + + // public int getStart() { return this.start; } + // public int getEnd() { return this.end; } + // public int getCost() { return this.cost; } + // } + // } +} diff --git "a/week40/\352\260\225\354\204\261\354\232\261/programers/\354\266\224\354\204\235_\355\212\270\353\236\230\355\224\275.java" "b/week40/\352\260\225\354\204\261\354\232\261/programers/\354\266\224\354\204\235_\355\212\270\353\236\230\355\224\275.java" new file mode 100644 index 0000000..87df755 --- /dev/null +++ "b/week40/\352\260\225\354\204\261\354\232\261/programers/\354\266\224\354\204\235_\355\212\270\353\236\230\355\224\275.java" @@ -0,0 +1,107 @@ +package week40.강성욱.programers; + +/** + * PackageName : week40.강성욱.programers + * FileName : 추석_트래픽 + * Author : Baekgwa + * Date : 26. 2. 6. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 26. 2. 6. Baekgwa Initial creation + */ +public class 추석_트래픽 { + class Solution { + // 그 시간대에 진행중이기만 하면 오케 + // 음 그럼 그냥 파싱해서, 그 시간대 정보만큼 count++ 하면 되는거 아닌가? + // 최대 N(작업 개수) 는 2000개 + // 시간의 정보는, 00시 00분 00초 부터, 23시 59분 59초 까지. 총? 60*60*24 = 86400 + // 모든 정보가 시작부터 끝까지 처리되는 그럴리가 없네. => 처리시간은 최대 3초 + // 그럼 3초, 앞뒤로 겹쳐서 최대 4초 + // 작업들이 모두 4초쪽에 걸리면, 8000 개만 처리? + // 그냥 쉬운데? 할만한데? + + public int solution(String[] lines) { + int n = lines.length; + long[][] logs = new long[n][2]; + + for (int i = 0; i < n; i++) { + String[] parts = lines[i].split(" "); + + long end = toMillis(parts[1]); + long duration = parseDuration(parts[2]); + long start = end - duration + 1; + + logs[i][0] = start; + logs[i][1] = end; + } + + int max = 0; + + for (int i = 0; i < n; i++) { + max = Math.max(max, countOverlap(logs, logs[i][0])); + max = Math.max(max, countOverlap(logs, logs[i][1])); + } + + return max; + } + + private int countOverlap(long[][] logs, long windowStart) { + long windowEnd = windowStart + 999; + int count = 0; + + for (long[] log : logs) { + if (log[0] <= windowEnd && log[1] >= windowStart) { + count++; + } + } + + return count; + } + + private long toMillis(String time) { + String[] hms = time.split(":"); + + int hour = Integer.parseInt(hms[0]); + int minute = Integer.parseInt(hms[1]); + + String[] secMilli = hms[2].split("\\."); + int second = Integer.parseInt(secMilli[0]); + int milli = Integer.parseInt(secMilli[1]); + + return hour * 3600_000L + + minute * 60_000L + + second * 1_000L + + milli; + } + + private long parseDuration(String durationStr) { + String value = durationStr.substring(0, durationStr.length() - 1); + double seconds = Double.parseDouble(value); + return (long) (seconds * 1000); + } + } + + + // // 2016-09-15 01:00:04.001 + // // 형식을, time 형태로 변환 + // private LocalDateTime convertDateTimeFormat(String date, String time) { + // String[] dateArray = date.split("-"); + // String[] timeArray = time.split(":"); + // // sec 랑 ns + // String[] secArray = timeArray[2].split("\\."); + // int sec = Integer.parseInt(secArray[0]); + // int ns = Integer.parseInt(secArray[1]) * 1_000_000; // 기본 밀리초에서 나노로 변환 + + // return LocalDateTime.of( + // Integer.parseInt(dateArray[0]), + // Integer.parseInt(dateArray[1]), + // Integer.parseInt(dateArray[2]), + // Integer.parseInt(timeArray[0]), + // Integer.parseInt(timeArray[1)], + // sec, + // ns + // ); + // } +} diff --git "a/week7_a/\352\271\200\353\202\230\354\235\200/programmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" "b/week7_a/\352\271\200\353\202\230\354\235\200/programmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" new file mode 100644 index 0000000..1ccc656 --- /dev/null +++ "b/week7_a/\352\271\200\353\202\230\354\235\200/programmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" @@ -0,0 +1,41 @@ +package week7_a.김나은.programmers; + +import java.util.ArrayDeque; +import java.util.Deque; + +public class 주식가격 { + + class Solution { + + public int[] solution(int[] prices) { + + // 각 시점별로 '가격이 떨어지지 않은 기간(초)'을 저장할 배열 + int[] answer = new int[prices.length]; + + // 스택에는 아직 '가격이 떨어지지 않은 시점(index)'을 저장 + Deque stack = new ArrayDeque<>(); + + // 모든 시점을 순회 + for (int i = 0; i < prices.length; i++) { + // 스택이 비어있지 않고, 현재 가격이 스택 top의 가격보다 낮으면, 가격 하락 발생 + while (!stack.isEmpty() && prices[i] < prices[stack.peek()]) { + // 떨어진 시점의 index 꺼냄 + int prev = stack.pop(); + // 현재 시점 i까지 걸린 시간 저장 + answer[prev] = i - prev; + } + // 아직 안 떨어진 시점(index)을 스택에 저장 + stack.push(i); + } + + // 끝까지 가격이 안 떨어진 시점들 처리 + while (!stack.isEmpty()) { + int prev = stack.pop(); + // 마지막까지 안 떨어졌으므로 남은 전체 시간 + answer[prev] = prices.length - prev - 1; + } + + return answer; + } + } +}