diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7248e42..b2ea610 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,3 +1,5 @@ + + ## ✅ 관련 이슈 - 이슈 번호: diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..041520d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ + +/.idea/ +/java-coding-test-study.iml diff --git "a/week1/\352\260\225\354\204\261\354\232\261/baekjoon/\354\212\244\355\203\2352.java" "b/week1/\352\260\225\354\204\261\354\232\261/baekjoon/\354\212\244\355\203\2352.java" new file mode 100644 index 0000000..a3376dd --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/baekjoon/\354\212\244\355\203\2352.java" @@ -0,0 +1,55 @@ +package week1.강성욱.baekjoon; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.Scanner; + +public class 스택2 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + StringBuilder sb = new StringBuilder(); + Deque stack = new ArrayDeque<>(); + + int n = sc.nextInt(); + sc.nextLine(); + + for (int i = 0; i < n; i++) { + String command = sc.nextLine(); + + if (command.startsWith("1")) { + handlePush(stack, command); + continue; + } + + switch (command) { + case "2": + handlePop(stack, sb); + break; + case "3": + sb.append(stack.size()).append("\n"); + break; + case "4": + sb.append(stack.isEmpty() ? 1 : 0).append("\n"); + break; + case "5": + handlePeek(stack, sb); + break; + } + } + + System.out.print(sb); + } + + private static void handlePush(Deque stack, String command) { + int x = Integer.parseInt(command.split(" ")[1]); + stack.push(x); + } + + private static void handlePop(Deque stack, StringBuilder sb) { + sb.append(stack.isEmpty() ? "-1" : stack.pop()).append("\n"); + } + + private static void handlePeek(Deque stack, StringBuilder sb) { + sb.append(stack.isEmpty() ? "-1" : stack.peek()).append("\n"); + } +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/x\353\247\214\355\201\274_\352\260\204\352\262\251\354\235\264_\354\236\210\353\212\224_N\352\260\234\354\235\230_\354\210\253\354\236\220.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/x\353\247\214\355\201\274_\352\260\204\352\262\251\354\235\264_\354\236\210\353\212\224_N\352\260\234\354\235\230_\354\210\253\354\236\220.java" new file mode 100644 index 0000000..00bec2e --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/x\353\247\214\355\201\274_\352\260\204\352\262\251\354\235\264_\354\236\210\353\212\224_N\352\260\234\354\235\230_\354\210\253\354\236\220.java" @@ -0,0 +1,17 @@ +package week1.강성욱.programmers; + +public class x만큼_간격이_있는_N개의_숫자 { + //이거, overflow 때문인지, 테스트 케이스가 몇개 통과가 안되서 고민했었음. + + class Solution { + public long[] solution(int x, int n) { + long[] answer = new long[n]; + + for (int i=1; i<=n; i++) { + answer[i-1] = (long)x * i; + } + + return answer; + } + } +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/\353\202\230\353\250\270\354\247\200\352\260\200_1\354\235\264_\353\220\230\353\212\224_\354\210\230_\354\260\276\352\270\260.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\353\202\230\353\250\270\354\247\200\352\260\200_1\354\235\264_\353\220\230\353\212\224_\354\210\230_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..5b567cc --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\353\202\230\353\250\270\354\247\200\352\260\200_1\354\235\264_\353\220\230\353\212\224_\354\210\230_\354\260\276\352\270\260.java" @@ -0,0 +1,14 @@ +package week1.강성욱.programmers; + +public class 나머지가_1이_되는_수_찾기 { + class Solution { + public int solution(int n) { + for (int i=1; i b ? a : b; + + long sum = 0L; + for(int i = start; i <= end; i++) { + sum += (long)i; + } + + return sum; + } + } +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_P\354\231\200_Y\354\235\230_\352\260\234\354\210\230.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_P\354\231\200_Y\354\235\230_\352\260\234\354\210\230.java" new file mode 100644 index 0000000..9c09274 --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_P\354\231\200_Y\354\235\230_\352\260\234\354\210\230.java" @@ -0,0 +1,21 @@ +package week1.강성욱.programmers; + +public class 문자열_내_P와_Y의_개수 { + class Solution { + boolean solution(String s) { + s = s.toLowerCase(); // 모두 소문자로 통일 + int p = 0; + int y = 0; + + for (char c : s.toCharArray()) { + if (c == 'p') { + p++; + } else if (c == 'y') { + y++; + } + } + + return p == y; + } + } +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\236\220\354\227\264\354\235\204_\354\240\225\354\210\230\353\241\234_\353\260\224\352\276\270\352\270\260.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\236\220\354\227\264\354\235\204_\354\240\225\354\210\230\353\241\234_\353\260\224\352\276\270\352\270\260.java" new file mode 100644 index 0000000..9b55e3e --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\236\220\354\227\264\354\235\204_\354\240\225\354\210\230\353\241\234_\353\260\224\352\276\270\352\270\260.java" @@ -0,0 +1,9 @@ +package week1.강성욱.programmers; + +public class 문자열을_정수로_바꾸기 { + class Solution { + public int solution(String s) { + return Integer.parseInt(s); + } + } +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\225\275\354\210\230\354\235\230_\355\225\251.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\225\275\354\210\230\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..428caa3 --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\225\275\354\210\230\354\235\230_\355\225\251.java" @@ -0,0 +1,18 @@ +package week1.강성욱.programmers; + +public class 약수의_합 { + //약수를 모두 더한 값 + //특정 수를 나눴을때, 나머지가 0 이면, 약수. + //3000 까지이니, 전체 반복돌려도 크게 문제 없을듯. + //만약 3000 이상이라면, 엄청 크게 잡아야 될듯. + + class Solution { + public int solution(int n) { + int sum = 0; + for (int i = 1; i <= n; i++) { + if (n % i == 0) sum += i; //약수 + } + return sum; + } + } +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\236\220\353\246\277\354\210\230_\353\215\224\355\225\230\352\270\260.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\236\220\353\246\277\354\210\230_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..424112c --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\236\220\353\246\277\354\210\230_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,20 @@ +package week1.강성욱.programmers; + +public class 자릿수_더하기 { + //10씩 나누자? +//123 / 10 = 12 이건 다음에 전달 +//123%10 = 3 이건 더하고 + + public class Solution { + public int solution(int n) { + int sum = 0; + + while (n > 0) { + sum += n % 10; + n /= 10; + } + + return sum; + } + } +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\236\220\354\227\260\354\210\230_\353\222\244\354\247\221\354\226\264_\353\260\260\354\227\264\353\241\234_\353\247\214\353\223\244\352\270\260.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\236\220\354\227\260\354\210\230_\353\222\244\354\247\221\354\226\264_\353\260\260\354\227\264\353\241\234_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..118de50 --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\236\220\354\227\260\354\210\230_\353\222\244\354\247\221\354\226\264_\353\260\260\354\227\264\353\241\234_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,24 @@ +package week1.강성욱.programmers; + +import java.util.ArrayList; +import java.util.List; + +public class 자연수_뒤집어_배열로_만들기 { + class Solution { + public int[] solution(long n) { + List list = new ArrayList<>(); + + while (n > 0) { + list.add((int) (n % 10)); + n /= 10; + } + + int[] result = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + result[i] = list.get(i); + } + + return result; + } + } +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\247\235\354\210\230\354\231\200_\355\231\200\354\210\230.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\247\235\354\210\230\354\231\200_\355\231\200\354\210\230.java" new file mode 100644 index 0000000..3b1f881 --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\354\247\235\354\210\230\354\231\200_\355\231\200\354\210\230.java" @@ -0,0 +1,9 @@ +package week1.강성욱.programmers; + +public class 짝수와_홀수 { + class Solution { + public String solution(int num) { + return num%2 == 0 ? "Even" : "Odd"; + } + } +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/\355\217\211\352\267\240_\352\265\254\355\225\230\352\270\260.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\355\217\211\352\267\240_\352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..8efc665 --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\355\217\211\352\267\240_\352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,11 @@ +package week1.강성욱.programmers; + +import java.util.Arrays; + +public class 평균_구하기 { + class Solution { + public double solution(int[] arr) { + return Arrays.stream(arr).average().orElse(0); + } + } +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/\355\221\270\355\212\270_\355\214\214\354\235\264\355\212\270_\353\214\200\355\232\214.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\355\221\270\355\212\270_\355\214\214\354\235\264\355\212\270_\353\214\200\355\232\214.java" new file mode 100644 index 0000000..897ddbc --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\355\221\270\355\212\270_\355\214\214\354\235\264\355\212\270_\353\214\200\355\232\214.java" @@ -0,0 +1,19 @@ +package week1.강성욱.programmers; + +public class 푸트_파이트_대회 { + class Solution { + public String solution(int[] food) { + StringBuilder left = new StringBuilder(); + + //0은 안봐도됨 + for (int i = 1; i < food.length; i++) { + int count = food[i] / 2; + for (int j = 0; j < count; j++) { + left.append(i); + } + } + return left.toString() + "0" + left.reverse().toString(); + } + } + +} diff --git "a/week1/\352\260\225\354\204\261\354\232\261/programmers/\355\225\230\354\203\244\353\223\234_\354\210\230.java" "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\355\225\230\354\203\244\353\223\234_\354\210\230.java" new file mode 100644 index 0000000..7e979fc --- /dev/null +++ "b/week1/\352\260\225\354\204\261\354\232\261/programmers/\355\225\230\354\203\244\353\223\234_\354\210\230.java" @@ -0,0 +1,17 @@ +package week1.강성욱.programmers; + +public class 하샤드_수 { + class Solution { + public boolean solution(int x) { + int sum = 0; + int temp = x; + + while(temp > 0) { + sum += temp % 10; + temp /= 10; + } + + return x%sum == 0 ? true : false; + } + } +} diff --git "a/week1/\352\271\200\353\202\230\354\235\200/baekjoon/\354\212\244\355\203\235 2.java" "b/week1/\352\271\200\353\202\230\354\235\200/baekjoon/\354\212\244\355\203\235 2.java" new file mode 100644 index 0000000..9bba4ae --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/baekjoon/\354\212\244\355\203\235 2.java" @@ -0,0 +1,47 @@ +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 = null; + StringBuilder str = new StringBuilder(); + + int N = Integer.parseInt(br.readLine()); + Stack stack = new Stack<>(); + + for (int n = 0; n < N; n++) { + st = new StringTokenizer(br.readLine()); + int M = Integer.parseInt(st.nextToken()); + + switch (M) { + case 1: + stack.push(Integer.parseInt(st.nextToken())); + break; + case 2: + if (stack.isEmpty()) + str.append(-1).append("\n"); + else + str.append(stack.pop()).append("\n"); + break; + case 3: + str.append(stack.size()).append("\n"); + break; + case 4: + if (stack.isEmpty()) + str.append(1).append("\n"); + else + str.append(0).append("\n"); + break; + case 5: + if (stack.isEmpty()) + str.append(-1).append("\n"); + else + str.append(stack.peek()).append("\n"); + break; + } + } + System.out.print(str); + br.close(); + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/x\353\247\214\355\201\274 \352\260\204\352\262\251\354\235\264 \354\236\210\353\212\224 n\352\260\234\354\235\230 \354\210\253\354\236\220.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/x\353\247\214\355\201\274 \352\260\204\352\262\251\354\235\264 \354\236\210\353\212\224 n\352\260\234\354\235\230 \354\210\253\354\236\220.java" new file mode 100644 index 0000000..a42c8fa --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/x\353\247\214\355\201\274 \352\260\204\352\262\251\354\235\264 \354\236\210\353\212\224 n\352\260\234\354\235\230 \354\210\253\354\236\220.java" @@ -0,0 +1,13 @@ +package week1.김나은.programmers; + +class Solution { + public long[] solution(int x, int n) { + long[] answer = new long[n]; + + for(int i = 0; i < n; i++) { + answer[i] = (long)x * (i + 1); + } + + return answer; + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\202\230\353\250\270\354\247\200\352\260\200 1\354\235\264 \353\220\230\353\212\224 \354\210\230 \354\260\276\352\270\260.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\202\230\353\250\270\354\247\200\352\260\200 1\354\235\264 \353\220\230\353\212\224 \354\210\230 \354\260\276\352\270\260.java" new file mode 100644 index 0000000..0a473b2 --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\202\230\353\250\270\354\247\200\352\260\200 1\354\235\264 \353\220\230\353\212\224 \354\210\230 \354\260\276\352\270\260.java" @@ -0,0 +1,16 @@ +package week1.김나은.programmers; + +class Solution { + public int solution(int n) { + int answer = 0; + + for(int i = 1; i < n; i++) { + if(n % i == 1) { + answer = i; + break; + } + } + + return answer; + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\221\220 \354\240\225\354\210\230 \354\202\254\354\235\264\354\235\230 \355\225\251.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\221\220 \354\240\225\354\210\230 \354\202\254\354\235\264\354\235\230 \355\225\251.java" new file mode 100644 index 0000000..020c2c3 --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\221\220 \354\240\225\354\210\230 \354\202\254\354\235\264\354\235\230 \355\225\251.java" @@ -0,0 +1,13 @@ +package week1.김나은.programmers; + +class Solution { + public long solution(int a, int b) { + long answer = 0; + + for(int i = ((a < b) ? a : b); i <= ((a < b) ? b : a); i++) { + answer += i; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\254\270\354\236\220\354\227\264 \353\202\264 p\354\231\200 y\354\235\230 \352\260\234\354\210\230.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\254\270\354\236\220\354\227\264 \353\202\264 p\354\231\200 y\354\235\230 \352\260\234\354\210\230.java" new file mode 100644 index 0000000..827053a --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\254\270\354\236\220\354\227\264 \353\202\264 p\354\231\200 y\354\235\230 \352\260\234\354\210\230.java" @@ -0,0 +1,19 @@ +package week1.김나은.programmers; + +class Solution { + boolean solution(String s) { + s = s.toLowerCase(); + int count = 0; + + for (int i = 0; i < s.length(); i++) { + + if (s.charAt(i) == 'p') { + count++; + } else if (s.charAt(i) == 'y') { + count--; + } + } + + return count == 0; + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\254\270\354\236\220\354\227\264\354\235\204 \354\240\225\354\210\230\353\241\234 \353\260\224\352\276\270\352\270\260.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\254\270\354\236\220\354\227\264\354\235\204 \354\240\225\354\210\230\353\241\234 \353\260\224\352\276\270\352\270\260.java" new file mode 100644 index 0000000..edbcdba --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\353\254\270\354\236\220\354\227\264\354\235\204 \354\240\225\354\210\230\353\241\234 \353\260\224\352\276\270\352\270\260.java" @@ -0,0 +1,7 @@ +package week1.김나은.programmers; + +class Solution { + public int solution(String s) { + return Integer.parseInt(s); + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\225\275\354\210\230\354\235\230 \355\225\251.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\225\275\354\210\230\354\235\230 \355\225\251.java" new file mode 100644 index 0000000..72bfa1d --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\225\275\354\210\230\354\235\230 \355\225\251.java" @@ -0,0 +1,16 @@ +package week1.김나은.programmers; + +class Solution { + + public int solution(int n) { + int answer = 0; + + for (int i = 1; i <= n; i++) { + if (n % i == 0) { + answer += i; + } + } + + return answer; + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\236\220\353\246\277\354\210\230 \353\215\224\355\225\230\352\270\260.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\236\220\353\246\277\354\210\230 \353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..ea83d43 --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\236\220\353\246\277\354\210\230 \353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,16 @@ +package week1.김나은.programmers; + +import java.util.*; + +public class Solution { + public int solution(int n) { + int answer = 0; + + while(n > 0) { + answer += n % 10; + n = n / 10; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\236\220\354\227\260\354\210\230 \353\222\244\354\247\221\354\226\264 \353\260\260\354\227\264\353\241\234 \353\247\214\353\223\244\352\270\260.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\236\220\354\227\260\354\210\230 \353\222\244\354\247\221\354\226\264 \353\260\260\354\227\264\353\241\234 \353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..a965323 --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\236\220\354\227\260\354\210\230 \353\222\244\354\247\221\354\226\264 \353\260\260\354\227\264\353\241\234 \353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,15 @@ +package week1.김나은.programmers; + +class Solution { + public int[] solution(long n) { + String reversed = new StringBuilder(String.valueOf(n)).reverse().toString(); + + int[] answer = new int[reversed.length()]; + + for(int i = 0; i < reversed.length(); i++) { + answer[i] = reversed.charAt(i) - '0'; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\247\235\354\210\230\354\231\200 \355\231\200\354\210\230.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\247\235\354\210\230\354\231\200 \355\231\200\354\210\230.java" new file mode 100644 index 0000000..3654b26 --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\354\247\235\354\210\230\354\231\200 \355\231\200\354\210\230.java" @@ -0,0 +1,9 @@ +package week1.김나은.programmers; + +class Solution { + public String solution(int num) { + + return (num % 2 == 0) ? "Even" : "Odd"; + + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\355\217\211\352\267\240 \352\265\254\355\225\230\352\270\260.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\355\217\211\352\267\240 \352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..e7507b9 --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\355\217\211\352\267\240 \352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,15 @@ +package week1.김나은.programmers; + +class Solution { + public double solution(int[] arr) { + double answer = 0; + double sum = 0; + + for(int i = 0; i < arr.length; i++) { + sum += arr[i]; + } + answer = sum / arr.length; + + return answer; + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\355\221\270\353\223\234 \355\214\214\354\235\264\355\212\270 \353\214\200\355\232\214.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\355\221\270\353\223\234 \355\214\214\354\235\264\355\212\270 \353\214\200\355\232\214.java" new file mode 100644 index 0000000..70a4751 --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\355\221\270\353\223\234 \355\214\214\354\235\264\355\212\270 \353\214\200\355\232\214.java" @@ -0,0 +1,14 @@ +package week1.김나은.programmers; + +class Solution { + public String solution(int[] food) { + String answer = "0"; + + for (int i = food.length - 1; i > 0; i--) { + for (int j = 0; j < food[i] / 2; j++) { + answer = i + answer + i; + } + } + return answer; + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\202\230\354\235\200/programmers/\355\225\230\354\203\244\353\223\234 \354\210\230.java" "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\355\225\230\354\203\244\353\223\234 \354\210\230.java" new file mode 100644 index 0000000..ba07645 --- /dev/null +++ "b/week1/\352\271\200\353\202\230\354\235\200/programmers/\355\225\230\354\203\244\353\223\234 \354\210\230.java" @@ -0,0 +1,20 @@ +package week1.김나은.programmers; + +class Solution { + public boolean solution(int x) { + boolean answer = true; + int sum = 0; + int temp = x; + + while (temp > 0) { + sum += temp % 10; + temp /= 10; + } + + if (x % sum != 0) { + answer = false; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week1/\352\271\200\353\210\204\353\246\254/baekjoon/\354\212\244\355\203\235_2.java" "b/week1/\352\271\200\353\210\204\353\246\254/baekjoon/\354\212\244\355\203\235_2.java" new file mode 100644 index 0000000..d14003f --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/baekjoon/\354\212\244\355\203\235_2.java" @@ -0,0 +1,82 @@ +package week1.김누리.baekjoon; + +/** + * PackageName : Week1.김누리.programmers + * FileName : 스택_2 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + */ + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.*; + +public class 스택_2 { + public void baekjoonStack2() throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 명령어 읽어오는 용도 + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 로그 출력용 + StringBuilder sb = new StringBuilder(); // 출력 내용 구성을 위한 sb + int n = Integer.parseInt(br.readLine()); // 명령어 갯수 판독용 + + Stack st = new Stack<>(); //정수 저장용 Stack + + // 읽어온 명령어 만큼 반복 진행 + for(int i = 0; i < n; i++ ) { + String cmd = br.readLine(); + + // 1 X로 들어오기 때문에 1의 경우는 startsWith를 이용 + if(cmd.startsWith("1")) { + String s = cmd.substring(2); + st.push(Integer.parseInt(s)); + } + + if(cmd.equals("2")) { + // 스택에 정수가 없으면 -1 출력 + if(st.isEmpty()) { + sb.append("-1\n"); + } else { + // 스택에 정수가 있으면 가장 위에 있는 값을 pop 하고 출력 + sb.append(st.peek()+"\n"); + st.pop(); + } + } + + if(cmd.equals("3")) { + // 스택에 들어있는 정수의 갯수 출력 + sb.append(st.size()+"\n"); + } + + if(cmd.equals("4")) { + // 스택이 비어있으면 1 출력 + if(st.isEmpty()) { + sb.append("1\n"); + } else { + // 스택이 비어있지 않으면 0 출력 + sb.append("0\n"); + } + } + + if(cmd.equals("5")) { + // 스택에 정수가 없으면 -1 출력 + if(st.isEmpty()) { + sb.append("-1\n"); + } else { + // 스택에 정수가 있다면 맨 위의 정수 출력 + sb.append(st.peek()+"\n"); + } + } + } + + bw.write(sb.toString()); + bw.flush(); + br.close(); + bw.close(); + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/x\353\247\214\355\201\274_\352\260\204\352\262\251\354\235\264_\354\236\210\353\212\224_n\352\260\234\354\235\230_\354\210\253\354\236\220.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/x\353\247\214\355\201\274_\352\260\204\352\262\251\354\235\264_\354\236\210\353\212\224_n\352\260\234\354\235\230_\354\210\253\354\236\220.java" new file mode 100644 index 0000000..9b2b671 --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/x\353\247\214\355\201\274_\352\260\204\352\262\251\354\235\264_\354\236\210\353\212\224_n\352\260\234\354\235\230_\354\210\253\354\236\220.java" @@ -0,0 +1,41 @@ +package week1.김누리.programmers; + +import java.util.stream.IntStream; + +/* + * PackageName : Week1.김누리.programmers + * FileName : x만큼_간격이_있는_n개의_숫자 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + * 2025. 04. 27. 김누리 Stream API를 이용하지 않은 버전 작성 + * 2025. 04. 27. 김누리 Stream API를 이용하는 버전 작성 + */ +public class x만큼_간격이_있는_n개의_숫자 { + public long[] solution(int x, int n) { + // Stream API 이용 버전 +/* return IntStream.rangeClosed(1,n) + .mapToLong(i -> (long)x*(i)) + .toArray();*/ + + // Stream API 이용하지 않는 버전 + long[] answer = new long[n]; + + for (int i = 0; i < n; i++) { + answer[i] = (long)x*(i+1); + } + return answer; + } + + public void call_solution(int x, int n) { + long[] answer = solution(x, n); + + for(long i : answer) { + System.out.println(i); + } + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\202\230\353\250\270\354\247\200\352\260\200_1\354\235\264_\353\220\230\353\212\224_\354\210\230_\354\260\276\352\270\260.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\202\230\353\250\270\354\247\200\352\260\200_1\354\235\264_\353\220\230\353\212\224_\354\210\230_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..2123f93 --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\202\230\353\250\270\354\247\200\352\260\200_1\354\235\264_\353\220\230\353\212\224_\354\210\230_\354\260\276\352\270\260.java" @@ -0,0 +1,43 @@ +package week1.김누리.programmers; + +import java.util.stream.IntStream; + +/* + * PackageName : Week1.김누리.programmers + * FileName : 나머지가_1이_되는_수_찾기 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + * 2025. 04. 27. 김누리 Stream API 버전 개발 + * 2025. 04. 27. 김누리 Stream API을 이용하지 않는 버전 개발 + */ +public class 나머지가_1이_되는_수_찾기 { + public int solution(int n) { + // Stream API 이용 버전 +/* return IntStream.rangeClosed(1,n) + .filter(i -> n % i == 1) + .min() + .orElse(0);*/ + + // Stream API 이용하지 않은 버전 + int answer = 0; + + for(int i = 1; i <= n; i++ ) { + if(n % i == 1) { + answer = i; + break; // ex) 10을 1, 2, 3 ~ 순차적으로 나눠 가면서 나머지가 1 인 값 중 최소값이 발견되는 경우 반복 종료. + } + } + + return answer; + } + + public void call_solution(int n) { + int answer = solution(n); + System.out.println(answer); + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\221\220_\354\240\225\354\210\230_\354\202\254\354\235\264\354\235\230_\355\225\251.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\221\220_\354\240\225\354\210\230_\354\202\254\354\235\264\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..aa551c8 --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\221\220_\354\240\225\354\210\230_\354\202\254\354\235\264\354\235\230_\355\225\251.java" @@ -0,0 +1,45 @@ +package week1.김누리.programmers; + +import java.util.stream.IntStream; + +/* + * PackageName : Week1.김누리.programmers + * FileName : 두_정수_사이의_합 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + * 2025. 04. 27. 김누리 Stream API 버전 + * 2025. 04. 27. 김누리 Stream API이용하지 않은 버전 + */ +public class 두_정수_사이의_합 { + public long solution(int a, int b) { + // Stream API 이용 +/* + return IntStream.rangeClosed(Math.min(a,b), Math.max(a,b)) + .asLongStream() + .sum(); +*/ + + // Stream API 이용 X + long answer = 0; + + if(a == b) return a; // a와 b가 같을 때 아무거나 리턴 + + for(int i = Math.min(a,b); i <= Math.max(a,b); i++) { + answer += i; + } + + + return answer; + } + + public void call_solution(int a, int b) { + long answer = solution(a, b); + + System.out.println(answer); + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_p\354\231\200_y\354\235\230_\352\260\234\354\210\230.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_p\354\231\200_y\354\235\230_\352\260\234\354\210\230.java" new file mode 100644 index 0000000..59854f3 --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_p\354\231\200_y\354\235\230_\352\260\234\354\210\230.java" @@ -0,0 +1,36 @@ +package week1.김누리.programmers; + +/* + * PackageName : Week1.김누리.programmers + * FileName : 문자열_내_p와_y의_개수 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + */ +public class 문자열_내_p와_y의_개수 { + public boolean solution(String s) { + boolean answer = true; + int pCnt = 0; + int yCnt = 0; + String[] tmp = s.split(""); + + for(String s2 : tmp) { + if(s2.equalsIgnoreCase("p")) pCnt++; + if(s2.equalsIgnoreCase("y")) yCnt++; + } + + if(pCnt != yCnt) answer = false; + + return answer; + } + + public void call_solution(String s) { + boolean answer = solution(s); + + System.out.println(answer); + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\236\220\354\227\264\354\235\204_\354\240\225\354\210\230\353\241\234_\353\260\224\352\276\270\352\270\260.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\236\220\354\227\264\354\235\204_\354\240\225\354\210\230\353\241\234_\353\260\224\352\276\270\352\270\260.java" new file mode 100644 index 0000000..0690071 --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\236\220\354\227\264\354\235\204_\354\240\225\354\210\230\353\241\234_\353\260\224\352\276\270\352\270\260.java" @@ -0,0 +1,18 @@ +package week1.김누리.programmers; + +/* + * PackageName : Week1.김누리.programmers + * FileName : 문자열을_정수로_바꾸기 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + */ +public class 문자열을_정수로_바꾸기 { + public int solution(String s) { + return Integer.parseInt(s); + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\225\275\354\210\230\354\235\230_\355\225\251.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\225\275\354\210\230\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..80aca5f --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\225\275\354\210\230\354\235\230_\355\225\251.java" @@ -0,0 +1,44 @@ +package week1.김누리.programmers; + +/* + * PackageName : Week1.김누리.programmers + * FileName : 약수의_합 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + * 2025. 04. 26. 김누리 Stream API 버전 작성 + * 2025. 04. 27. 김누리 Stream API을 이용하지 않는 버전 작성 + */ + +import java.util.stream.IntStream; + +public class 약수의_합 { + + public int solution(int n) { + // Stream API 버전 +/* return IntStream.rangeClosed(1, n) + .filter(i -> n%i == 0 ) + .sum();*/ + + // Stream API를 이용하지 않은 버전 + int answer = 0; + + for(int i = 1; i <= n; i++) { + if(n%i == 0) { + answer += i; + } + } + + return answer; + } + + public void call_solution(int n) { + int answer = solution(n); + + System.out.println(answer); + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\236\220\353\246\277\354\210\230_\353\215\224\355\225\230\352\270\260.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\236\220\353\246\277\354\210\230_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..9733af0 --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\236\220\353\246\277\354\210\230_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,41 @@ +package week1.김누리.programmers; + +import java.util.stream.IntStream; + +/* + * PackageName : Week1.김누리.programmers + * FileName : 자릿수_더하기 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + * 2025. 04. 27. 김누리 Stream API 버전 작성 + * 2025. 04. 27. 김누리 Stream API을 이용하지 않는 버전 작성 + */ + +public class 자릿수_더하기 { + public int solution(int n) { + // Stream API 이용 버전 +/* return IntStream.iterate(n, i -> i > 0, i -> i / 10) // i가 0보다 클 경우, i를 10으로 나눈다 + .map(i -> i % 10) + .sum();*/ + + // Stream API 이용하지 않은 버전 + int answer = 0; + + while(n > 0) { + answer += n % 10; + n /= 10; + } + return answer; + } + + public void call_solution(int n) { + int answer = solution(n); + + System.out.println(answer); + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\236\220\354\227\260\354\210\230_\353\222\244\354\247\221\354\226\264_\353\260\260\354\227\264\353\241\234_\353\247\214\353\223\244\352\270\260.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\236\220\354\227\260\354\210\230_\353\222\244\354\247\221\354\226\264_\353\260\260\354\227\264\353\241\234_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..14a32ed --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\236\220\354\227\260\354\210\230_\353\222\244\354\247\221\354\226\264_\353\260\260\354\227\264\353\241\234_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,53 @@ +package week1.김누리.programmers; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +/* + * PackageName : Week1.김누리.programmers + * FileName : 자연수_뒤집어_배열로_만들기 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + * 2025. 04. 26. 김누리 Stream API을 이용하지 않는 버전 작성 + */ + +public class 자연수_뒤집어_배열로_만들기 { + public int[] solution(long n) { + // Stream API 이용 버전 +/* return Arrays.stream(String.valueOf(n).split("")) + .mapToInt(Integer::parseInt) + .boxed() + .sorted(Comparator.reverseOrder()) + .mapToInt(Integer::intValue) + .toArray();*/ + + // Stream API를 이용하지 않은 버전 + String str = Long.toString(n); + String[] tmp = str.split(""); + int[] answer = new int[tmp.length]; + int idx = 0; + + for(int i = tmp.length-1; i >=0 ; i--) { + int target = Integer.parseInt(tmp[i]); + answer[idx++] = target; + } + + return answer; + } + + public void call_solution(long n) { + int[] answer = solution(n); + + for(int i : answer) { + System.out.println(i); + } + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\247\235\354\210\230\354\231\200_\355\231\200\354\210\230.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\247\235\354\210\230\354\231\200_\355\231\200\354\210\230.java" new file mode 100644 index 0000000..04fda59 --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\354\247\235\354\210\230\354\231\200_\355\231\200\354\210\230.java" @@ -0,0 +1,34 @@ +package week1.김누리.programmers; + +import java.util.stream.IntStream; +import java.util.stream.Stream; + +/* + * PackageName : Week1.김누리.programmers + * FileName : 짝수와_홀수 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + */ +public class 짝수와_홀수 { + public String solution(int num) { + // Stream API 이용 버전 +/* return Stream.of(num) + .map(n -> num%2 == 0 ? "Even": "Odd") + .findFirst() + .get();*/ + + // Stream API 이용하지 않은 버전 + return num%2 == 0 ? "Even" : "Odd"; + } + + public void call_solution(int num) { + String answer = solution(num); + + System.out.println(answer); + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\355\217\211\352\267\240_\352\265\254\355\225\230\352\270\260.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\355\217\211\352\267\240_\352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..caf4dc0 --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\355\217\211\352\267\240_\352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,43 @@ +package week1.김누리.programmers; + +import java.util.Arrays; +import java.util.stream.Stream; + +/* + * PackageName : Week1.김누리.programmers + * FileName : 평균_구하기 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + * 2025. 04. 27. 김누리 Stream API를 이용하지 않은 버전 작성 + * 2025. 04. 27. 김누리 Stream API를 이용하는 버전 작성 + */ + +public class 평균_구하기 { + public double solution(int[] arr) { + // Stream API 이용 버전 + // return Arrays.stream(arr).average().orElse(0); + + // Stream API 이용하지 않은 버전 + double answer = 0; + double size = arr.length; + + for(int i : arr) { + answer += i; + } + + answer /= size; + + return answer; + } + + public void call_solution(int[] arr) { + double answer = solution(arr); + + System.out.println(answer); + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\355\221\270\353\223\234_\355\214\214\354\235\264\355\212\270_\353\214\200\355\232\214.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\355\221\270\353\223\234_\355\214\214\354\235\264\355\212\270_\353\214\200\355\232\214.java" new file mode 100644 index 0000000..8ed2c56 --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\355\221\270\353\223\234_\355\214\214\354\235\264\355\212\270_\353\214\200\355\232\214.java" @@ -0,0 +1,57 @@ +package week1.김누리.programmers; + +/** + * PackageName : Week1.김누리.programmers + * FileName : 푸드_파이트_대회 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + */ + +/* +* 해석 +* [1,3,4,6]의 경우 +* [0] = 물 갯수는 1, 중앙값 +* [1] = 1번 음식 : 3개, 1개는 잉여니 제외 => 구성 101 +* [2] = 2번 음식 : 4개, 구성 => 1220221 +* [3] = 3번 음식 : 6개, 구성 => 1223330333221 +* +* answer = "1223330333221" +* +*/ + +public class 푸드_파이트_대회 { + public String solution(int[] food) { + String answer = ""; + StringBuilder left = new StringBuilder(); + + // A vs B중 일단 A 부분만 먼저 구성 + for(int i = 0; i < food.length; i++) { + + // food[0] 일때는 물, 1개만 있을 테니, i!=0일때만 돌린다고 가정 + if(i != 0 ) { + // food[i]의 값이 홀수이면 food[i] -1 + if(food[i]%2 == 1) food[i]--; + + // food[i]의 값이 짝수이면 StringBuilder 조합 시작 + for(int j = 0; j < food[i]/2; j++) { + left.append(i); + } + } + } + + answer = left.toString(); + + answer = answer + "0" + left.reverse().toString(); + + return answer; + } + + public void call_solution(int[] food) { + String answer = solution(food); + } +} diff --git "a/week1/\352\271\200\353\210\204\353\246\254/programmers/\355\225\230\354\203\244\353\223\234_\354\210\230.java" "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\355\225\230\354\203\244\353\223\234_\354\210\230.java" new file mode 100644 index 0000000..2c072e0 --- /dev/null +++ "b/week1/\352\271\200\353\210\204\353\246\254/programmers/\355\225\230\354\203\244\353\223\234_\354\210\230.java" @@ -0,0 +1,34 @@ +package week1.김누리.programmers; + +/** + * PackageName : Week1.김누리.programmers + * FileName : 하샤드_수 + * Author : 김누리 + * Date : 2025-04-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 04. 25. 김누리 Initial creation + */ +public class 하샤드_수 { + public boolean solution(int x) { + boolean answer = true; + int harshad = 0; + int tmp = x; + + while (tmp > 0) { + harshad += tmp % 10; // 자리수 더하기 + tmp /= 10; + } + + answer = x%harshad == 0 ? true : false; + + return answer; + } + + public void call_solution(int x) { + boolean answer = solution(x); + System.out.println(answer); + } +} diff --git "a/week1/\354\235\264\354\203\201\354\226\265/backjoon/\354\212\244\355\203\235_2.java" "b/week1/\354\235\264\354\203\201\354\226\265/backjoon/\354\212\244\355\203\235_2.java" new file mode 100644 index 0000000..4d78c23 --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/backjoon/\354\212\244\355\203\235_2.java" @@ -0,0 +1,48 @@ +package week1.이상억.backjoon; + +/** + * PackageName : week1.이상억.backjoon + * FileName : 스택_2 + * Author : sangeok + * Date : 2025. 5. 1. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 1. sangeok Initial creation + */ + +import java.util.*; + +public class Main { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + ArrayList stack = new ArrayList<>(); + + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < n; i++) { + int option = sc.nextInt(); + + if (option == 1) { + int x = sc.nextInt(); + stack.add(x);} + + else if (option == 2) { + if (stack.isEmpty()) {sb.append(-1).append('\n');} + else {sb.append(stack.remove(stack.size() - 1)).append('\n');} + } + + else if (option == 3) {sb.append(stack.size()).append('\n');} + + else if (option == 4) {sb.append(stack.isEmpty() ? 1 : 0).append('\n');} + + else if (option == 5) { + if (stack.isEmpty()) {sb.append(-1).append('\n');} + else {sb.append(stack.get(stack.size() - 1)).append('\n');} + } + } + System.out.print(sb); + } +} diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/x\353\247\214\355\201\274_\352\260\204\352\262\251\354\235\264_\354\236\210\353\212\224_n\352\260\234\354\235\230_\354\210\253\354\236\220.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/x\353\247\214\355\201\274_\352\260\204\352\262\251\354\235\264_\354\236\210\353\212\224_n\352\260\234\354\235\230_\354\210\253\354\236\220.java" new file mode 100644 index 0000000..a1bb2a6 --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/x\353\247\214\355\201\274_\352\260\204\352\262\251\354\235\264_\354\236\210\353\212\224_n\352\260\234\354\235\230_\354\210\253\354\236\220.java" @@ -0,0 +1,24 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : x만큼_간격이_있는_n개의_숫자 + * Author : sangeok + * Date : 2025. 4. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 29. sangeok Initial creation + */ + +class Solution { + public long[] solution(int x, int n) { + long[] answer = new long[n]; + + for(int i = 1; i<=n; i++){ + answer[i-1] = (long)x * i ; + } + return answer; + } +} \ No newline at end of file diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\202\230\353\250\270\354\247\200\352\260\200_1\354\235\264_\353\220\230\353\212\224_\354\210\230_\354\260\276\352\270\260.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\202\230\353\250\270\354\247\200\352\260\200_1\354\235\264_\353\220\230\353\212\224_\354\210\230_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..2c82305 --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\202\230\353\250\270\354\247\200\352\260\200_1\354\235\264_\353\220\230\353\212\224_\354\210\230_\354\260\276\352\270\260.java" @@ -0,0 +1,24 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : 나머지가_1이_되는_수_찾기 + * Author : sangeok + * Date : 2025. 4. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 29. sangeok Initial creation + */ +class Solution { + public int solution(int n) { + int i = 0; + while (true) { + i++; + if (n % i == 1) { + return i; + } + } + } +} diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\221\220_\354\240\225\354\210\230_\354\202\254\354\235\264\354\235\230_\355\225\251.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\221\220_\354\240\225\354\210\230_\354\202\254\354\235\264\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..62458a8 --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\221\220_\354\240\225\354\210\230_\354\202\254\354\235\264\354\235\230_\355\225\251.java" @@ -0,0 +1,29 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : 두_정수_사이의_합 + * Author : sangeok + * Date : 2025. 4. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 29. sangeok Initial creation + */ + +class Solution { + public long solution(int a, int b) { + long answer = 0; + int ch = 0; + if (a>b) { + ch = a; + a = b; + b = ch; + } + for(int i = a; i<=b; i++){ + answer += (long)i; + } + return answer; + } +} \ No newline at end of file diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\270\354\236\220\354\227\264_\353\202\264_p\354\231\200_y\354\235\230_\352\260\234\354\210\230.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\270\354\236\220\354\227\264_\353\202\264_p\354\231\200_y\354\235\230_\352\260\234\354\210\230.java" new file mode 100644 index 0000000..701678c --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\270\354\236\220\354\227\264_\353\202\264_p\354\231\200_y\354\235\230_\352\260\234\354\210\230.java" @@ -0,0 +1,27 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : 문자열_내_p와_y의_개수 + * Author : sangeok + * Date : 2025. 4. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 29. sangeok Initial creation + */ +class Solution { + boolean solution(String s) { + String a = s.toLowerCase(); + int p_count = 0; + int y_count = 0; + + for (char x : a.toCharArray()) { + p_count += (x == 'p') ? 1 : 0; + y_count += (x == 'y') ? 1 : 0; + } + + return p_count == y_count; + } +} diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\270\354\236\220\354\227\264\354\235\204_\354\240\225\354\210\230\353\241\234_\353\260\224\352\276\270\352\270\260.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\270\354\236\220\354\227\264\354\235\204_\354\240\225\354\210\230\353\241\234_\353\260\224\352\276\270\352\270\260.java" new file mode 100644 index 0000000..2dac15a --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\270\354\236\220\354\227\264\354\235\204_\354\240\225\354\210\230\353\241\234_\353\260\224\352\276\270\352\270\260.java" @@ -0,0 +1,20 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : 문자열을_정수로_바꾸기 + * Author : sangeok + * Date : 2025. 4. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 29. sangeok Initial creation + */ + +class Solution { + public int solution(String s) { + + return Integer.parseInt(s); + } +} \ No newline at end of file diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\225\275\354\210\230\354\235\230_\355\225\251.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\225\275\354\210\230\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..01a3294 --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\225\275\354\210\230\354\235\230_\355\225\251.java" @@ -0,0 +1,26 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : 약수의_합 + * Author : sangeok + * Date : 2025. 4. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 29. sangeok Initial creation + */ +import java.util.*; + + +public class Solution { + public int solution(int n) { + int answer = 0; + while(n>0){ + answer += n%10; + n /= 10; + } + return answer; + } +} \ No newline at end of file diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\236\220\353\246\277\354\210\230_\353\215\224\355\225\230\352\270\260.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\236\220\353\246\277\354\210\230_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..9206dd4 --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\236\220\353\246\277\354\210\230_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,23 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : 자릿수_더하기 + * Author : sangeok + * Date : 2025. 4. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 29. sangeok Initial creation + */ +class Solution { + public int solution(int n) { + int answer = 0; + + for(int i = 1; i<=n ;i++){ + answer += (n % i == 0) ? i : 0; + } + return answer; + } +} \ No newline at end of file diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\236\220\354\227\260\354\210\230_\353\222\244\354\247\221\354\226\264_\353\260\260\354\227\264\353\241\234_\353\247\214\353\223\244\352\270\260.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\236\220\354\227\260\354\210\230_\353\222\244\354\247\221\354\226\264_\353\260\260\354\227\264\353\241\234_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..54e4910 --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\236\220\354\227\260\354\210\230_\353\222\244\354\247\221\354\226\264_\353\260\260\354\227\264\353\241\234_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,33 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : 자연수_뒤접어_배열로_만들기 + * Author : sangeok + * Date : 2025. 4. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 29. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int[] solution(long n) { + ArrayList list = new ArrayList<>(); + + while (n > 0) { + list.add((int)(n % 10)); + n /= 10; + } + + int[] answer = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + answer[i] = list.get(i); + } + + return answer; + } +} diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\235\354\210\230\354\231\200_\355\231\200\354\210\230.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\235\354\210\230\354\231\200_\355\231\200\354\210\230.java" new file mode 100644 index 0000000..7c58bf8 --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\235\354\210\230\354\231\200_\355\231\200\354\210\230.java" @@ -0,0 +1,19 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : 짝수와_홀수 + * Author : sangeok + * Date : 2025. 4. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 29. sangeok Initial creation + */ + +class Solution { + public String solution(int num) { + return (num % 2 == 0) ? "Even" : "Odd"; + } +} \ No newline at end of file diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\355\217\211\352\267\240_\352\265\254\355\225\230\352\270\260.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\355\217\211\352\267\240_\352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..7757bee --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\355\217\211\352\267\240_\352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,23 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : 평균_구하기 + * Author : sangeok + * Date : 2025. 4. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 29. sangeok Initial creation + */ + +class Solution { + public double solution(int[] arr) { + double answer = 0; + for(int num : arr){ + answer+=num; + } + return answer/(arr.length); + } +} \ No newline at end of file diff --git "a/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\355\221\270\353\223\234_\355\214\214\354\235\264\355\212\270_\353\214\200\355\232\214.java" "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\355\221\270\353\223\234_\355\214\214\354\235\264\355\212\270_\353\214\200\355\232\214.java" new file mode 100644 index 0000000..4d914c7 --- /dev/null +++ "b/week1/\354\235\264\354\203\201\354\226\265/progarmmers/\355\221\270\353\223\234_\355\214\214\354\235\264\355\212\270_\353\214\200\355\232\214.java" @@ -0,0 +1,32 @@ +package week1.이상억.progarmmers; + +/** + * PackageName : week1.이상억.programmers + * FileName : 푸드_파이트_대회 + * Author : sangeok + * Date : 2025. 4. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 4. 30. sangeok Initial creation + */ + +class Solution { + public String solution(int[] food) { + + StringBuilder sb = new StringBuilder(); + + for(int i = 1 ; i= 0; h--) { + int okCount = 0; + int notCount = 0; + for(int i=0; i= h) okCount++; + else if(citations[i] < h) notCount++; + } + if(okCount >= h && notCount <= h) return h; + } + return 0; + } + } +} diff --git "a/week10/\352\260\225\354\204\261\354\232\261/programmers/\352\264\221\353\254\274_\354\272\220\352\270\260.java" "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\352\264\221\353\254\274_\354\272\220\352\270\260.java" new file mode 100644 index 0000000..9bfb590 --- /dev/null +++ "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\352\264\221\353\254\274_\354\272\220\352\270\260.java" @@ -0,0 +1,74 @@ +package week10.강성욱.programmers; + +import java.util.ArrayList; +import java.util.List; + +/** + * PackageName : week10.강성욱.programmers + * FileName : 광물_캐기 + * Author : Baekgwa + * Date : 2025-07-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-03 Baekgwa Initial creation + */ +public class 광물_캐기 { + // minerals 5덩어리씩 나누자. + // 돌곡괭이 기준으로, 점수 매겨서 우선순위 정하기 + // 흠 이건 아이디어 + 구현이 뭔가 너무 안되서 gpt 도움을 좀 받았습니다 + // 이제는 이해 됨 + + class Solution { + public int solution(int[] picks, String[] minerals) { + int n = (minerals.length + 4) / 5; + List chunks = new ArrayList<>(); + + // 5개씩 덩어리 분리 및 Mine 객체 생성 + for (int i = 0; i < n; i++) { + int d = 0, ir = 0, st = 0; + for (int j = i * 5; j < Math.min((i + 1) * 5, minerals.length); j++) { + if (minerals[j].equals("diamond")) d++; + else if (minerals[j].equals("iron")) ir++; + else st++; + } + chunks.add(new Mine(d, ir, st)); + } + + // 돌곡괭이 grade 기준 내림차순 정렬 + chunks.sort((a, b) -> b.grade - a.grade); + + int idx = 0; + int fatigue = 0; + for (int pickType = 0; pickType < 3; pickType++) { + for (int cnt = 0; cnt < picks[pickType]; cnt++) { + if (idx >= chunks.size()) break; + fatigue += chunks.get(idx++).fatigue(pickType); + } + } + + return fatigue; + } + + private static class Mine { + private final int diamondCnt; + private final int ironCnt; + private final int stoneCnt; + private final int grade; //돌곡괭이 기준 피로도 + + public Mine(int diamondCnt, int ironCnt, int stoneCnt) { + this.diamondCnt = diamondCnt; + this.ironCnt = ironCnt; + this.stoneCnt = stoneCnt; + this.grade = diamondCnt * 25 + ironCnt * 5 + stoneCnt; + } + + public int fatigue(int pickType) { + if(pickType == 0) return diamondCnt + ironCnt + stoneCnt; + else if(pickType == 1) return diamondCnt * 5 + ironCnt + stoneCnt; + else return diamondCnt * 25 + ironCnt * 5 + stoneCnt; + } + } + } +} diff --git "a/week10/\352\260\225\354\204\261\354\232\261/programmers/\353\213\244\355\212\270_\352\262\214\354\236\204.java" "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\353\213\244\355\212\270_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..3f0fb53 --- /dev/null +++ "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\353\213\244\355\212\270_\352\262\214\354\236\204.java" @@ -0,0 +1,61 @@ +package week10.강성욱.programmers; + +/** + * PackageName : week10.강성욱.programmers + * FileName : 다트_게임 + * Author : Baekgwa + * Date : 2025-07-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-02 Baekgwa Initial creation + */ +public class 다트_게임 { + class Solution { + public int solution(String dartResult) { + int[] results = new int[3]; + int idx = 0; + int round = 0; + + while (idx < dartResult.length()) { + int point = 0; + + // 10점 처리 + if (dartResult.charAt(idx) == '1' && + idx + 1 < dartResult.length() && dartResult.charAt(idx + 1) == '0') { + point = 10; + idx += 2; + } else { + point = dartResult.charAt(idx++) - '0'; + } + + // 보너스 처리 + char bonus = dartResult.charAt(idx++); + if (bonus == 'S') { + results[round] = (int) Math.pow(point, 1); + } else if (bonus == 'D') { + results[round] = (int) Math.pow(point, 2); + } else if (bonus == 'T') { + results[round] = (int) Math.pow(point, 3); + } + + if (idx < dartResult.length() && + (dartResult.charAt(idx) == '*' || dartResult.charAt(idx) == '#')) { + char option = dartResult.charAt(idx++); + if (option == '*') { + results[round] *= 2; + if (round > 0) { + results[round - 1] *= 2; + } + } else if (option == '#') { + results[round] *= -1; + } + } + round++; + } + + return results[0] + results[1] + results[2]; + } + } +} diff --git "a/week10/\352\260\225\354\204\261\354\232\261/programmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.java" "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.java" new file mode 100644 index 0000000..c3ac29c --- /dev/null +++ "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.java" @@ -0,0 +1,75 @@ +package week10.강성욱.programmers; + +import java.util.Arrays; +import java.util.PriorityQueue; + +/** + * PackageName : week10.강성욱.programmers + * FileName : 디스크_컨트롤러 + * Author : Baekgwa + * Date : 2025-07-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-02 Baekgwa Initial creation + */ +public class 디스크_컨트롤러 { + // 소요시간이 짧은 것, 작업 요청 시각이 빠른것, 작업의 번호가 작은 것이 우선순위 + // 입력 jobs 가 정렬? 되어있어야함 = 시점 0번 인덱스 순으로 오름차순 + // for문쓰니, 조건 분기가 너무 많음 + // 현재 시간 기준으로, 들어온 jobs 들을 모두 queue 에 넣어야됨. + // 다 넣고 난뒤, 비어있지 않다면 힙에서 꺼내 쓰고, 종료 시간 계산해서 현재 시간으로 맞추고 루프 돌리기 + + class Solution { + public int solution(int[][] jobs) { + int totalCount = jobs.length; + + Arrays.sort(jobs, (a, b) -> a[0] - b[0]); + PriorityQueue heap = new PriorityQueue<>(); + + int time = 0; + int index = 0; + int completeCount = 0; + int completeTimeSum = 0; + + while (completeCount < totalCount) { + // 1) 현재 시간까지 요청된 모든 작업 heap에 추가 + while (index < totalCount && jobs[index][0] <= time) { + heap.add(new Job(jobs[index][1], jobs[index][0], index)); + index++; + } + // 2) heap에 실행할 작업이 있다면 + if (!heap.isEmpty()) { + Job cur = heap.poll(); + time += cur.workingTime; + completeTimeSum += (time - cur.requestTime); + completeCount++; + } else { + // 3) 작업 없으면 시간 점프 + if (index < totalCount) time = jobs[index][0]; + } + } + return completeTimeSum / totalCount; + } + + private class Job implements Comparable { + private int workingTime; + private int requestTime; + private int jobNo; + + public Job(int workingTime, int requestTime, int jobNo) { + this.requestTime = requestTime; + this.workingTime = workingTime; + this.jobNo = jobNo; + } + + @Override + public int compareTo(Job o) { + if(this.workingTime != o.workingTime) return this.workingTime - o.workingTime; + if(this.requestTime != o.requestTime) return this.requestTime - o.requestTime; + return this.jobNo - o.jobNo; + } + } + } +} diff --git "a/week10/\352\260\225\354\204\261\354\232\261/programmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..f8e67e0 --- /dev/null +++ "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" @@ -0,0 +1,26 @@ +package week10.강성욱.programmers; + +/** + * PackageName : week10.강성욱.programmers + * FileName : 부족한_금액_계산하기 + * Author : Baekgwa + * Date : 2025-07-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-02 Baekgwa Initial creation + */ +public class 부족한_금액_계산하기 { + class Solution { + public long solution(int price, int money, int count) { + + long total = 0; + for(int i=1; i<=count; i++) { + total += (long) price * i; + } + + return Math.max(0, total - (long)money); + } + } +} diff --git "a/week10/\352\260\225\354\204\261\354\232\261/programmers/\354\213\240\352\263\240_\352\262\260\352\263\274_\353\260\233\352\270\260.java" "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\354\213\240\352\263\240_\352\262\260\352\263\274_\353\260\233\352\270\260.java" new file mode 100644 index 0000000..aa4221f --- /dev/null +++ "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\354\213\240\352\263\240_\352\262\260\352\263\274_\353\260\233\352\270\260.java" @@ -0,0 +1,66 @@ +package week10.강성욱.programmers; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * PackageName : week10.강성욱.programmers + * FileName : 신고_결과_받기 + * Author : Baekgwa + * Date : 2025-06-30 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-30 Baekgwa Initial creation + */ +public class 신고_결과_받기 { + + class Solution { + public int[] solution(String[] id_list, String[] report, int k) { + Map map = new HashMap<>(); //신고 횟수 저장용 + Map> historyMap = new HashMap<>(); //신고 이력 저장용 + Set banSet = new HashSet<>(); + + for(String re : report) { + String[] div = re.split(" "); + String reporter = div[0]; + String bad = div[1]; + + historyMap.computeIfAbsent(reporter, v -> new HashSet<>()).add(bad); + } + + // historyMap 으로, map 계산(id 당 신고당한 횟수) + for(Set histroySet : historyMap.values()) { + for(String bad : histroySet) { + map.put(bad, map.getOrDefault(bad, 0) + 1); + } + } + + // 정지된 id 구하기 + for(String id : map.keySet()) { + if(map.get(id) >= k) { + banSet.add(id); + } + } + + // 메일 횟수 구하기 + int[] result = new int[id_list.length]; + for(int i = 0; i < id_list.length; i++) { + String id = id_list[i]; + int cnt = 0; + if(historyMap.containsKey(id)) { + for(String bad : historyMap.get(id)) { + if(banSet.contains(bad)) { + cnt++; + } + } + } + result[i] = cnt; + } + return result; + } + } +} diff --git "a/week10/\352\260\225\354\204\261\354\232\261/programmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..485612b --- /dev/null +++ "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" @@ -0,0 +1,39 @@ +package week10.강성욱.programmers; + +/** + * PackageName : week10.강성욱.programmers + * FileName : 제일_작은_수_제거하기 + * Author : Baekgwa + * Date : 2025-07-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-02 Baekgwa Initial creation + */ +public class 제일_작은_수_제거하기 { + class Solution { + public int[] solution(int[] arr) { + + if (arr.length == 1) return new int[]{-1}; + + int min = Integer.MAX_VALUE; + int minIndex = Integer.MAX_VALUE; + + for(int i=0; i arr[i]) { + min = arr[i]; + minIndex = i; + } + } + + int index = 0; + int[] result = new int[arr.length-1]; + for(int i=0; i q = new LinkedList<>(); + List removeTargetList = new ArrayList<>(); //제거해야될 포인트. 이때 제거는 NOT_EXIST로 만드는 것 + + //먼저 removeTargetList 에는, 외부 값들은 모두 들어가면됨. + //단, 메모리 활용을 위해, target과 매칭되는 것만 넣기 + for(int x=0; x= maxX || ny < 0 || ny >= maxY) continue; + if(visited[ny][nx]) continue; + + if(map[ny][nx] == NOT_EXIST) { + q.add(new Point(nx, ny)); + visited[ny][nx] = true; + } else if(map[ny][nx] == target) { + removeTargetList.add(new Point(nx, ny)); + visited[ny][nx] = true; + } + } + } + + // removeTargetList 기반으로 map 다시 재구성해서 반환 + for(Point pt : removeTargetList) { + map[pt.getY()][pt.getX()] = NOT_EXIST; + } + + return map; + } + + + private static class Point { + private final int x; + private final int y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { return this.x; } + public int getY() { return this.y; } + } + } +} diff --git "a/week10/\352\260\225\354\204\261\354\232\261/programmers/\355\203\235\353\260\260\354\203\201\354\236\220.java" "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\355\203\235\353\260\260\354\203\201\354\236\220.java" new file mode 100644 index 0000000..84853b2 --- /dev/null +++ "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\355\203\235\353\260\260\354\203\201\354\236\220.java" @@ -0,0 +1,64 @@ +package week10.강성욱.programmers; + +import java.util.ArrayDeque; +import java.util.Deque; + +/** + * PackageName : week10.강성욱.programmers + * FileName : 택배상자 + * Author : Baekgwa + * Date : 2025-06-30 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-30 Baekgwa Initial creation + */ +public class 택배상자 { + // 일반 컨테이너는 들어오는 순서대로 실을 수 있고 + // 보조 컨테이너에 보관할때는 마지막에 넣은걸 빼서 쓸 수 잇음. + // 즉 보조 컨테이너는 스택의 구조? + // 아 order 대로 실어야 되구나. + //----- + // 중간에 보조 컨테이너에서 하나씩 꺼내서 2개이상 처리 가능한것도 생각해야됨. + + class Solution { + public int solution(int[] order) { + + int result = 0; + int nowOrderIndex = 0; //실어야하는 번호 확인용 index 변수; + Deque subContainer = new ArrayDeque<>(); //보조 컨테이너 + + for(int now=1; now<= order.length; now++) { + int nowTarget = order[nowOrderIndex]; + boolean flag = false; //실었는지 안실었는지, 만약 false 면 현재 now 값 보조 컨테이너에 넣어야됨. + + //현재 들어온 상자가 실을 수 있다면? + if(nowTarget == now) { + result++; + nowOrderIndex++; + flag = true; + } + + // 만약 서브 컨테이너에 마지막에 넣은게 실을 수 있다면? + // 반복해야됨 + while (!subContainer.isEmpty() && order[nowOrderIndex] == subContainer.peekFirst()) { + subContainer.removeFirst(); + result++; + nowOrderIndex++; + } + + // 넣을 수 없음. + if(!flag) subContainer.addFirst(now); + } + + while (!subContainer.isEmpty() && order[nowOrderIndex] == subContainer.peekFirst()) { + subContainer.removeFirst(); + result++; + nowOrderIndex++; + } + + return result; + } + } +} diff --git "a/week10/\352\260\225\354\204\261\354\232\261/programmers/\355\230\270\355\205\224_\353\214\200\354\213\244.java" "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\355\230\270\355\205\224_\353\214\200\354\213\244.java" new file mode 100644 index 0000000..3fced1c --- /dev/null +++ "b/week10/\352\260\225\354\204\261\354\232\261/programmers/\355\230\270\355\205\224_\353\214\200\354\213\244.java" @@ -0,0 +1,54 @@ +package week10.강성욱.programmers; + +import java.util.Arrays; +import java.util.PriorityQueue; + +/** + * PackageName : week10.강성욱.programmers + * FileName : 호텔_대실 + * Author : Baekgwa + * Date : 2025-07-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-03 Baekgwa Initial creation + */ +public class 호텔_대실 { + class Solution { + public int solution(String[][] book_time) { + int max = book_time.length; + int[][] times = new int[max][2]; + + for(int i=0; i { + return Integer.compare(a[0], b[0]); + }); + + PriorityQueue room = new PriorityQueue<>(); + + int nowTime = 0; + int cnt = 0; + + for(int[] time : times){ + + if(!room.isEmpty() && room.peek() <= time[0]) { + room.poll(); + } + + room.offer(time[1] + 10); + } + + return room.size(); + } + + private static int convertToMin(String time) { + String[] times = time.split(":"); + return (Integer.parseInt(times[0]) * 60) + Integer.parseInt(times[1]); + } + } +} diff --git "a/week10/\352\271\200\353\202\230\354\235\200/programmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" "b/week10/\352\271\200\353\202\230\354\235\200/programmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..b06dc88 --- /dev/null +++ "b/week10/\352\271\200\353\202\230\354\235\200/programmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" @@ -0,0 +1,25 @@ +package week10.김나은.programmers; + +public class 부족한_금액_계산하기 { + + class Solution { + + public long solution(int price, int money, int count) { + + int sum = 0; + + // price를 count 만큼 곱하며 더해준다. + for (int i = 1; i <= count; i++) { + sum += price * i; + } + + // 더한 금액과 money를 비교 + // 모자란 금액 계산 + if (sum > money) { + return sum - money; + } else { + return 0; + } + } + } +} \ No newline at end of file diff --git "a/week10/\352\271\200\353\202\230\354\235\200/programmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" "b/week10/\352\271\200\353\202\230\354\235\200/programmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..86b5e79 --- /dev/null +++ "b/week10/\352\271\200\353\202\230\354\235\200/programmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" @@ -0,0 +1,41 @@ +package week10.김나은.programmers; + +import java.util.ArrayList; + +public class 제일_작은_수_제거하기 { + + class Solution { + + public int[] solution(int[] arr) { + + // 빈 배열인 경우 -1 값을 채워서 return + if (arr.length == 1) { + return new int[]{-1}; + } + + // 가장 작은 수를 찾기 위해 배열 값들을 순회하며 비교 + int min = arr[0]; + for (int num : arr) { + if (num < min) { + min = num; + } + } + + // 가장 작은 값을 제거하기 위해, ArrayList로 새로운 배열 생성 + ArrayList list = new ArrayList<>(); + for (int num : arr) { + if (num != min) { + list.add(num); + } + } + + //ArrayList를 int 배열로 변환 + int[] answer = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + answer[i] = list.get(i); + } + + return answer; + } + } +} \ No newline at end of file diff --git "a/week10/\352\271\200\353\210\204\353\246\254/programmers/h_index.java" "b/week10/\352\271\200\353\210\204\353\246\254/programmers/h_index.java" new file mode 100644 index 0000000..674e408 --- /dev/null +++ "b/week10/\352\271\200\353\210\204\353\246\254/programmers/h_index.java" @@ -0,0 +1,55 @@ +package week10.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week10.김누리.programmers + * FileName : h_index + * Author : 김누리(NRKim) + * Date : 2025-07-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 02. 김누리(NRKim) Initial creation + */ + +/* + +citations.length = 발표한 논문 n 편 + +citations 정렬 + +h = 논문 수(배열의 길이) - 현재 인덱스(i) + +{0 1 3 5 6} + +idx == 0 > h = 5 - 0(5), citations[0](0) >> false ; +idx == 1 > h = 5 - 1(4), citations[1](1) >> false ; +idx == 2 > h = 5 - 2(3), citations[2](3) >> true (answer = 3) ; +idx == 3 > h = 5 - 3(2), citations[3](5) >> true (answer = 3) ; +idx == 4 > h = 5 - 4(1), citations[4](6) >> true (answer = 3) ; + + +*/ + +public class h_index { + public int solution(int[] citations) { + int answer = 0; + int n = citations.length; // 총 논문 수 + + // asec + Arrays.sort(citations); + + for(int i = 0; i < n; i++) { + + // h = 논문 수(배열의 길이) - 현재 인덱스(i) + int h = n - i; + + // 정답 계산 + answer = citations[i] >= h ? Math.max(answer, h) : answer; + } + + return answer; + } +} diff --git "a/week10/\352\271\200\353\210\204\353\246\254/programmers/\352\264\221\353\254\274_\354\272\220\352\270\260.java" "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\352\264\221\353\254\274_\354\272\220\352\270\260.java" new file mode 100644 index 0000000..dfd5c35 --- /dev/null +++ "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\352\264\221\353\254\274_\354\272\220\352\270\260.java" @@ -0,0 +1,78 @@ +package week10.김누리.programmers; + +/** + * PackageName : week10.김누리.programmers + * FileName : 광물_캐기 + * Author : 김누리(NRKim) + * Date : 2025-07-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 02. 김누리(NRKim) Initial creation + */ + +/* +picks = {1,2,3} + idx = 0 : 다이아 곡괭이 갯수 + idx = 1 : 철 곡괭이 갯수 + idx = 2 : 돌 곡괭이 갯수 + +minerals = ["diamond", "diamond", "diamond", "iron", "iron", "diamond", "iron", "stone"] + +idx = 0(다이아 곡괭이)로 다이아 캐면 피로도 +1/ +idx = 0(다이아 곡괭이)로 철 캐면 피로도 +1/ +idx = 0(다이아 곡괭이)로 돌 캐면 피로도 +1/ + +idx = 1(철 곡괭이)로 다이아 캐면 피로도 +5/ +idx = 1(철 곡괭이)로 철 캐면 피로도 +1/ +idx = 1(철 곡괭이)로 돌 캐면 피로도 +1/ + +idx = 2(돌 곡괭이)로 다이아 캐면 피로도 +25/ +idx = 2(돌 곡괭이)로 철 캐면 피로도 +5/ +idx = 2(돌 곡괭이)로 돌 캐면 피로도 +1/ + +dfs?? 이중 for문 ?? + + +*/ +public class 광물_캐기 { + int min = Integer.MAX_VALUE; + int[][] fatigue = { {1,1,1}, {5,1,1}, {25,5,1} }; // 곡괭이별 피로도 표 + + public int solution(int[] picks, String[] minerals) { + int answer = 0; + + dfs(picks, minerals, 0,0); + + return min; + } + + + private void dfs (int[] picks, String[] minerals, int idx, int total) { + // 현재 위치가 광물 길이 초과 및 각 곡괭이들의 갯수가 0인 경우 재귀 종료 + if( idx > minerals.length || picks[0] == 0 && picks[1] == 0 && picks[2] == 0 ) { + min = Math.min(min, total); + return; + } + + // 각 곡괭이 모두 시도 + for(int i = 0; i < 3; i++) { + if(picks[i] > 0) { + picks[i]--; // 곡괭이 소모 + int sum = 0; + + // 피로도 누적 + for (int j = idx; j < idx+5 && j < minerals.length; j++) { + int mineralIdx = 2; // 돌 + if (minerals[j].equals("diamond")) mineralIdx = 0; // 다이아몬드의 idx + else if (minerals[j].equals("iron")) mineralIdx = 1; // 쇠의 idx + sum += fatigue[i][mineralIdx]; // 피로도 합산 + } + + dfs(picks, minerals, idx+5, total + sum); + picks[i]++; // 곡괭이 복귀 + } + } + } +} diff --git "a/week10/\352\271\200\353\210\204\353\246\254/programmers/\353\213\244\355\212\270_\352\262\214\354\236\204.java" "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\353\213\244\355\212\270_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..e808696 --- /dev/null +++ "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\353\213\244\355\212\270_\352\262\214\354\236\204.java" @@ -0,0 +1,126 @@ +package week10.김누리.programmers; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * PackageName : week10.김누리.programmers + * FileName : 다트_게임 + * Author : 김누리(NRKim) + * Date : 2025-07-01 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 01. 김누리(NRKim) Initial creation + */ + +/* + +S = 1제곱 +D = 2제곱 +T = 3제곱 + +* ==> 직전에 얻은 점수2배 && 현재 얻은 점수 2배 +# ==> -화 + +*는 중첩 가능 +*#도 중첩 가능 + +1S + 2D* + 3T + +1S => 1^1*2 ==> 2 +2D* => 2^2*2 ==> 8 +3T => 3^3 ==> 27 + +total ==> 2 + 8 +27 ==> 37 + +1D2S#10S +1D + 2S# + 10S +1D => 1^2 ==> 1 +2S# => 2^1 * (-1) ==> -2 +10S => 10^1 ==> 10 + +total ==> 1 + (-2) + 10 ==>9 + +그러면 정규식을 이용해 보자. + +for(String s : arr) { + switch (s) { + case "*" : + // 로직 구현 + case "#" : + // 로직 구현 + case "S" : + // N^1 + case "D" : + // N^2 + case "T" : + // N^3 + default : + // 로직 구현 + } +} + +*/ +public class 다트_게임 { + public int solution(String dartResult) { + int answer = 0; + // 정규식 설정 + // 숫자, SDT(보너스), *#(옵션) + Pattern p = Pattern.compile("(10|\\d)([SDT])([*#]?)"); + Matcher m = p.matcher(dartResult); + + List parsed = new ArrayList<>(); + + // 설정한 정규식 탐색 + while(m.find()) { + String[] tmp = new String[3]; + tmp[0] = m.group(1); + tmp[1] = m.group(2); + tmp[2] = m.group(3); + + parsed.add(tmp); + } + + int[] scores = new int[3]; + + int idx = 0; + + for(String[] arr : parsed) { + int point = Integer.parseInt(arr[0]); // 점수 + String bonus = arr[1]; // 보너스 + String opt = arr[2]; // 옵션 + + switch(bonus) { + case "S" : + point = (int)Math.pow(point,1); + break; + case "D" : + point = (int)Math.pow(point,2); + break; + case "T" : + point = (int)Math.pow(point,3); + break; + } + + if (opt.equals("*")) { + point *= 2; + + if(idx > 0) scores[idx-1] *= 2; // 직전 점수도 2배 + } else if (opt.equals("#")) { + point *= -1; + } + + scores[idx++] = point; + } + + for(int s : scores) { + answer += s; + } + + return answer; + } +} diff --git "a/week10/\352\271\200\353\210\204\353\246\254/programmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.java" "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.java" new file mode 100644 index 0000000..c7147c3 --- /dev/null +++ "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.java" @@ -0,0 +1,77 @@ +package week10.김누리.programmers; + +import java.util.Arrays; +import java.util.PriorityQueue; + +/** + * PackageName : week10.김누리.programmers + * FileName : 디스크_컨트롤러 + * Author : 김누리(NRKim) + * Date : 2025-07-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 03. 김누리(NRKim) Initial creation + */ + +/* + +for(int[] job : jobs) { + job[0] => 시점 + job[1] => 시작 되는 작업 내용 +} + +jobs = +[ + [0, 3], + [1, 9], + [3, 5] +] + +PriorityQueue 채용 + +1. 0ms 시점에 3ms 가 소요 되는 작업 << queue에 입력 << 작업 진행 +2. 1ms 시점에 9ms 가 소요 되는 작업 << queue에 입력 +3. 2ms 시점에 1번 작업 진행 중. +4. 3ms 시점에 1번 작업 종료 << poll() << 2번 작업 진행 << 5ms가 소요되는 작업 << queue에 입력 + +~ 이하 생략 ~ + +job[1] 을 우선순위로 두고 빨리 끝나는 작업부터 처리 시키면 됨 + + +*/ + +public class 디스크_컨트롤러 { + public int solution(int[][] jobs) { + int answer = 0; + // 우선순위 큐. job[1]을 기준으로 정렬 예정 + PriorityQueue pq = new PriorityQueue<>((a,b) -> a[1] - b[1]); + + int time = 0, idx = 0, cnt = 0; + int len = jobs.length; // 총 요청 작업 갯수 + + // 시점 기준으로 정렬 + Arrays.sort(jobs, (a, b) -> a[0] - b[0]); + + while(cnt < len) { + // 현재 들어온 모든 작업 내용 큐에 추가 + while (idx < len && jobs[idx][0] <= time) { + pq.offer(jobs[idx++]); + } + + // 등록된 작업이 없다면? + if(pq.isEmpty()) { + time = jobs[idx][0]; + } else { + int[] job = pq.poll(); + time += job[1]; // 처리 시간 + answer += time - job[0]; // 처리시간 (ms) - 현재 시점 (ms) + cnt++; + } + } + + return answer / len; + } +} diff --git "a/week10/\352\271\200\353\210\204\353\246\254/programmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..da141c1 --- /dev/null +++ "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" @@ -0,0 +1,29 @@ +package week10.김누리.programmers; + +/** + * PackageName : week10.김누리.programmers + * FileName : 부족한_금액_계산하기 + * Author : 김누리(NRKim) + * Date : 2025-06-30 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 30. 김누리(NRKim) Initial creation + */ + +public class 부족한_금액_계산하기 { + public long solution(int price, int money, int count) { + long answer = 0; + long up = 0; // 인상요금 저장용 변수 + + // 반복하면서 인상 요금 완성 + for(int i = 0 ; i < count; i++) { + up += (price * (i+1)); + } + + answer = up - money < 0? 0 : up - money; + + return answer; + } +} diff --git "a/week10/\352\271\200\353\210\204\353\246\254/programmers/\354\213\240\352\263\240_\352\262\260\352\263\274_\353\260\233\352\270\260.java" "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\354\213\240\352\263\240_\352\262\260\352\263\274_\353\260\233\352\270\260.java" new file mode 100644 index 0000000..3dfce6c --- /dev/null +++ "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\354\213\240\352\263\240_\352\262\260\352\263\274_\353\260\233\352\270\260.java" @@ -0,0 +1,119 @@ +package week10.김누리.programmers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * PackageName : week10.김누리.programmers + * FileName : 신고_결과_받기 + * Author : 김누리(NRKim) + * Date : 2025-06-30 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 30. 김누리(NRKim) Initial creation + */ + +/* + + muzi frodo apeach neo +muzi - v X v +frodo x - x v +apeach v v - x +neo x x x - + +신고 카운트 +muzi 1 +frodo 2 +apeach 0 +neo 2 + +신고 카운트 2회 이상 >> frodo && neo >> 정지맨 +신고 카운트 1회 >> muzi >> 경고맨 + +그러면... 저거 report >> reports의 2차원 배열화 한 다음 진행 + +id_list를 키로 하고 + +reports[i][0] => 신고 한 사람 +reports[i][1] => 신고 당한 사람 + +Map map + +map = {"muzi" = 1,"frodo" = 2,"apeach" = 0,"neo" = 2} + +report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] + +report 배열을 훑으며 정지 유저 카운팅 ㄱㄱ + +*/ + +public class 신고_결과_받기 { + public int[] solution(String[] id_list, String[] report, int k) { + int[] answer = new int[id_list.length]; // 정답 반환용 배열 + Map map1 = new HashMap<>(); // 신고자 카운트 배열 + Map> map2 = new HashMap<>(); // 신고자 별 신고 내역 카운트 배열 + Set set = new HashSet<>(); // 중복 제거용 set + + // 신고자 배열에서 중복 제거 + for(String s : report) { + set.add(s); + } + + List list = new ArrayList<>(set); + String[][] reports = new String[list.size()][]; + + int idx = 0; + // report 배열 2차원 배열화 + // 중복 제거 해야함 예 : case 2 의 report의 경우 ["ryan con", "ryan con", "ryan con", "ryan con"]로 들어옴 + // 결국 조사 해야하는건 ryan con 이 두개 뿐임 + for(String s : list) { + String[] tmp = s.split(" "); + reports[idx++] = tmp; + } + + // 신고자별 신고 내용 카운팅 배열 초기화 + for(String s : id_list) { + map2.put(s,new HashSet<>()); + } + + // 신고 당한사람 카운팅 + for(String[] s : reports) { + String reporter = s[0]; + String target = s[1]; + + map2.get(reporter).add(target); + + map1.put(target, map1.getOrDefault(target,0)+1); + } + + // 정지 유저 리스트 + Set banned = new HashSet<>(); + for(String s : map1.keySet()) { + if(map1.get(s) >= k) { + banned.add(s); + } + } + + // id별 신고 메일 건수 카운팅 + for(int i = 0; i < id_list.length; i++) { + String id = id_list[i]; + int cnt = 0; + + for(String s : map2.get(id)) { + if(banned.contains(s)) { + cnt++; + } + } + + answer[i] = cnt; + } + + return answer; + } +} diff --git "a/week10/\352\271\200\353\210\204\353\246\254/programmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..db3ff50 --- /dev/null +++ "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" @@ -0,0 +1,42 @@ +package week10.김누리.programmers; + +/** + * PackageName : week10.김누리.programmers + * FileName : 제일_작은_수_제거하기 + * Author : 김누리(NRKim) + * Date : 2025-06-30 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 30. 김누리(NRKim) Initial creation + */ + +public class 제일_작은_수_제거하기 { + public int[] solution(int[] arr) { + + if(arr.length == 1) { + arr[0] = -1; + return arr; + } + + int minIdx = 0; + + for (int i = 0 ; i < arr.length; i++) { + if(arr[minIdx] > arr[i]) { + minIdx = i; + } + } + + int[] result = new int[arr.length - 1]; + int idx = 0; + + for (int i = 0 ; i < arr.length; i++) { + if(i != minIdx ) { + result[idx++] = arr[i]; + } + } + + return result; + } +} diff --git "a/week10/\352\271\200\353\210\204\353\246\254/programmers/\355\203\235\353\260\260\354\203\201\354\236\220.java" "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\355\203\235\353\260\260\354\203\201\354\236\220.java" new file mode 100644 index 0000000..82427f8 --- /dev/null +++ "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\355\203\235\353\260\260\354\203\201\354\236\220.java" @@ -0,0 +1,85 @@ +package week10.김누리.programmers; + +import java.util.LinkedList; +import java.util.Queue; +import java.util.Stack; + +/** + * PackageName : week10.김누리.programmers + * FileName : 택배상자 + * Author : 김누리(NRKim) + * Date : 2025-06-30 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 30. 김누리(NRKim) Initial creation + */ + +/* +택배상자는 1 ~ n 까지 + +한방향으로 진행 + +1 2 3 4 5 박스가 있다 가정 + +기사양반 요청사항 + +4 3 1 2 5 순으로 요청 + + +보조 컨테이너 (스택 ) +2 1 + +메인 컨테이너 + +5 + +메인 컨테이너 +4 3 + + +그러면 메인 컨테이너는 Queue로 보조 컨테이너는 Stack으로 진행 + +order[i] == queue.peek()? 판정 +no ? >> order[i] == stk.peek()? 판정 + +*/ + +public class 택배상자 { + public int solution(int[] order) { + int answer = 0; + int len = order.length;// 총 택배 상자 갯수 + Stack stk = new Stack<>(); // 보조 컨테이너 + Queue que = new LinkedList<>(); // 메인 컨테이너 + + // 메인 컨테이너에 적재 + for(int i = 1 ; i <= len; i++) { + que.offer(i); + } + + int idx = 0; + + // 보조 컨테이너 이동 + while ( idx < len ) { + if(!que.isEmpty() && que.peek() == order[idx]) { + // 메인컨테이너 맨 앞에 있는 상자 번호가 기사양반이 요청한 박스번호와 일치하는 경우 + answer++; + que.poll(); + idx++; + } else if (!stk.isEmpty() && stk.peek() == order[idx]) { + // 메인컨테이너의 맨 앞 상자는 일치하지 않지만, 보조컨테이너 맨 앞에 있는 상자 번호가 기사양반이 요청한 박스번호와 일치하는 경우 + answer++; + stk.pop(); + idx++; + } else if (!que.isEmpty()) { + // 메인컨테이너의 맨 앞, 보조컨테이너의 맨 앞에 있는 상자 번호 둘 다 불일치 + stk.push(que.poll()); + } else { + break; + } + } + + return answer; + } +} diff --git "a/week10/\352\271\200\353\210\204\353\246\254/programmers/\355\230\270\355\205\224_\353\214\200\354\213\244.java" "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\355\230\270\355\205\224_\353\214\200\354\213\244.java" new file mode 100644 index 0000000..6c77787 --- /dev/null +++ "b/week10/\352\271\200\353\210\204\353\246\254/programmers/\355\230\270\355\205\224_\353\214\200\354\213\244.java" @@ -0,0 +1,89 @@ +package week10.김누리.programmers; + +import java.util.Arrays; +import java.util.PriorityQueue; + +/** + * PackageName : week10.김누리.programmers + * FileName : 호텔_대실 + * Author : 김누리(NRKim) + * Date : 2025-07-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 03. 김누리(NRKim) Initial creation + */ + +/* +예약 시간 : + +[ + ["15:00", "17:00"], + ["16:40", "18:20"], + ["14:20", "15:20"], + ["14:10", "19:20"], + ["18:20", "21:20"] +] + +시작 시간 기준으로 오름차순을 한다면?? + +[ + ["14:10", "19:20"], + ["14:20", "15:20"], + ["15:00", "17:00"], + + ["16:40", "18:20"], + ["18:20", "21:20"] +] + +방 1 : ["14:10", "19:20"] : 입실 +방 2 : ["14:20", "15:20"] : 입실 +방 3 : ["15:00", "17:00"] : 입실 + +방 2 : ["14:20", "15:20"] : 퇴실 --> 10분 청소 +방 2 : ["16:40", "18:20"] : 입실 + +방 3 : ["15:00", "17:00"] : 퇴실 --> 10분 청소 +방 3 : ["18:20", "21:20"] : 입실 + +방 2 : ["16:40", "18:20"] : 퇴실 --> 10분 청소 +방 1 : ["14:10", "19:20"] : 퇴실 --> 10분 청소 + +그러면 방을 우선순위 큐로 진행. + +*/ + +public class 호텔_대실 { + public int solution(String[][] book_time) { + // 방 + PriorityQueue pq = new PriorityQueue<>(); + int answer = 0; + + // 예약 시간 asc + Arrays.sort(book_time,(a,b) -> a[0].compareTo(b[0])); + + for(String[] time : book_time) { + int start = toMinute(time[0]); // 시작 시간 (분화) + int end = toMinute(time[1]) + 10; // 종료 시간 + 청소시간 (분화) + + // 방이 비어 있거나, 이용 시간 종료하면 퇴실 + if(!pq.isEmpty() && pq.peek() <= start) { + pq.poll(); + } + + // 새로 입실 + pq.offer(end); + + // 현재 이용중인 방의 갯수 반환 + answer = pq.size(); + } + + return answer; + } + + private int toMinute(String time) { + String[] parts = time.split(":"); + return Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[1]); + } +} diff --git "a/week10/\354\235\264\354\203\201\354\226\265/progarmmers/H_Index.java" "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/H_Index.java" new file mode 100644 index 0000000..3341fff --- /dev/null +++ "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/H_Index.java" @@ -0,0 +1,32 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : H_Index + * Author : sangeok + * Date : 2025. 6. 27. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 27. sangeok Initial creation + */ + +// 문제 요구사항 : 논문 n 편중 h 번 이상 인용된 논문이 h 편 이상이고 나머지 논문이 h 번 이하 인용 되었다면 +// h 의 최댓 값이 h-index + +// 회고 : 단순히 정렬 후 가운데 값 뽑으면 되는 줄 알았다. 문제를 이해하는데 있어서 테스트 케이스가 좀 불친절했던 것 같다. +import java.util.*; + +class Solution { + public int solution(int[] citations) { + int answer = 0; + Arrays.sort(citations); + + int len = citations.length; + + for(int i = 0; i < len; i++){ + if( citations[i] >= len-i ) answer = answer > len-i ? answer : len-i ; // 인용 횟수와 h번 인용된 논문의 수 비교 + } + + return answer; + } +} \ No newline at end of file diff --git "a/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\352\264\221\353\254\274_\354\272\220\352\270\260.java" "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\352\264\221\353\254\274_\354\272\220\352\270\260.java" new file mode 100644 index 0000000..fc305fc --- /dev/null +++ "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\352\264\221\353\254\274_\354\272\220\352\270\260.java" @@ -0,0 +1,89 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 광물_캐기 + * Author : sangeok + * Date : 2025. 07. 02. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 02. sangeok Initial creation + */ + +// 다이아몬드 곡괭이 , 철 곡괭이, 돌 곡괭이 +// 한번에 5개를 캐야 함 +// picks [ dia , iron, stone] + +// 이거 일단 배열 5개씩 돌면서 광물 점수 계산 하면 될 듯 + +// 곡갱이 갯수 < minerals.length 를 고려 안하고 했다가 몇몇 테스트 케이스에서 실패했다. +// 그 후 계속 실패했는데 내가 point를 계산 할 때 임의로 5/3/1 을 했는데 이 부분에서 각 점수의 차가 크지 않아 point 정렬 할 때의 오류가 있었다. +// 위의 2가지 점 때문에 시간을 생각보다 꽤 많이 박았다. + +import java.util.*; + +class Solution { + public int solution(int[] picks, String[] minerals) { + int answer = 0; + int len = minerals.length; + + int totalPicks = picks[0] + picks[1] + picks[2]; // 사용 가능한 총 곡괭이 수 + int maxgroups = Math.min((len + 4) / 5, totalPicks); // 실제 채굴할 그룹 수 + int maxminerals = Math.min(len, totalPicks * 5); // 실제 채굴할 광물 수 + + int[] point = new int[maxgroups]; + + // 필요한 만큼의 광물까지만 점수 계산 + for (int i = 0; i < maxminerals; i++) { + if (minerals[i].equals("diamond")) point[i / 5] += 25; + else if (minerals[i].equals("iron")) point[i / 5] += 5; + else point[i / 5] += 1; + } + + // 채굴 그룹 생성 및 우선순위 정렬 + List groups = new ArrayList<>(); + for (int i = 0; i < maxgroups; i++) { + groups.add(new int[]{i, point[i]}); + } + groups.sort((a, b) -> b[1] - a[1]); // 난이도 내림차순 + + // 곡괭이 우선순위에 따라 그룹 채굴 + for (int[] g : groups) { + if (picks[0] > 0) { + answer += mine(minerals, g[0], 0); + picks[0]--; + } else if (picks[1] > 0) { + answer += mine(minerals, g[0], 1); + picks[1]--; + } else if (picks[2] > 0) { + answer += mine(minerals, g[0], 2); + picks[2]--; + } else break; + } + + return answer; + } + + // 피로도 계산 함수 + public int mine(String[] minerals, int groupIndex, int pickType) { + int fatigue = 0; + int start = groupIndex * 5; + int end = Math.min(minerals.length, start + 5); + + for (int i = start; i < end; i++) { + String m = minerals[i]; + + if (pickType == 0) { // 다이아 + fatigue += 1; + } else if (pickType == 1) { // 철 + if (m.equals("diamond")) fatigue += 5; + else fatigue += 1; + } else if (pickType == 2) { // 돌 + if (m.equals("diamond")) fatigue += 25; + else if (m.equals("iron")) fatigue += 5; + else fatigue += 1; + } + } + return fatigue; + } +} \ No newline at end of file diff --git "a/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\244\355\212\270_\352\262\214\354\236\204.java" "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\244\355\212\270_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..b12437f --- /dev/null +++ "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\244\355\212\270_\352\262\214\354\236\204.java" @@ -0,0 +1,71 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 다트_게임 + * Author : sangeok + * Date : 2025. 6. 28. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 28. sangeok Initial creation + */ + + +// 문제 요구사항 : S -> x^1 / D -> x^2 / T -> x^3 +// * -> a x b / # -> a - b +// * 당첨 시 해당 점수와 바로 전에 얻은 점수 2배 // # 당첨시 해당 점수 마이너스 +// * 첫번째 나올 시 해당 점수만 두배 + +// 회고 : 푸는데 문제 조건이 많아서 귀찮았다. 그리고 각 문자열을 split 해서 박은 다음 배열로 돌면 쉽겠다 했는데 +// 1 / 10 을 처리하는 과정 이 부분을 신경쓰지 못해 좀 헤맸었다. 그냥 바로바로 생각나는 코드를 마구잡이로 작성해서 코드가 지저분 했다. +// 다른 사람 풀이를 보니까 정규식으로 쉽게 나누던데 그 부분도 한번 공부해봐야겠다. + +import java.util.*; + +class Solution { + public int solution(String dartResult) { + int answer = 0; + List scores = new ArrayList<>(); + int point = 0; + + char[] arr = dartResult.toCharArray(); + + for (int i = 0; i < arr.length; i++) { + char c = arr[i]; + if (c == '1' && i + 1 < arr.length && arr[i + 1] == '0') { + point = 10; + i++; // '0'은 건너뜀 + } + else if (Character.isDigit(c)) { + point = c - '0'; + } + else if (c == 'S' || c == 'D' || c == 'T') { + point = dartoption(point, String.valueOf(c)); + scores.add(point); + } + else if (c == '*') { + int size = scores.size(); + if (size >= 1) scores.set(size - 1, scores.get(size - 1) * 2); + if (size >= 2) scores.set(size - 2, scores.get(size - 2) * 2); + } + else if (c == '#') { + int size = scores.size(); + scores.set(size - 1, scores.get(size - 1) * -1); + } + } + + for (int s : scores) answer += s; + return answer; + } + + public int dartoption(int point, String op) { + switch (op) { + case "S": break; + case "D": point = (int) Math.pow(point, 2); break; + case "T": point = (int) Math.pow(point, 3); break; + default: break; + } + return point; + } +} + diff --git "a/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.java" "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.java" new file mode 100644 index 0000000..4b012b0 --- /dev/null +++ "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.java" @@ -0,0 +1,75 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 디스크_컨트롤러 + * Author : sangeok + * Date : 2025. 07. 01. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 01. sangeok Initial creation + */ + + +// 작업 소요시간 짧은 것 >> 작업 요청시각 빠른 것 >> 작업의 번호가 작은 것 순 +// 한번 하면 마칠 때 까지 그거만 함 / 마치자 마자 바로 다른 작업 가능 +// jobs -> [ 작업이 요청되는 시점, 작업의 소요 시간] + + +// 다음 작업으로 넘어갈 때 연속적으로 넘어가는데 아니라 8에 끝나고 다음 작업이 14 이런식일 수도 있는데 반환시간 계산을 +// 연속적인 부분만 고려해서 그 부분에서 좀 헤맸었다. + +// 문제 자체는 그 요즘 정처기 공부하고 있는데 비선점 스케줄링 내용이여서 문제를 이해하는데 있어 어렵지 않았다. 3단계는 처음 풀어보는데 힙 알고리즘 관련이라 그런가 할만했다. +import java.util.*; +class Solution { + public int solution(int[][] jobs) { + int answer = 0; + + int[][] jobsWithIndex = new int[jobs.length][3]; + + for (int i = 0; i < jobs.length; i++) { + jobsWithIndex[i][0] = jobs[i][0]; + jobsWithIndex[i][1] = jobs[i][1]; + jobsWithIndex[i][2] = i; // 작업 번호 (인덱스) + } + + PriorityQueue pq = new PriorityQueue<>( + (a, b) -> { + if (a[1] != b[1]) return a[1] - b[1]; // 소요시간 짧은 순 + if (a[0] != b[0]) return a[0] - b[0]; // 요청시각 빠른 순 + return a[2] - b[2]; // 작업번호(작은 순) + } + ); + + int returntime = 0; // 반환시간 + int time = 0; // 현재시간 + int jobcount = 0; // 작업 개수 + int idx = 0; // 배열에서 아직 안넣은 작업 인덱스 + + Arrays.sort(jobsWithIndex, (a, b) -> a[0] - b[0]); // 요청 시각 기준 정렬 + + while (jobcount < jobs.length) { + // 현재 시간 이전에 요청된 작업들을 pq에 삽입 + while (idx < jobs.length && jobsWithIndex[idx][0] <= time) { + pq.offer(jobsWithIndex[idx]); + idx++; + } + + if (!pq.isEmpty()) { + int[] job = pq.poll(); + int requesttime = job[0]; + int duration = job[1]; + + int starttime = Math.max(time,requesttime); + time = starttime + duration; + returntime += (time - requesttime); // (종료시각 - 요청시각) + jobcount++; + } else { + time = jobsWithIndex[idx][0]; + continue; + } + } + + return returntime / jobs.length; + } +} \ No newline at end of file diff --git "a/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..fc6f075 --- /dev/null +++ "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\353\266\200\354\241\261\355\225\234_\352\270\210\354\225\241_\352\263\204\354\202\260\355\225\230\352\270\260.java" @@ -0,0 +1,23 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 부족한_금액_계산하기 + * Author : sangeok + * Date : 2025. 6. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 29. sangeok Initial creation + */ + +class Solution { + public long solution(int price, int money, int count) { + long answer = -1; + long sum = 0; + for(int i = 1; i <= count; i++){ + sum += price * i; + } + + return sum > money ? sum - money : 0; + } +} \ No newline at end of file diff --git "a/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\354\213\240\352\263\240_\352\262\260\352\263\274_\353\260\233\352\270\260.java" "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\354\213\240\352\263\240_\352\262\260\352\263\274_\353\260\233\352\270\260.java" new file mode 100644 index 0000000..3eee593 --- /dev/null +++ "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\354\213\240\352\263\240_\352\262\260\352\263\274_\353\260\233\352\270\260.java" @@ -0,0 +1,62 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 신고_결과_받기 + * Author : sangeok + * Date : 2025. 6. 27. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 27. sangeok Initial creation + */ + +// 문제 요구사항 : 각 유저는 한번에 한명의 유저 신고 -> 신고 횟수 제한 x , 동일한 유저 신고 횟수는 1회로 처리 +// k 번 이상 신고된 유저는 게시판 이용이 정지 -> 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 정지메일 발송 +// 정지시키면 신고한 사용자에게 메일 보냄 +// + +// 접근 방식 : (1) hashmap + hashset 조합 사용 + +// Hash 에 대한 공부를 하기 좋았던 문제였던 것 같다.. 근데 좀 코드가 길게 작성되어서 귀찮기는 했다. +import java.util.*; +class Solution { + public int[] solution(String[] id_list, String[] report, int k) { + int len = id_list.length; + int[] answer = new int[len]; + + Map> map = new HashMap<>(); // 누가 누구 신고 했는지 등록 + + for(String s : report) { + + String[] parts = s.split(" "); + String reporter = parts[0]; + String reported = parts[1]; + + if (!map.containsKey(reporter)) map.put(reporter, new HashSet<>()); + + map.get(reporter).add(reported); + } + + Map countmap = new HashMap<>(); // 신고당한 사람이 몇번 당했는지 세기 위해 + for(Set edlist : map.values()){ + for(String ed : edlist){ + countmap.put(ed, countmap.getOrDefault(ed,0) + 1); + } + } + + Map mailmap = new HashMap<>(); // 메일 보내기 위해 등록 + for(String er : map.keySet()){ + for(String ed : map.get(er)){ + if(countmap.getOrDefault(ed,0) >= k) { + mailmap.put(er,mailmap.getOrDefault(er,0)+1); + } + } + } + + for (int i = 0; i < id_list.length; i++) { + answer[i] = mailmap.getOrDefault(id_list[i], 0); + } + + return answer; + } +} \ No newline at end of file diff --git "a/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..e84c0b4 --- /dev/null +++ "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\234\354\235\274_\354\236\221\354\235\200_\354\210\230_\354\240\234\352\261\260\355\225\230\352\270\260.java" @@ -0,0 +1,36 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 제일_작은_수_제거하기 + * Author : sangeok + * Date : 2025. 6. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 29. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int[] solution(int[] arr) { + if(arr.length == 1) return new int[]{-1}; + int min = Integer.MAX_VALUE; + for(int a : arr){ + if( a < min) min = a; + } + + List list = new ArrayList<>(); + + for(int a : arr){ + if(a > min) list.add(a); + } + int[] answer = new int[list.size()]; + + for(int i = 0 ; i < list.size(); i++){ + answer[i] = list.get(i); + } + + return answer; + } +} \ No newline at end of file diff --git "a/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\200\352\262\214\354\260\250\354\231\200_\355\201\254\353\240\210\354\235\270.java" "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\200\352\262\214\354\260\250\354\231\200_\355\201\254\353\240\210\354\235\270.java" new file mode 100644 index 0000000..ea2db58 --- /dev/null +++ "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\200\352\262\214\354\260\250\354\231\200_\355\201\254\353\240\210\354\235\270.java" @@ -0,0 +1,112 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 지게차와_크레인 + * Author : sangeok + * Date : 2025. 07. 03. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 03. sangeok Initial creation + */ + + + +// 세로 : n 가로 : m +// 출고 요청이 들어오면 지게차로 창고에서 접근 가능한 해당 종류의 컨테이너를 모두 꺼냄 +// 접근 가능한 컨테이너란 4면 중 적어도 1면이 창고 외부와 연결된 컨테이너 => 가장자리에 있는 걸 의미 ? +// 모든 요청을 순서대로 완료 한 후 남은 컨테이너 수를 return +// 두번 반복되는 애들은 크레인 한번은 지게차 + + +// 접근 방식 : request 에서 두글자면 그냥 전체 순회해서 제거 +// 한글자면 bfs 로 외곽에서 접근 가능한 친구들만 제거 +import java.util.*; + +class Solution { + public int solution(String[] storageInput, String[] requests) { + int n = storageInput.length; + int m = storageInput[0].length(); + + // 1) 패딩해서 테두리에 빈 칸('.')을 둘러줌 + int N = n + 2, M = m + 2; + char[][] storage = new char[N][M]; + for (int i = 0; i < N; i++) { + Arrays.fill(storage[i], '.'); + } + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + storage[i + 1][j + 1] = storageInput[i].charAt(j); + } + } + + // 상하좌우 + int[] dx = {0, 0, -1, 1}; + int[] dy = {-1, 1, 0, 0}; + + for (String req : requests) { + char target = req.charAt(0); + + if (req.length() == 2) { + // 크레인: 모든 target 전부 제거 + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= m; j++) { + if (storage[i][j] == target) { + storage[i][j] = '.'; + } + } + } + } else { + // 지게차: 빈 칸 BFS → 인접 컨테이너만 제거 + boolean[][] visitedEmpty = new boolean[N][M]; + Queue q = new LinkedList<>(); + // (0,0)부터 패딩된 빈 칸 출발 + q.offer(new int[]{0, 0}); + visitedEmpty[0][0] = true; + while (!q.isEmpty()) { + int[] cur = q.poll(); + int x = cur[0], y = cur[1]; + for (int d = 0; d < 4; d++) { + int nx = x + dx[d], ny = y + dy[d]; + if (nx < 0 || nx >= N || ny < 0 || ny >= M) continue; + if (visitedEmpty[nx][ny]) continue; + if (storage[nx][ny] == '.') { + visitedEmpty[nx][ny] = true; + q.offer(new int[]{nx, ny}); + } + } + } + + // 접근 가능한 target 모아두기 + List toRemove = new ArrayList<>(); + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= m; j++) { + if (storage[i][j] != target) continue; + // 네 방향에 하나라도 visitedEmpty == true 면 접근 가능 + for (int d = 0; d < 4; d++) { + int ni = i + dx[d], nj = j + dy[d]; + if (visitedEmpty[ni][nj]) { + toRemove.add(new int[]{i, j}); + break; + } + } + } + } + // 한꺼번에 제거 + for (int[] p : toRemove) { + storage[p[0]][p[1]] = '.'; + } + } + } + + // 남은 컨테이너 세기 + int answer = 0; + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= m; j++) { + if (storage[i][j] != '.') answer++; + } + } + return answer; + } +} + diff --git "a/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\355\203\235\353\260\260\354\203\201\354\236\220.java" "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\355\203\235\353\260\260\354\203\201\354\236\220.java" new file mode 100644 index 0000000..76deead --- /dev/null +++ "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\355\203\235\353\260\260\354\203\201\354\236\220.java" @@ -0,0 +1,54 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 택배상자 + * Author : sangeok + * Date : 2025. 07. 02. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 02. sangeok Initial creation + */ + + +// 벨트에 놓인 순서대로 상자를 내릴 수 있음 ( 1번 ) +// 택배 기사님이 알려준 순서에 맞게 실어야 함 +// 벨트의 맨 앞에 놓인 상자가 현재 트럭에 실어야 하는 순서가 아니라면 잠시 다른 곳에 보관 +// 보조 컨테이너 벨트는 앞뒤로 이동가능 하지만 맨 앞의 택배만 뺄 수 있음 +// 보조 컨테이너 사용해도 더 이상 싣지 못한다면 싣지 않음 + +// 택배 기사님이 원하는 상자 순서 order 일 때 몇개의 상자를 실을 수 있는지 +// 1번부터 ~ n 번까지 + +// 보조 컨테이너 설명을 볼 때 stack 써서 풀면 되겠구나 생각 함 +import java.util.*; + +class Solution { + public int solution(int[] order) { + int answer = 0; + Stack stack = new Stack<>(); // 보조 컨테이너 + + int boxnumber = 1; // 컨테이너에서 오는 박스 번호 + int i = 0; + + while(boxnumber <= order.length){ + if(order[i] == boxnumber){ + i++; + boxnumber ++; + }else if (!stack.isEmpty() && stack.peek() == order[i]) { + stack.pop(); + i++; + } else{ + stack.push(boxnumber); + boxnumber++; + } + } + + while(!stack.isEmpty() && stack.peek() == order[i]) { + stack.pop(); + i++; + } + + return i; + } +} \ No newline at end of file diff --git "a/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\355\230\270\355\205\224_\353\214\200\354\213\244.java" "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\355\230\270\355\205\224_\353\214\200\354\213\244.java" new file mode 100644 index 0000000..388ff5d --- /dev/null +++ "b/week10/\354\235\264\354\203\201\354\226\265/progarmmers/\355\230\270\355\205\224_\353\214\200\354\213\244.java" @@ -0,0 +1,51 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 호텔_대실 + * Author : sangeok + * Date : 2025. 07. 03. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 03. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public int solution(String[][] book_time) { + List events = new ArrayList<>(); + + for (String[] reservation : book_time) { + int start = htm(reservation[0]); + int end = htm(reservation[1]) + 10; // 청소시간 포함 + events.add(new int[]{start, 1}); // 시작 이벤트: +1 + events.add(new int[]{end, -1}); // 종료 이벤트: -1 + } + + // 시간 오름차순 정렬, 같은 시간일 경우 종료(-1)를 먼저 처리 + events.sort((a, b) -> { + if (a[0] == b[0]) return a[1] - b[1]; // -1 먼저 처리 + return a[0] - b[0]; + }); + + int rooms = 0; + int maxrooms = 0; + + for (int[] event : events) { + rooms += event[1]; // +1이면 방 하나 더 씀, -1이면 하나 반환 + maxrooms = Math.max(maxrooms, rooms); // 최대 몇 개까지 동시에 필요했는지 저장 + } + + return maxrooms; // 최댓값이 필요한 방 개수 + } + + // "HH:MM" → 분 단위로 변환 + public int htm(String time) { + String[] parts = time.split(":"); + int hour = Integer.parseInt(parts[0]); + int minute = Integer.parseInt(parts[1]); + return hour * 60 + minute; + } +} diff --git "a/week11/\352\260\234\354\235\270\354\240\225\353\263\264_\354\210\230\354\247\221_\354\234\240\355\232\250\352\270\260\352\260\204.java" "b/week11/\352\260\234\354\235\270\354\240\225\353\263\264_\354\210\230\354\247\221_\354\234\240\355\232\250\352\270\260\352\260\204.java" new file mode 100644 index 0000000..f76f0f5 --- /dev/null +++ "b/week11/\352\260\234\354\235\270\354\240\225\353\263\264_\354\210\230\354\247\221_\354\234\240\355\232\250\352\270\260\352\260\204.java" @@ -0,0 +1,57 @@ +package week11; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week11 + * FileName : 개인정보_수집_유효기간 + * Author : Baekgwa + * Date : 2025-07-07 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-07 Baekgwa Initial creation + */ +public class 개인정보_수집_유효기간 { + //가장 중요한거. 모든 달은 28일까지로 통일. 굳구ㅡㄷ굳 + + class Solution { + public int[] solution(String today, String[] terms, String[] privacies) { + + Map termMap = new HashMap<>(); //key = 약관 종류, value = 유효기간 日 + int todayDay = convertDay(today); + + for(String term : terms) { + String[] termArray = term.split(" "); + String type = termArray[0]; + int days = Integer.parseInt(termArray[1]) * 28; + + termMap.put(type, days); + } + + List resultList = new ArrayList<>(); + for(int i = 0; i < privacies.length; i++) { + String[] priArray = privacies[i].split(" "); + int endDay = convertDay(priArray[0]) + termMap.get(priArray[1]); + if(endDay <= todayDay) { + resultList.add(i + 1); + } + } + + int[] result = new int[resultList.size()]; + for(int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(i); + } + return result; + } + + private int convertDay(String day) { + String[] dayArray = day.split("\\."); + return Integer.parseInt(dayArray[0]) * 12 * 28 + Integer.parseInt(dayArray[1]) * 28 + Integer.parseInt(dayArray[2]); + } + } +} diff --git "a/week11/\352\271\200\353\202\230\354\235\200/programmers/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" "b/week11/\352\271\200\353\202\230\354\235\200/programmers/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..38e0aac --- /dev/null +++ "b/week11/\352\271\200\353\202\230\354\235\200/programmers/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,38 @@ +package week11.김나은.programmers; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class 두_개_뽑아서_더하기 { + + class Solution { + + public int[] solution(int[] numbers) { + + // 중복되는 값이 들어가면 안되므로, Set 사용 + Set set = new HashSet<>(); + + // 서로 다른 인덱스의 두 수를 더함 + for (int i = 0; i < numbers.length; i++) { + for (int j = i + 1; j < numbers.length; j++) { + int sum = numbers[i] + numbers[j]; + set.add(sum); + } + } + + // 정렬을 위해 set을 배열로 변환 + int[] answer = new int[set.size()]; + int idx = 0; + + // 배열에 set 값을 하나씩 넣어줌 + for (int num : set) { + answer[idx++] = num; + } + + Arrays.sort(answer); + + return answer; + } + } +} diff --git "a/week11/\352\271\200\353\210\204\353\246\254/programmers/\352\260\234\354\235\270\354\240\225\353\263\264_\354\210\230\354\247\221_\354\234\240\355\232\250\352\270\260\352\260\204.java" "b/week11/\352\271\200\353\210\204\353\246\254/programmers/\352\260\234\354\235\270\354\240\225\353\263\264_\354\210\230\354\247\221_\354\234\240\355\232\250\352\270\260\352\260\204.java" new file mode 100644 index 0000000..bddaaf4 --- /dev/null +++ "b/week11/\352\271\200\353\210\204\353\246\254/programmers/\352\260\234\354\235\270\354\240\225\353\263\264_\354\210\230\354\247\221_\354\234\240\355\232\250\352\270\260\352\260\204.java" @@ -0,0 +1,79 @@ +package week11.김누리.programmers; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week11.김누리.programmers + * FileName : 개인정보_수집_유효기간 + * Author : 김누리(NRKim) + * Date : 2025-07-06 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 06. 김누리(NRKim) Initial creation + */ + +/* + +start = privaceis[0] +end = privacies[0] + map.getOrDefault(terms[0],0); + +start <= today < end ==> 아직 보관 + +today >= end ==> 삭제 대상 + +*/ + + +public class 개인정보_수집_유효기간 { + public int[] solution(String today, String[] terms, String[] privacies) { + Map map = new HashMap<>(); + + // terms map화 + for(String t : terms) { + String[] tmp = t.split(" "); + map.put(tmp[0],tmp[1]); + } + + int day = 1; + List list = new ArrayList<>(); + + + // 유효기간 체크 + for(String p : privacies) { + String[] tmp = p.split(" "); + int t = Integer.parseInt(map.getOrDefault(tmp[1],"0")); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + + LocalDate start = LocalDate.parse(tmp[0],formatter); + LocalDate target = LocalDate.parse(today,formatter); + LocalDate end = start.plusMonths(t); + + + if (target.isAfter(end) || target.isEqual(end)) { + list.add(day); + } + + day++; + } + + int[] answer = new int[list.size()]; + + int idx = 0; + + // 정답 구성 + for(int i : list) { + answer[idx++] = i; + } + + + return answer; + } +} diff --git "a/week11/\352\271\200\353\210\204\353\246\254/programmers/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" "b/week11/\352\271\200\353\210\204\353\246\254/programmers/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..2a6171e --- /dev/null +++ "b/week11/\352\271\200\353\210\204\353\246\254/programmers/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,50 @@ +package week11.김누리.programmers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * PackageName : week11.김누리.programmers + * FileName : 두_개_뽑아서_더하기 + * Author : 김누리(NRKim) + * Date : 2025-07-06 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 06. 김누리(NRKim) Initial creation + */ + +public class 두_개_뽑아서_더하기 { + public int[] solution(int[] numbers) { + // 계산용 임시 해시 + Set set = new HashSet<>(); + + // 두 수를 뽑아, 더한 값을 해쉬에 저장 + for(int i = 0; i < numbers.length-1; i++) { + int a = numbers[i]; + + for(int j = i+1; j < numbers.length; j++) { + int b = numbers[j]; + set.add(a+b); + } + } + + // Set >> List화 + List list = new ArrayList<>(set); + int[] answer = new int [list.size()]; + int idx = 0; + + for(int i : list) { + answer[idx++] = i; + } + + // 오름차순 + Arrays.sort(answer); + + return answer; + } +} diff --git "a/week11/\352\271\200\353\210\204\353\246\254/programmers/\353\271\204\353\260\200_\354\275\224\353\223\234_\355\225\264\353\217\205.java" "b/week11/\352\271\200\353\210\204\353\246\254/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..376fafc --- /dev/null +++ "b/week11/\352\271\200\353\210\204\353\246\254/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 week11.김누리.programmers; + +import java.util.ArrayList; +import java.util.List; + +/** + * PackageName : week11.김누리.programmers + * FileName : 비밀_코드_해독 + * Author : 김누리(NRKim) + * Date : 2025-07-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 08. 김누리(NRKim) Initial creation + */ + +/* + +q = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [3, 7, 8, 9, 10], [2, 5, 7, 9, 10], [3, 4, 5, 6, 7]] +ans = [2, 3, 4, 3, 3] + +※ ans[i] => q[i] 번째 배열에서 택할수 있는 암호 갯수 + +y = q.length +x = q[0].length +pick = ans[i] + +조합 알고리즘(dfs)를 이용해서 코드별 선택하여 조합 + +조합을 통해 만들어진 코드 비교 + +*/ +public class 비밀_코드_해독 { + public int solution(int n, int[][] q, int[] ans) { + int answer = 0; + List candidates = new ArrayList<>(); + + // Step 1. 1~n 중 5개 조합 생성 + combineAll(candidates, new ArrayList<>(), 1, n, 5); + + // Step 2. 각 후보군 검증 + for(int[] cand : candidates) { + boolean isValid = true; + + // 조합된 코드를 순회하며 검증 + for(int i = 0; i < q.length; i++) { + int count = 0; + + for(int num : q[i]) { + for(int c : cand) { + if(num == c) count++; + } + } + + if(count != ans[i]) { + isValid = false; + break; + } + } + + if(isValid) answer++; + } + + return answer; + } + + // 1~n 중 5개 조합 생성 함수 + public void combineAll(List list, List comb, int start, int n, int pick) { + if(comb.size() == pick) { + list.add(comb.stream().mapToInt(i -> i).toArray()); + return; + } + + for(int i = start; i <= n; i++) { + comb.add(i); + combineAll(list, comb, i+1, n, pick); + comb.remove(comb.size()-1); + } + } +} diff --git "a/week11/\352\271\200\353\210\204\353\246\254/programmers/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.java" "b/week11/\352\271\200\353\210\204\353\246\254/programmers/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.java" new file mode 100644 index 0000000..4e5bcfa --- /dev/null +++ "b/week11/\352\271\200\353\210\204\353\246\254/programmers/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.java" @@ -0,0 +1,88 @@ +package week11.김누리.programmers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week11.김누리.programmers + * FileName : 오픈채팅방 + * Author : 김누리(NRKim) + * Date : 2025-07-07 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 07. 김누리(NRKim) Initial creation + */ + +/* + +record = + [ + "Enter uid1234 Muzi", + "Enter uid4567 Prodo", + "Leave uid1234", + "Enter uid1234 Prodo", + "Change uid4567 Ryan" + ] + + 동작 / uuid/ nick + + swithc (동작) : + case "Enter" : + nickname = map.getOrDefault(uuid,""); + System.out.println(nickname + "님이 들어왔습니다."); + + case "Leave" : + nickname = map.getOrDefault(uuid,""); + System.out.println(nickname + "님이 나갔습니다."); + + +*/ + +public class 오픈채팅방 { + public String[] solution(String[] record) { + + // map {uuid = nickname} + Map map = new HashMap<>(); + List list = new ArrayList<>(); + + for(String r : record) { + // 시스템 기록 분해 + String[] tmp = r.split(" "); + + String act = tmp[0]; // 동작 + String uuid = tmp[1]; // 고유 ID + + if(tmp.length > 2) { + // act가 Leave인 경우 act, uuid 만 들어오기 때문에, Leave 이외의 경우에만 uuid, nickname 셋팅 해야함 + String nickname = tmp[2]; // 닉네임 + map.put(uuid,nickname); + } + + switch(act) { + case "Enter" : + // uuid 별 닉네임 셋팅 + list.add(new String[] {uuid,"님이 들어왔습니다."}); + break; + + case "Leave" : + list.add(new String[] {uuid,"님이 나갔습니다."}); + break; + } + } + + + int idx = 0; + String[] answer = new String[list.size()]; + + for(String[] s : list) { + String nickname = map.get(s[0]); + answer[idx++] = nickname + s[1]; + } + + return answer; + } +} diff --git "a/week11/\352\271\200\353\210\204\353\246\254/programmers/\354\243\274\354\260\250_\354\232\224\352\270\210_\352\263\204\354\202\260.java" "b/week11/\352\271\200\353\210\204\353\246\254/programmers/\354\243\274\354\260\250_\354\232\224\352\270\210_\352\263\204\354\202\260.java" new file mode 100644 index 0000000..024f217 --- /dev/null +++ "b/week11/\352\271\200\353\210\204\353\246\254/programmers/\354\243\274\354\260\250_\354\232\224\352\270\210_\352\263\204\354\202\260.java" @@ -0,0 +1,149 @@ +package week11.김누리.programmers; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * PackageName : week11.김누리.programmers + * FileName : 주차_요금_계산 + * Author : 김누리(NRKim) + * Date : 2025-07-06 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 06. 김누리(NRKim) Initial creation + */ + +/* +feeds = [180, 5000, 10, 600] // 요금 +recoreds = [ + "05:34 5961 IN", + "06:00 0000 IN", + "06:34 0000 OUT", + "07:59 5961 OUT", + "07:59 0148 IN", + "18:59 0000 IN", + "19:09 0148 OUT", + "22:59 5961 IN", + "23:00 5961 OUT" +] + +MapinMap = new HashMap<>(); // 입차 map +MaptotalMap = new HashMap<>(); // 통합 map +Set car = new HashSet<>(); // IO 차량 관리용 셋 + +// 자동차 별, 누적 주차 시간 계산 +// 예 : 5961 >> (1차) 05:34에 들어와서 07:59에 나감. 2시간 25분 (145분) // (2차) 22:59에 들어와서 23:00에 나감. 1분 >> 총 146분 머무름. +for(String s : records) { + String[]tmp = s.split(" "); + String carNum = tmp[1]; + String time = toMin(tmp[0]); + String io = tmp[2]; + + car.add(carNum); // 차량별 중복 제거 + + switch(io) { + case "IN" : + inMap.put(carNum, time); // 입차 + break; + + case "OUT" : + int inTime = inMap.get(carNum); + int totalTime = time - inTime; + totalMap.put(carNum, totalMap.getOrDefault(carNum,0) + totalTime); // 차량별 누적 주차시간 계산 + inMap.remove(carNum); + break; + } +} + +// 출차 기록 없는 차량 시간 계산 +for (String s : inMap.keySet()) { + int inTime = inMap.get(s); + int totalTime = toMin("23:59") - inTime; + + totalMap.put(s, totalMap.getOrDefault(s,0) + totalTime); // 차량별 누적 주차시간 계산 +} + +// 요금표에 맞춰 차량 별 요금 게산. +// int timeCal = map.get(차량번호) - feeds[0] < 0 ? 0 : map.get(차량번호) - feeds[0]; +// int feed = 기본요금 (fees[1]) + timeCal x 단위 요금(feeds[3]); +// answer[i] = feed; + +*/ + +public class 주차_요금_계산 { + public int[] solution(int[] fees, String[] records) { + Map inMap = new HashMap<>(); // 입차 기록용 + Map totalMap = new HashMap<>(); // 최종 누적 시간 기록용 + + // 차량 입출력 기록 + for(String r : records) { + String[] tmp = r.split(" "); + String carNum = tmp[1]; // 차량 번호 + int time = toMin(tmp[0]); // 입출력 시간 + String io = tmp[2]; // 입출력 구분 + + switch(io) { + case "IN" : + inMap.put(carNum,time); // 입차 기록 + break; + + case "OUT" : + int inTime = inMap.get(carNum); // 입차 시간 + int totalTime = time - inTime; // 주차 시간 + totalMap.put(carNum,totalMap.getOrDefault(carNum,0) + totalTime); + inMap.remove(carNum); + } + } + + // 출차 안된 차량의 출차 처리 + for(String s : inMap.keySet()) { + int inTime = inMap.get(s); // 출차 안된 차량의 입차 시간 + int totalTime = toMin("23:59") - inTime; // 출차 안된 차량의 출차시간을 23:59로 fix + + totalMap.put(s,totalMap.getOrDefault(s,0) + totalTime); + } + + List list = new LinkedList<>(totalMap.keySet()); + Collections.sort(list); + + int[] answer = new int[list.size()]; + int idx = 0; + + // 요금 계산. + for(String carNum : list) { + int basicTime = fees[0]; // 기본 시간 (분) + int basicFee = fees[1]; // 기본 요금 (원) + int unitTime = fees[2]; // 단위 시간 (분) + int unitFee = fees[3]; // 단위 요금 (원) + int targetTime = totalMap.getOrDefault(carNum,0); // 대상 차량의 총 주차 시간 + + int calTime = targetTime - basicTime; + + if( calTime <= 0 ) { + // 기본시간 동안 주차 + answer[idx++] = basicFee; + } else { + // 기본시간을 초과한 경우 + int calFee = basicFee + (int)(Math.ceil((double)calTime / unitTime) * unitFee); + answer[idx++] = calFee; + } + } + + return answer; + } + + + // hh:mm >> minute 화 + private int toMin(String time) { + String[] times = time.split(":"); + + return Integer.parseInt(times[0]) * 60 + Integer.parseInt(times[1]); + } +} diff --git "a/week11/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" "b/week11/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..a9aa10a --- /dev/null +++ "b/week11/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,40 @@ +package week11; + +import java.util.HashSet; +import java.util.Set; + +/** + * PackageName : week11 + * FileName : 두_개_뽑아서_더하기 + * Author : Baekgwa + * Date : 2025-07-07 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-07 Baekgwa Initial creation + */ +public class 두_개_뽑아서_더하기 { + // 반복? + // (인덱스) 0, 0+1, 0+1+2 .... => 100번 반복 + // 그게 총 100번 반복 (크게 잡아서) + // 그럼, 100^2 + // 할만하네 + // 중복은 Set으로 해결 + + class Solution { + public int[] solution(int[] numbers) { + + Set resultSet = new HashSet<>(); + + for(int i=0; i m).toArray(); + } + } +} diff --git "a/week11/\353\271\204\353\260\200_\354\275\224\353\223\234_\355\225\264\353\217\205.java" "b/week11/\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..7d8fef8 --- /dev/null +++ "b/week11/\353\271\204\353\260\200_\354\275\224\353\223\234_\355\225\264\353\217\205.java" @@ -0,0 +1,63 @@ +package week11; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * PackageName : week11 + * FileName : 비밀_코드_해독 + * Author : Baekgwa + * Date : 2025-07-07 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-07 Baekgwa Initial creation + */ +public class 비밀_코드_해독 { + // 조합 생성해서, contains 로 비교? + // 최대 30 개중, 5개를 뽑는 조합 + + class Solution { + public int solution(int n, int[][] q, int[] ans) { + List combList = makeCombinations(n, 5, 1, 0, new int[5]); + + int answer = 0; + for (int[] comb : combList) { + if (isValid(comb, q, ans)) answer++; + } + return answer; + } + + private List makeCombinations(int n, int k, int start, int depth, int[] picked) { + List result = new ArrayList<>(); + if (depth == k) { + result.add(Arrays.copyOf(picked, k)); + return result; + } + int remain = k - depth; + for (int i = start; i <= n - remain + 1; i++) { + picked[depth] = i; + result.addAll(makeCombinations(n, k, i + 1, depth + 1, picked)); + } + return result; + } + + private boolean isValid(int[] picked, int[][] q, int[] ans) { + Set pickedSet = new HashSet<>(); + for (int x : picked) pickedSet.add(x); + + for (int i = 0; i < q.length; i++) { + int count = 0; + for (int y : q[i]) { + if (pickedSet.contains(y)) count++; + } + if (count != ans[i]) return false; + } + return true; + } + } +} diff --git "a/week11/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.java" "b/week11/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.java" new file mode 100644 index 0000000..d7ef4a1 --- /dev/null +++ "b/week11/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.java" @@ -0,0 +1,68 @@ +package week11; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week11 + * FileName : 오픈채팅방 + * Author : Baekgwa + * Date : 2025-07-07 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-07 Baekgwa Initial creation + */ +public class 오픈채팅방 { + //enter 명령어와, leave 명령어는 따로 뽑아둘것. + //uid 기준으로, 닉네임을 마지막까지 최신화 해둘것 + + class Solution { + public String[] solution(String[] record) { + + List chatLogList = new ArrayList<>(); + Map nicknameMap = new HashMap<>(); // key : uid, name : 닉네임 (최신화 할 것) + + for(String rec : record) { + String[] orderArray = rec.split(" "); + String order = orderArray[0]; + String uid = orderArray[1]; + + // 새로 들어오거나, 이름을 바꾸었다면, nicknameMap 에 최신화 진행 + if(order.equals("Enter") || order.equals("Change")) { + nicknameMap.put(uid, orderArray[2]); + } + + //들어오거나, 나가는 사람 채팅 로그용 저장. + if(order.equals("Enter") || order.equals("Leave")) { + chatLogList.add(new ChatLog(order, uid)); + } + } + + String[] result = new String[chatLogList.size()]; + + for(int i=0; i termsmap = new HashMap<>(); + List validprivacies = new ArrayList<>(); + + for (String k : terms) { + String[] a = k.split(" "); + String alphabet = a[0]; + int month = Integer.parseInt(a[1]); + termsmap.put(alphabet, month); + } + + int[] todayarr = parsedate(today); + + for (int i = 0; i < privacies.length; i++) { + String[] parts = privacies[i].split(" "); + int[] startdate = parsedate(parts[0]); // 수집일 + String type = parts[1]; // 약관 종류 + + int term = termsmap.get(type); + int[] expiredate = addmonths(startdate, term); + + if (isexpired(expiredate, todayarr)) { + validprivacies.add(i + 1); // 1-based index + } + } + + int[] answer = new int[validprivacies.size()]; + for (int i = 0; i < answer.length; i++) { + answer[i] = validprivacies.get(i); + } + return answer; + } + + // 날짜 쪼개기 + public int[] parsedate(String date) { + String[] parts = date.split("\\."); + return new int[]{ + Integer.parseInt(parts[0]), + Integer.parseInt(parts[1]), + Integer.parseInt(parts[2]) + }; + } + + public int[] addmonths(int[] date, int monthstoadd) { + int year = date[0]; + int month = date[1] + monthstoadd; + int day = date[2]; + + year += (month - 1) / 12; + month = (month - 1) % 12 + 1; + + return new int[]{year, month, day}; + } + + // 만료일 <= 오늘인지 비교 + public boolean isexpired(int[] expire, int[] today) { + for (int i = 0; i < 3; i++) { + if (expire[i] < today[i]) return true; + if (expire[i] > today[i]) return false; + } + return true; // 동일 날짜일 경우도 만료 처리 + } +} diff --git "a/week11/\354\235\264\354\203\201\354\226\265/progarmmers/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" "b/week11/\354\235\264\354\203\201\354\226\265/progarmmers/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..fa8c6c0 --- /dev/null +++ "b/week11/\354\235\264\354\203\201\354\226\265/progarmmers/\353\221\220_\352\260\234_\353\275\221\354\225\204\354\204\234_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,36 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 두_개_뽑아서_더하기 + * Author : sangeok + * Date : 2025. 07. 04. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 04. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public int[] solution(int[] numbers) { + int len = numbers.length; + Set set = new HashSet<>(); + + int number = 0; + for(int i = 0; i 2 +// 6,7,8,9,10 => 3 +// 3,7,8,9,10 => 4 +// 2,5,7,9,10 => 3 +// 3,4,5,6,7 => 3 + +// 완전탐색 문제 ? - > dfs 로 시도 + +// 배열 뽑아서 hashset에 등록 ? 그 후 계속 q 배열을 돌려서 시스템응답이 일치하는지 ? 체크해서 맞는 수의 조합만 추가 ? + +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/week11/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.java" "b/week11/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.java" new file mode 100644 index 0000000..1dbb6fc --- /dev/null +++ "b/week11/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.java" @@ -0,0 +1,62 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 오픈채팅방 + * Author : sangeok + * Date : 2025. 07. 05. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 05. sangeok Initial creation + */ + + +// Enter [유저 아이디] [닉네임] +// 첫 단어 Enter, Leave, Change + +// Hashmap으로 아이디, 닉네임 등록 + +// 문제를 대충 읽어 추후 변경 되면 다 기존의 message 가 다 변경 되는지 모르고 풀었다. +// 문제를 읽고서 바로 든 생각은 hashmap을 둬서 id 와 nickname을 관리하면 되겠다 라는 생각이 바로 들었다. +// 이 문제도 조건을 잘 파악하고 지문만 읽어도 어떠한 방향으로 풀어야할지 감이 잘 와서 할만했던 것 같다. +import java.util.*; + +class Solution { + public String[] solution(String[] record) { + Map usermap = new HashMap<>(); + List list = new ArrayList<>(); + + for (String s : record) { + String[] parts = s.split(" "); + String command = parts[0]; + String id = parts[1]; + + if (command.equals("Enter")) { + String nickname = parts[2]; + usermap.put(id, nickname); + list.add(new String[]{id, "Enter"}); + } else if (command.equals("Leave")) { + list.add(new String[]{id, "Leave"}); + } else if (command.equals("Change")) { + String nickname = parts[2]; + usermap.put(id, nickname); + } + } + + String[] answer = new String[list.size()]; + int idx = 0; + for (String[] action : list) { + String id = action[0]; + String command = action[1]; + String nickname = usermap.get(id); + + if (command.equals("Enter")) { + answer[idx++] = nickname + "님이 들어왔습니다."; + } else if (command.equals("Leave")) { + answer[idx++] = nickname + "님이 나갔습니다."; + } + } + + return answer; + } +} diff --git "a/week11/\354\235\264\354\203\201\354\226\265/progarmmers/\354\243\274\354\260\250_\354\232\224\352\270\210_\352\263\204\354\202\260.java" "b/week11/\354\235\264\354\203\201\354\226\265/progarmmers/\354\243\274\354\260\250_\354\232\224\352\270\210_\352\263\204\354\202\260.java" new file mode 100644 index 0000000..b56514d --- /dev/null +++ "b/week11/\354\235\264\354\203\201\354\226\265/progarmmers/\354\243\274\354\260\250_\354\232\224\352\270\210_\352\263\204\354\202\260.java" @@ -0,0 +1,88 @@ +/** + * PackageName : week10.이상억.progarmmers; + * FileName : 주차_요금_계산 + * Author : sangeok + * Date : 2025. 07. 05. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 05. sangeok Initial creation + */ + + +// Hash 를 써서 주차 입출차를 등록하는게 무난해 보임 + +// fees[0] : 기본 시간 / fees[1] : 기본 요금 / fees[2] : 단위 시간 / fees[3] : 단위 요금 +// 출차 안한 시간은 23:59 처리 +// 요금 계산 시 올림 + +// 접근 방식 : hash 사용해서 풀면 괜찮을듯 + +// 문제 조건들만 잘 파악하고 hash 로 풀면 할만했던 것 같음 +// 10주차에 내가 호텔 대신 풀듯이 입차 때 + 1 / 출차 때 -1 을 두고 입출차를 관리해도 나쁘지 않을 것 같음 + + +import java.util.*; + +class Solution { + public int[] solution(int[] fees, String[] records) { + Map carin = new HashMap<>(); // 차량 입차 시간 + Map carout = new HashMap<>(); // 차량 누적 주차 시간 + + for (String s : records) { + String[] parts = s.split(" "); + String time = parts[0]; + String car = parts[1]; + String action = parts[2]; + + int minute = htm(time); // 시간 → 분 + + if (action.equals("IN")) { + carin.put(car, minute); + } else { + int intime = carin.remove(car); + int duration = minute - intime; + carout.put(car, carout.getOrDefault(car, 0) + duration); + } + } + + // 출차 안 한 차량은 23:59 기준으로 처리 + for (String car : carin.keySet()) { + int inTime = carin.get(car); + int duration = htm("23:59") - inTime; + carout.put(car, carout.getOrDefault(car, 0) + duration); + } + + // 차량 번호 오름차순 정렬 + List cars = new ArrayList<>(carout.keySet()); + Collections.sort(cars); + + int[] answer = new int[cars.size()]; + int idx = 0; + + for (String car : cars) { + int time = carout.get(car); + int fee = 0; + + if (time <= fees[0]) { + fee = fees[1]; + } else { + int extra = time - fees[0]; + int unit = (extra + fees[2] - 1) / fees[2]; + fee = fees[1] + unit * fees[3]; + } + + answer[idx++] = fee; + } + + return answer; + } + + public int htm(String time) { + String[] parts = time.split(":"); + int hour = Integer.parseInt(parts[0]); + int minute = Integer.parseInt(parts[1]); + return hour * 60 + minute; + } +} diff --git "a/week11/\354\243\274\354\260\250_\354\232\224\352\270\210_\352\263\204\354\202\260.java" "b/week11/\354\243\274\354\260\250_\354\232\224\352\270\210_\352\263\204\354\202\260.java" new file mode 100644 index 0000000..91a9e27 --- /dev/null +++ "b/week11/\354\243\274\354\260\250_\354\232\224\352\270\210_\352\263\204\354\202\260.java" @@ -0,0 +1,80 @@ +package week11; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week11 + * FileName : 주차_요금_계산 + * Author : Baekgwa + * Date : 2025-07-07 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-07 Baekgwa Initial creation + */ +public class 주차_요금_계산 { + //하루를 넘어가는 시간이 들어올 수 있나? -> 경우 없음, 모두 당일 처리 + //result 의 출력 순서는? -> 차량 번호가 작은 순서대로 + //같은 번호가 동시에 들어오고 (막 in, in), 없는 차량이 출차하고 그런경우는 없지만, 같은 차량이 여러번 들어왔다 나가는 경우는 있음. + //출차 내역이 없다면, 23:59 기준으로 출차로 계산 할 것. + + class Solution { + public int[] solution(int[] fees, String[] records) { + Map inHistoryMap = new HashMap<>(); //key : 자동차 번호, value : 들어온 시간 (분으로 처리) + Map totalTimeMap = new HashMap<>(); //key : 자동차 번호, value : 주차된 시간. (default 계산 안되어있음) + + for(String record : records) { + String[] recordArray = record.split(" "); + int timeMin = convertToMin(recordArray[0]); + String carNumber = recordArray[1]; + String order = recordArray[2]; + + if(order.equals("IN")) { + inHistoryMap.put(carNumber, timeMin); + } else if(order.equals("OUT")) { + int inTime = inHistoryMap.remove(carNumber); + int parkedTime = timeMin - inTime; + totalTimeMap.put(carNumber, totalTimeMap.getOrDefault(carNumber, 0) + parkedTime); + } else { + throw new IllegalArgumentException("허용되지 않는 내역 입니다."); + } + } + + // 출차 정보가 없는 것, 23:59 기준으로 출차 요금 계산 필요. + int endTime = convertToMin("23:59"); + for (Map.Entry entry : inHistoryMap.entrySet()) { + String carNumber = entry.getKey(); + int inTime = entry.getValue(); + int parked = endTime - inTime; + totalTimeMap.put(carNumber, totalTimeMap.getOrDefault(carNumber, 0) + parked); + } + + return totalTimeMap.keySet().stream() + .sorted() + .mapToInt(carNumber -> calFee(totalTimeMap.get(carNumber), fees)) + .toArray(); + } + + private int convertToMin(String time) { + String[] timeArray = time.split(":"); + return Integer.parseInt(timeArray[0]) * 60 + Integer.parseInt(timeArray[1]); + } + + private int calFee(int totalMin, int[] fees) { + int defaultMin = fees[0]; + int defaultFee = fees[1]; + int unitMin = fees[2]; //단위 시간(분) + int unitFee = fees[3]; //단위 요금(원) + + if (totalMin <= defaultMin) { + return defaultFee; + } else { + int extraTime = totalMin - defaultMin; + int extraUnit = (int) Math.ceil((double) extraTime / unitMin); + return defaultFee + extraUnit * unitFee; + } + } + } +} diff --git "a/week12/\352\260\225\354\204\261\354\232\261/programmers/\353\213\244\353\246\254\353\245\274_\354\247\200\353\202\230\353\212\224_\355\212\270\353\237\255.java" "b/week12/\352\260\225\354\204\261\354\232\261/programmers/\353\213\244\353\246\254\353\245\274_\354\247\200\353\202\230\353\212\224_\355\212\270\353\237\255.java" new file mode 100644 index 0000000..11ecebc --- /dev/null +++ "b/week12/\352\260\225\354\204\261\354\232\261/programmers/\353\213\244\353\246\254\353\245\274_\354\247\200\353\202\230\353\212\224_\355\212\270\353\237\255.java" @@ -0,0 +1,49 @@ +package week12.강성욱.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week12.강성욱.programmers + * FileName : 다리를_지나는_트럭 + * Author : Baekgwa + * Date : 2025-07-21 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-21 Baekgwa Initial creation + */ +public class 다리를_지나는_트럭 { + + class Solution { + public int solution(int bridge_length, int weight, int[] truck_weights) { + Queue bridge = new LinkedList<>(); + int time = 0; + int currentWeight = 0; + int idx = 0; + + for(int i = 0; i < bridge_length; i++) { + bridge.offer(0); + } + + while(idx < truck_weights.length) { + time++; + + currentWeight -= bridge.poll(); + + if(currentWeight + truck_weights[idx] <= weight) { + bridge.offer(truck_weights[idx]); + currentWeight += truck_weights[idx]; + idx++; + } else { + bridge.offer(0); + } + } + + time += bridge_length; + + return time; + } + } +} diff --git "a/week12/\352\260\225\354\204\261\354\232\261/programmers/\354\210\230\353\240\210_\354\233\200\354\247\201\354\235\264\352\270\260.java" "b/week12/\352\260\225\354\204\261\354\232\261/programmers/\354\210\230\353\240\210_\354\233\200\354\247\201\354\235\264\352\270\260.java" new file mode 100644 index 0000000..623a7da --- /dev/null +++ "b/week12/\352\260\225\354\204\261\354\232\261/programmers/\354\210\230\353\240\210_\354\233\200\354\247\201\354\235\264\352\270\260.java" @@ -0,0 +1,147 @@ +package week12.강성욱.programmers; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + * PackageName : week12.강성욱.programmers + * FileName : 수레_움직이기 + * Author : Baekgwa + * Date : 2025-07-21 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-21 Baekgwa Initial creation + */ +public class 수레_움직이기 { + //bfs 로 찾으면 될듯? + class Solution { + private static final int[] dx = {-1, 0, 1, 0}; + private static final int[] dy = {0, -1, 0, 1}; + + public int solution(int[][] maze) { + int maxY = maze.length; + int maxX = maze[0].length; + //x, y 저장 + int redStartX = 0, redStartY = 0; + int redEndX = 0, redEndY = 0; + int blueStartX = 0, blueStartY = 0; + int blueEndX = 0, blueEndY = 0; + + // 색상별 시작/도착 지점 확인 + for(int y=0; y q = new LinkedList<>(); + boolean[][] redVisited = new boolean[maxY][maxX]; + boolean[][] blueVisited = new boolean[maxY][maxX]; + redVisited[redStartY][redStartX] = true; + blueVisited[blueStartY][blueStartX] = true; + q.offer(new State(redStartX, redStartY, blueStartX, blueStartY, redVisited, blueVisited, 0)); + + //bfs 를 진행하는데, 한 스텝에 두개의 아이템을 움직여야함. + //현재 state 에서 움직일 수 있는 모든곳 확인해서 넣기. + //2중 배열로, red 가 움직일수 있는 한곳 * blue가 움직일 수 있는 곳 으로 여러개 생성 + //중간에, 만약 도착 위치에 있다면, 움직이지 않기 + while(!q.isEmpty()) { + State now = q.poll(); + + if(now.nowRedPosX == redEndX && now.nowRedPosY == redEndY && + now.nowBluePosX == blueEndX && now.nowBluePosY == blueEndY) { + return now.depth; + } + + for (int r = 0; r < 4; r++) { + int redNextX = now.nowRedPosX, redNextY = now.nowRedPosY; + boolean redMoved = false; + + if (!(now.nowRedPosX == redEndX && now.nowRedPosY == redEndY)) { + redNextX += dx[r]; + redNextY += dy[r]; + // 범위/벽/방문 칸 체크 + if (!isValidMove(redNextX, redNextY, maxX, maxY, maze) || now.redVisited[redNextY][redNextX]) continue; + redMoved = true; + } + for (int b = 0; b < 4; b++) { + int blueNextX = now.nowBluePosX, blueNextY = now.nowBluePosY; + boolean blueMoved = false; + + if (!(now.nowBluePosX == blueEndX && now.nowBluePosY == blueEndY)) { + blueNextX += dx[b]; + blueNextY += dy[b]; + // 범위/벽/방문 칸 체크 + if (!isValidMove(blueNextX, blueNextY, maxX, maxY, maze) || now.blueVisited[blueNextY][blueNextX]) continue; + blueMoved = true; + } + if (redNextX == blueNextX && redNextY == blueNextY) continue; + if (redNextX == now.nowBluePosX && redNextY == now.nowBluePosY && + blueNextX == now.nowRedPosX && blueNextY == now.nowRedPosY) continue; + + boolean[][] newRedVisited = deepCopy(now.redVisited); + boolean[][] newBlueVisited = deepCopy(now.blueVisited); + + if (redMoved && !(redNextX == redEndX && redNextY == redEndY)) { + newRedVisited[redNextY][redNextX] = true; + } + if (blueMoved && !(blueNextX == blueEndX && blueNextY == blueEndY)) { + newBlueVisited[blueNextY][blueNextX] = true; + } + + State nextState = new State(redNextX, redNextY, blueNextX, blueNextY, newRedVisited, newBlueVisited, now.depth + 1); + q.offer(nextState); + } + } + } + + return 0; + } + + private boolean isValidMove(int x, int y, int maxX, int maxY, int[][] maze) { + return x >= 0 && x < maxX && y >= 0 && y < maxY && maze[y][x] != 5; + } + + private boolean[][] deepCopy(boolean[][] original) { + boolean[][] copy = new boolean[original.length][]; + for(int i = 0; i < original.length; i++) { + copy[i] = original[i].clone(); + } + return copy; + } + + private static class State { + private int nowRedPosX, nowRedPosY; + private int nowBluePosX, nowBluePosY; + private boolean[][] redVisited; + private boolean[][] blueVisited; + private int depth; + + public State(int nowRedPosX, int nowRedPosY, int nowBluePosX, int nowBluePosY, boolean[][] redVisited, boolean[][] blueVisited, int depth) { + this.nowRedPosX = nowRedPosX; + this.nowRedPosY = nowRedPosY; + this.nowBluePosX = nowBluePosX; + this.nowBluePosY = nowBluePosY; + this.redVisited = redVisited; + this.blueVisited = blueVisited; + this.depth = depth; + } + } + } +} diff --git "a/week12/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" "b/week12/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" new file mode 100644 index 0000000..5a12521 --- /dev/null +++ "b/week12/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" @@ -0,0 +1,29 @@ +package week12.강성욱.programmers; + +/** + * PackageName : week12.강성욱.programmers + * FileName : 숫자_문자열과_영단어 + * Author : Baekgwa + * Date : 2025-07-21 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-21 Baekgwa Initial creation + */ +public class 숫자_문자열과_영단어 { + class Solution { + public int solution(String s) { + int answer = 0; + String temp; + String[] english = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; + + for(int i=0; i<10; i++){ + s = s.replace(english[i], Integer.toString(i)); + } + answer = Integer.parseInt(s); + + return answer; + } + } +} diff --git "a/week12/\352\260\225\354\204\261\354\232\261/programmers/\354\227\254\355\226\211\352\262\275\353\241\234.java" "b/week12/\352\260\225\354\204\261\354\232\261/programmers/\354\227\254\355\226\211\352\262\275\353\241\234.java" new file mode 100644 index 0000000..6677a6b --- /dev/null +++ "b/week12/\352\260\225\354\204\261\354\232\261/programmers/\354\227\254\355\226\211\352\262\275\353\241\234.java" @@ -0,0 +1,126 @@ +package week12.강성욱.programmers; + +import java.util.ArrayList; +import java.util.List; + +/** + * PackageName : week12.강성욱.programmers + * FileName : 여행경로 + * Author : Baekgwa + * Date : 2025-07-21 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-21 Baekgwa Initial creation + */ +public class 여행경로 { + // import java.util.*; + + // class Solution { + // public String[] solution(String[][] tickets) { + // String nowCity = "ICN"; + + // Map> map = new HashMap<>(); + // for(String[] ticket : tickets) { + // String from = ticket[0]; + // String to = ticket[1]; + + // //만약 key 기반 value 가 없다면, 빈 PQ 를 만들어주고, 안에 add + // map.computeIfAbsent(from, k -> new PriorityQueue<>()).add(to); + // } + + // String[] result = new String[tickets.length + 1]; + // result[0] = nowCity; + // for(int i=1; i answer; + // private int n; + // private boolean found = false; // 첫 경로 찾았는지 여부(사전순) + + // public String[] solution(String[][] tickets) { + // n = tickets.length + 1; + // Map> map = new HashMap<>(); + // for (String[] ticket : tickets) { + // map.computeIfAbsent(ticket[0], k -> new PriorityQueue<>()).add(ticket[1]); + // } + // answer = new ArrayList<>(); + // List path = new ArrayList<>(); + // path.add("ICN"); + // dfs("ICN", map, path); + // return answer.stream().toArray(String[]::new); + // } + + // private void dfs(String now, Map> map, List path) { + // if (found) return; + // if (path.size() == n) { + // answer = new ArrayList<>(path); + // found = true; + // return; + // } + // if (!map.containsKey(now) || map.get(now) == null || map.get(now).isEmpty()) return; + + // PriorityQueue pq = map.get(now); + // List used = new ArrayList<>(); + // while (!pq.isEmpty()) { + // String next = pq.poll(); + // used.add(next); + // path.add(next); + // dfs(next, map, path); + // path.remove(path.size() - 1); + // if (found) break; // 정답 찾았으면 나머지 경로 안 탐색 + // } + // for (String to : used) pq.add(to); + // } + // } + + class Solution { + private String[] answer = null; + private boolean found = false; + + public String[] solution(String[][] tickets) { + boolean[] visited = new boolean[tickets.length]; + List path = new ArrayList<>(); + path.add("ICN"); + dfs("ICN", tickets, visited, path, 1); + return answer; + } + + private void dfs(String now, String[][] tickets, boolean[] visited, List path, int depth) { + if (found) return; + if (depth == tickets.length + 1) { + answer = path.toArray(new String[0]); + found = true; + return; + } + // 사전순 방문을 위해 next 후보들을 먼저 모아서 정렬 + List candidates = new ArrayList<>(); + for (int i = 0; i < tickets.length; i++) { + if (!visited[i] && tickets[i][0].equals(now)) { + candidates.add(i); + } + } + candidates.sort((a, b) -> tickets[a][1].compareTo(tickets[b][1])); + + for (int idx : candidates) { + visited[idx] = true; + path.add(tickets[idx][1]); + dfs(tickets[idx][1], tickets, visited, path, depth + 1); + path.remove(path.size() - 1); + visited[idx] = false; + if (found) break; + } + } + } +} diff --git "a/week12/\352\260\225\354\204\261\354\232\261/programmers/\355\215\274\354\246\220_\352\262\214\354\236\204_\354\261\214\353\246\260\354\247\200.java" "b/week12/\352\260\225\354\204\261\354\232\261/programmers/\355\215\274\354\246\220_\352\262\214\354\236\204_\354\261\214\353\246\260\354\247\200.java" new file mode 100644 index 0000000..ba6c59e --- /dev/null +++ "b/week12/\352\260\225\354\204\261\354\232\261/programmers/\355\215\274\354\246\220_\352\262\214\354\236\204_\354\261\214\353\246\260\354\247\200.java" @@ -0,0 +1,63 @@ +package week12.강성욱.programmers; + +/** + * PackageName : week12.강성욱.programmers + * FileName : 퍼즐_게임_챌린지 + * Author : Baekgwa + * Date : 2025-07-21 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-21 Baekgwa Initial creation + */ +public class 퍼즐_게임_챌린지 { + class Solution { + public int solution(int[] diffs, int[] times, long limit) { + int left = 1; + int right = 0; + int mid = 0; + int result = 0; + + for(int diff : diffs){ + right = Math.max(right, diff); + result = right; + } + + while(left <= right) { + mid = left + (right - left) / 2; + + if(canSolve(diffs, times, limit, mid) == true) { + right = mid - 1; + result = mid; + } + else { + left = mid + 1; + } + } + + return result; + } + + private static boolean canSolve(int[] diffs, int[] times, long limit, int mid) { + long totalTime = 0; + int prevTime = 0; + + for (int i = 0; i < diffs.length; i++) { + if (diffs[i] <= mid) { + totalTime += times[i]; + } else { + int mistakes = diffs[i] - mid; + totalTime += (long) mistakes * (times[i] + prevTime) + times[i]; + } + prevTime = times[i]; + + if (totalTime > limit) { + return false; + } + } + + return true; + } + } +} diff --git "a/week12/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" "b/week12/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" new file mode 100644 index 0000000..e6cdb6c --- /dev/null +++ "b/week12/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" @@ -0,0 +1,22 @@ +package week12.김나은.programmers; + +public class 숫자_문자열과_영단어 { + + class Solution { + + public int solution(String s) { + // 0부터 9까지의 숫자에 대응하는 영어 표기를 배열에 저장 + String[] strNum = {"zero", "one", "two", "three", "four", "five", "six", "seven", + "eight", "nine"}; + + // strNum 배열을 순회하면서, 문자열 s에 포함된 영어 숫자를 해당 숫자로 치환 + for (int i = 0; i < strNum.length; i++) { + // s에 strNum[i] (예: "one")이 있으면, 해당 부분을 i (예: "1")로 모두 바꾼다 + s = s.replace(strNum[i], Integer.toString(i)); + } + + // 모든 영어 숫자가 실제 숫자로 바뀐 s를 정수로 변환해서 반환 + return Integer.parseInt(s); + } + } +} diff --git "a/week12/\352\271\200\353\210\204\353\246\254/programmers/\353\213\244\353\246\254\353\245\274_\354\247\200\353\202\230\353\212\224_\355\212\270\353\237\255.java" "b/week12/\352\271\200\353\210\204\353\246\254/programmers/\353\213\244\353\246\254\353\245\274_\354\247\200\353\202\230\353\212\224_\355\212\270\353\237\255.java" new file mode 100644 index 0000000..e312a58 --- /dev/null +++ "b/week12/\352\271\200\353\210\204\353\246\254/programmers/\353\213\244\353\246\254\353\245\274_\354\247\200\353\202\230\353\212\224_\355\212\270\353\237\255.java" @@ -0,0 +1,83 @@ +package week12.김누리.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week12.김누리.programmers + * FileName : 다리를_지나는_트럭 + * Author : 김누리(NRKim) + * Date : 2025-07-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 13. 김누리(NRKim) Initial creation + */ + +/* +다리 위에는 2개의 트럭만 적재 가능... + +그리고 다리에 올라온 순번대로 골라인으로 가야한다.. + +그러면 다리의 타입은 Queue로 진행. + +결과적으로 시나리오는 + +1. 대기트럭의 맨 앞에 있는 트럭[0]을 다리 위로 이동 + 다리 위 트럭 [0] +2. 다리 위에 있는 트럭[0] + 다음 순번의 대기트럭[1] <= weight? + 다리 위로 이동, 아닌 경우 선두 트럭 골라인으로 + 다리 위 트럭 [0,1] +3. 선두 트럭 골라인 이동 + 다리 위 트럭 [1] +4. 다리 위에 있는 트럭[1] + 다음 트럭[2] <= weight? + 다리 위로 이동, 아닌 경우 선두 트럭 골라인으로 +위 과정들 반복 + + +아이디어는 떠올랐지만? 풀이 과정에서 조금 애를 먹음. +AI의 도움을 받았기에 다시 풀어봐야되는 문제. + +*/ + +public class 다리를_지나는_트럭 { + public int solution(int bridge_length, int weight, int[] truck_weights) { + // 다리 큐와 대기 트럭 큐 + Queue bridge = new LinkedList<>(); + Queue trucks = new LinkedList<>(); + + // 초기 대기 트럭 넣기 + for (int t : truck_weights) trucks.offer(t); + + int time = 0; // 진행 시간 + int bridge_weight = 0; // 현재 다리에 올라간 트럭의 중령 + + // 다리 길이만큼 0으로 초기화 (빈칸) + for (int i = 0; i < bridge_length; i++) { + bridge.offer(0); + } + + // 트럭이 모두 다리를 건널 때까지 시뮬레이션 + while (!bridge.isEmpty()) { + time++; + + // 무조건 1칸 전진 + int out = bridge.poll(); + bridge_weight -= out; + + // 다음 트럭을 올릴 수 있으면 올리기 + if (!trucks.isEmpty()) { + int next = trucks.peek(); + if (bridge_weight + next <= weight) { + bridge.offer(trucks.poll()); + bridge_weight += next; + } else { + bridge.offer(0); // 빈칸 유지 + } + } + } + + return time; + } +} diff --git "a/week12/\352\271\200\353\210\204\353\246\254/programmers/\354\210\230\353\240\210_\354\233\200\354\247\201\354\235\264\352\270\260.java" "b/week12/\352\271\200\353\210\204\353\246\254/programmers/\354\210\230\353\240\210_\354\233\200\354\247\201\354\235\264\352\270\260.java" new file mode 100644 index 0000000..6e7e4ee --- /dev/null +++ "b/week12/\352\271\200\353\210\204\353\246\254/programmers/\354\210\230\353\240\210_\354\233\200\354\247\201\354\235\264\352\270\260.java" @@ -0,0 +1,121 @@ +package week12.김누리.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week12.김누리.programmers + * FileName : 수레_움직이기 + * Author : 김누리(NRKim) + * Date : 2025-07-18 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 18. 김누리(NRKim) Initial creation + */ + +/* +재풀이 필요 + +bfs 통해 풀이를 해야하는건 이해함. + +그러나, 풀이 중 체크 내용에서 동시 이동 및 수레 고정 내용 등 + +구현 하면서 AI를 많이 이용함. + +*/ + +public class 수레_움직이기 { + int[] dx = {1, -1, 0, 0}; + int[] dy = {0, 0, 1, -1}; + int n, m; + + public int solution(int[][] maze) { + n = maze.length; + m = maze[0].length; + + boolean[][][][] visited = new boolean[n][m][n][m]; + + int rx = 0, ry = 0, bx = 0, by = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (maze[i][j] == 1) { rx = i; ry = j; } + if (maze[i][j] == 2) { bx = i; by = j; } + } + } + + Queue q = new LinkedList<>(); + boolean[][] redInit = new boolean[n][m]; + boolean[][] blueInit = new boolean[n][m]; + redInit[rx][ry] = true; + blueInit[bx][by] = true; + + visited[rx][ry][bx][by] = true; + q.offer(new Object[]{rx, ry, bx, by, 0, redInit, blueInit}); + + while (!q.isEmpty()) { + Object[] cur = q.poll(); + int drx = (int) cur[0], dry = (int) cur[1]; + int dbx = (int) cur[2], dby = (int) cur[3]; + int turn = (int) cur[4]; + boolean[][] rVisited = (boolean[][]) cur[5]; + boolean[][] bVisited = (boolean[][]) cur[6]; + + if (maze[drx][dry] == 3 && maze[dbx][dby] == 4) { + return turn; + } + + for (int d1 = 0; d1 < 4; d1++) { + for (int d2 = 0; d2 < 4; d2++) { + int nrx = drx + dx[d1]; + int nry = dry + dy[d1]; + int nbx = dbx + dx[d2]; + int nby = dby + dy[d2]; + + if (maze[drx][dry] == 3) { nrx = drx; nry = dry; } + if (maze[dbx][dby] == 4) { nbx = dbx; nby = dby; } + + if (!isValid(nrx, nry, maze) || !isValid(nbx, nby, maze)) continue; + + // 수레가 겹치거나, 서로 위치를 교환하는 경우 + if ((nrx == nbx && nry == nby) || + (nrx == dbx && nry == dby && nbx == drx && nby == dry)) { + continue; + } + + // 도착 칸이 아닌데 이미 방문한 경우 + if ((rVisited[nrx][nry] && maze[nrx][nry] != 3) || + (bVisited[nbx][nby] && maze[nbx][nby] != 4)) { + continue; + } + + if (visited[nrx][nry][nbx][nby]) continue; + + visited[nrx][nry][nbx][nby] = true; + + boolean[][] newR = copy(rVisited); + boolean[][] newB = copy(bVisited); + newR[nrx][nry] = true; + newB[nbx][nby] = true; + + q.offer(new Object[]{nrx, nry, nbx, nby, turn + 1, newR, newB}); + } + } + } + + return 0; + } + + public boolean isValid(int x, int y, int[][] maze) { + return x >= 0 && x < n && y >= 0 && y < m && maze[x][y] != 5; + } + + public boolean[][] copy(boolean[][] src) { + boolean[][] result = new boolean[n][m]; + for (int i = 0; i < n; i++) { + result[i] = src[i].clone(); + } + return result; + } +} diff --git "a/week12/\352\271\200\353\210\204\353\246\254/programmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" "b/week12/\352\271\200\353\210\204\353\246\254/programmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" new file mode 100644 index 0000000..e3b310e --- /dev/null +++ "b/week12/\352\271\200\353\210\204\353\246\254/programmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" @@ -0,0 +1,97 @@ +package week12.김누리.programmers; + +/** + * PackageName : week12.김누리.programmers + * FileName : 숫자_문자열과_영단어 + * Author : 김누리(NRKim) + * Date : 2025-07-14 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 14. 김누리(NRKim) Initial creation + */ + +/* + +숫자를 쪼갠다. + +쪼갠 숫자다 ? 그냥 ㄱㄱ + +문자다? 문자를 만들어 숫자로 치환 + +*/ + +public class 숫자_문자열과_영단어 { + public int solution(String s) { + int answer = 0; + char[] cArr = s.toCharArray(); + String sTmp = ""; + String tmp = ""; + + for(char c : cArr) { + if(c >= 97 && c <= 122) {; + tmp += String.valueOf(c); + + switch(tmp) { + case "zero" : + sTmp += "0"; + tmp = ""; + break; + + case "one" : + sTmp += "1"; + tmp = ""; + break; + + case "two" : + sTmp += "2"; + tmp = ""; + break; + + case "three" : + sTmp += "3"; + tmp = ""; + break; + + case "four" : + sTmp += "4"; + tmp = ""; + break; + + case "five" : + sTmp += "5"; + tmp = ""; + break; + + case "six" : + sTmp += "6"; + tmp = ""; + break; + + case "seven" : + sTmp += "7"; + tmp = ""; + break; + + case "eight" : + sTmp += "8"; + tmp = ""; + break; + + case "nine" : + sTmp += "9"; + tmp = ""; + break; + } + } else { + sTmp += String.valueOf(c); + + } + } + + answer = Integer.parseInt(sTmp); + + return answer; + } +} diff --git "a/week12/\352\271\200\353\210\204\353\246\254/programmers/\354\227\254\355\226\211\352\262\275\353\241\234.java" "b/week12/\352\271\200\353\210\204\353\246\254/programmers/\354\227\254\355\226\211\352\262\275\353\241\234.java" new file mode 100644 index 0000000..e66325b --- /dev/null +++ "b/week12/\352\271\200\353\210\204\353\246\254/programmers/\354\227\254\355\226\211\352\262\275\353\241\234.java" @@ -0,0 +1,74 @@ +package week12.김누리.programmers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week12.김누리.programmers + * FileName : 여행경로 + * Author : 김누리(NRKim) + * Date : 2025-07-14 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 14. 김누리(NRKim) Initial creation + */ + + +/* +tickets 를 뜯어보면 + +tickets[0][0] == from +tickets[0][1] == to + +dfs 채용해서 하면 될거 같은데... + +dfs(String[][] tickets, Boolean[] visited, String now, List list, int cnt)로 해서 풀이 하면 될거 같은데... + + + +*/ + +public class 여행경로 { + // 방문 여행지 저장용 리스트 + List list = new ArrayList<>(); + + // 방문 여부 판별용 배열 + boolean[] visited; + + public String[] solution(String[][] tickets) { + visited = new boolean[tickets.length]; + + // 인천에서 출발하는걸 전제로 재귀 시작 + dfs(tickets,"ICN","ICN",0); + + Collections.sort(list); + + String[] answer = new String[list.size()]; + + answer = list.get(0).split(" "); + + return answer; + } + + private void dfs(String[][]tickets, String current, String target, int cnt) { + + // 티켓 사이즈만큼 다 돌렸다? list에 추가 + if(cnt == tickets.length) { + list.add(target); + return; + } + + // 티켓 사이즈 만큼 반복 + for(int i = 0; i < tickets.length; i++) { + if(!visited[i] && tickets[i][0].equals(current)) { + visited[i] = true; + // 시작점 : tickets[i][1], 경로 : 도착지 다음 도착지 + dfs(tickets,tickets[i][1],target+" "+tickets[i][1],cnt+1); + visited[i] = false; + } + } + } +} diff --git "a/week12/\352\271\200\353\210\204\353\246\254/programmers/\355\215\274\354\246\220_\352\262\214\354\236\204_\354\261\214\353\246\260\354\247\200.java" "b/week12/\352\271\200\353\210\204\353\246\254/programmers/\355\215\274\354\246\220_\352\262\214\354\236\204_\354\261\214\353\246\260\354\247\200.java" new file mode 100644 index 0000000..953ea06 --- /dev/null +++ "b/week12/\352\271\200\353\210\204\353\246\254/programmers/\355\215\274\354\246\220_\352\262\214\354\236\204_\354\261\214\353\246\260\354\247\200.java" @@ -0,0 +1,52 @@ +package week12.김누리.programmers; + +/** + * PackageName : week12.김누리.programmers + * FileName : 퍼즐_게임_챌린지 + * Author : 김누리(NRKim) + * Date : 2025-07-18 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 18. 김누리(NRKim) Initial creation + */ + +/* + +문제만 보고는 감이 안옴. 검색을 통해 확인해 보니 이진 탐색을 통해 진행하면 된다고 하지만? + +이진 탐색을 위해 추려나가야 될 범위를? 못잡아서 다른 사람의 풀이를 참조함. + +재풀이 필요 + +*/ + +public class 퍼즐_게임_챌린지 { + public int solution(int[] diffs, int[] times, long limit) { + int n = times.length; + long min = 1; + long max = limit; + + while(min <= max) { + long level = (min + max) / 2; + long spent = 0; + + for(int i = 0; i < n; ++i) { + if(level < diffs[i]) { + spent += (times[i] + times[i-1]) * (diffs[i] - level) + times[i]; + } else { + spent += times[i]; + } + } + + if(spent > limit) { + min = level +1; + } else { + max = level -1; + } + } + + return (int) min; + } +} diff --git "a/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\244\353\246\254\353\245\274_\354\247\200\353\202\230\353\212\224_\355\212\270\353\237\255.java" "b/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\244\353\246\254\353\245\274_\354\247\200\353\202\230\353\212\224_\355\212\270\353\237\255.java" new file mode 100644 index 0000000..10e5c2a --- /dev/null +++ "b/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\244\353\246\254\353\245\274_\354\247\200\353\202\230\353\212\224_\355\212\270\353\237\255.java" @@ -0,0 +1,46 @@ +/** + * PackageName : week12.이상억.progarmmers; + * FileName : 다리를_지나는_트럭 + * Author : sangeok + * Date : 2025. 07. 15. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 15. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int solution(int bridge_length, int weight, int[] truck_weights) { + Queue qe = new LinkedList<>(); // 다리 + int time = 0; // 시간 + int idx = 0; + int current_weight = 0; + + // 다리 위를 초기화 (빈 공간) + for (int i = 0; i < bridge_length; i++) { + qe.offer(0); + } + + while (!qe.isEmpty()) { + time++; + int out = qe.poll(); + current_weight -= out; + + // 트럭이 남아있고, 무게 조건도 만족하면 트럭을 올림 + if (idx < truck_weights.length) { + if (current_weight + truck_weights[idx] <= weight) { + qe.offer(truck_weights[idx]); + current_weight += truck_weights[idx]; + idx++; + } else { + qe.offer(0); // 아무 트럭도 못 올라오면 빈칸 추가 + } + } + } + + return time; + } +} diff --git "a/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" "b/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" new file mode 100644 index 0000000..93df6b4 --- /dev/null +++ "b/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\353\254\270\354\236\220\354\227\264\352\263\274_\354\230\201\353\213\250\354\226\264.java" @@ -0,0 +1,40 @@ +/** + * PackageName : week12.이상억.progarmmers; + * FileName : 숫자_문자열괴_영단어 + * Author : sangeok + * Date : 2025. 07. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 12. sangeok Initial creation + */ + + + +import java.util.*; + +class Solution { + public int solution(String s) { + int answer = 0; + + Map numbermap = new HashMap<>(); + numbermap.put("zero", 0); + numbermap.put("one", 1); + numbermap.put("two", 2); + numbermap.put("three", 3); + numbermap.put("four", 4); + numbermap.put("five", 5); + numbermap.put("six", 6); + numbermap.put("seven", 7); + numbermap.put("eight", 8); + numbermap.put("nine", 9); + + for (String key : numbermap.keySet()) { + s = s.replaceAll(key, numbermap.get(key).toString()); + } + + answer = Integer.parseInt(s); + return answer; + } +} diff --git "a/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\354\227\254\355\226\211\352\262\275\353\241\234.java" "b/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\354\227\254\355\226\211\352\262\275\353\241\234.java" new file mode 100644 index 0000000..d118c62 --- /dev/null +++ "b/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\354\227\254\355\226\211\352\262\275\353\241\234.java" @@ -0,0 +1,66 @@ +/** + * PackageName : week12.이상억.progarmmers; + * FileName : 여행경로 + * Author : sangeok + * Date : 2025. 07. 14. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 14. sangeok Initial creation + */ + + +// 항상 "ICN" 에서 출발 +// 모든 공항 대문자 3글자 +// [a,b] a->b +// 주어진 공항은 모두 사용 +// 만일 가능한 경로 2개 이상일 경우 알파벳 순서가 앞서는 경우 +// 모든 도시를 방문 할 수 없는 경우는 주어지지 않음 + +// DFS 가 더 적합할 것 같음 + +// dfs 안에 우선 이전 tickets[1]과 다음 tickets[0]이 동일한지 판단 +// 근데 그 동일한 후보군들을 어디에 담아야 할 거 같은데 ? 그 담고 알파벳 순 +// 그리고 visited = true 처리 + +// 동일 후보군들을 담는게 아니라 애초에 tickets 배열을 정렬 시켜놓고 가장 먼저 완성되는 path 가 문제 요구사항에서 원하는 경로 +import java.util.*; + +class Solution { + static List answerlist = null; + + public String[] solution(String[][] tickets) { + boolean[] visited = new boolean[tickets.length]; + List path = new ArrayList<>(); + path.add("ICN"); + + Arrays.sort(tickets, (a, b) -> a[1].compareTo(b[1])); + + dfs("ICN", tickets, path, visited); + + return answerlist.toArray(new String[0]); + } + + public void dfs(String current, String[][] tickets, List path, boolean[] visited) { + if (path.size() == tickets.length + 1) { + if (answerlist == null) { + answerlist = new ArrayList<>(path); // 처음 완성된 경로만 저장 + } + + return; + } + + for(int i = 0; i < tickets.length; i++) { + if (tickets[i][0].equals(current) && !visited[i]) { + visited[i] = true; + path.add(tickets[i][1]); + + dfs(tickets[i][1], tickets, path, visited); + + visited[i] = false; + path.remove(path.size() - 1); + } + } + } +} diff --git "a/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\355\215\274\354\246\220_\352\262\214\354\236\204_\354\261\214\353\246\260\354\247\200.java" "b/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\355\215\274\354\246\220_\352\262\214\354\236\204_\354\261\214\353\246\260\354\247\200.java" new file mode 100644 index 0000000..d2f2d33 --- /dev/null +++ "b/week12/\354\235\264\354\203\201\354\226\265/progarmmers/\355\215\274\354\246\220_\352\262\214\354\236\204_\354\261\214\353\246\260\354\247\200.java" @@ -0,0 +1,54 @@ +/** + * PackageName : week12.이상억.progarmmers; + * FileName : 퍼즐_게임_챌린지 + * Author : sangeok + * Date : 2025. 07. 21. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 21. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int solution(int[] diffs, int[] times, long limit) { + // diffs 중 가장 큰 값 구하기 + int maxDiff = 0; + for (int diff : diffs) { + if (diff > maxDiff) maxDiff = diff; + } + + int left = 1; + int right = maxDiff; + int answer = right; + + while (left <= right) { + int mid = (left + right) / 2; + long totalTime = 0; + for (int i = 0; i < diffs.length; i++) { + int prevTime = (i == 0) ? 0 : times[i - 1]; + totalTime += cleartime(mid, diffs[i], times[i], prevTime); + if (totalTime > limit) break; // 가지치기 + } + + if (totalTime <= limit) { + answer = mid; + right = mid - 1; // 더 낮은 level 시도 + } else { + left = mid + 1; // 더 높은 level 시도 + } + } + + return answer; + } + + public int cleartime(int level, int diff, int time, int prevTime) { + if (diff <= level) { + return time; + } else { + return (time + prevTime) * (diff - level) + time; + } + } +} diff --git "a/week13/\352\260\225\354\204\261\354\232\261/programmers/\354\247\225\352\262\200\353\213\244\353\246\254_\352\261\264\353\204\210\352\270\260.java" "b/week13/\352\260\225\354\204\261\354\232\261/programmers/\354\247\225\352\262\200\353\213\244\353\246\254_\352\261\264\353\204\210\352\270\260.java" new file mode 100644 index 0000000..ee14f15 --- /dev/null +++ "b/week13/\352\260\225\354\204\261\354\232\261/programmers/\354\247\225\352\262\200\353\213\244\353\246\254_\352\261\264\353\204\210\352\270\260.java" @@ -0,0 +1,65 @@ +package week13.강성욱.programmers; + +/** + * PackageName : week13.강성욱.programmers + * FileName : 징검다리_건너기 + * Author : Baekgwa + * Date : 2025-07-24 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-24 Baekgwa Initial creation + */ +public class 징검다리_건너기 { + // 최대 200,000 개의 돌, 200,000,000의 돌값을 가지고 있어, 완탐으로 풀면, 너무 큼 + + // n번 건넜을 때, k만큼 0이 반복되는걸 확인 + // 그럼, 가장 작은 숫자가 k번 반복되는걸 찾으면 되는거 아닌가? + // 그 k개 중, 가장 큰값이 0이 될만큼 뛰는 순간, 그다음은 뛸 수 없음. + // 그때 답은 가장 큰 돌의 값 + // 은, [1, 100, 50, 60], k=2 에서 안됨. + // 합이 가장 작은 셋트는 101인데, 얘는 101명까지 수용가능하나, [50, 60] 셋트를 생각하면 60명까지 가능 + // 다른방법 + + // 이진탐색 활용? + // mid 값 정해서, stones[i]-mid 값해서 0이하가 k번 반복되면 해당 값은 못건너는 인원수 mid 값 + + // 테-케1번 불통과...? 뭐냐 + // right 범위는 더 크게 잡아주니 ㄱㅊ + + class Solution { + public int solution(int[] stones, int k) { + int result = 0; + int right = Integer.MAX_VALUE; + int left = 0; + + while (left < right) { + int mid = left + (right - left) / 2; + int cnt = 0; + boolean fail = false; //건널 수 있는지 없는지. true = 못건너는 큰 mid 상태. (혹은 정답) + + for (int stone : stones) { + if (stone < mid) { + cnt++; + if (cnt == k) { + fail = true; + break; + } + } else { + cnt = 0; + } + } + + if (fail) { + right = mid; + } else { + result = mid; + left = mid + 1; + } + } + + return result; + } + } +} diff --git "a/week13/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" "b/week13/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" new file mode 100644 index 0000000..46d3a6d --- /dev/null +++ "b/week13/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" @@ -0,0 +1,31 @@ +package week13.강성욱.programmers; + +/** + * PackageName : week13.강성욱.programmers + * FileName : 최댓값과_최솟값 + * Author : Baekgwa + * Date : 2025-07-22 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-22 Baekgwa Initial creation + */ +public class 최댓값과_최솟값 { + + class Solution { + public String solution(String s) { + String[] sArray = s.split(" "); + int max = Integer.MIN_VALUE; + int min = Integer.MAX_VALUE; + + for (String numStr : sArray) { + int num = Integer.parseInt(numStr); + if (num > max) max = num; + if (num < min) min = num; + } + + return min + " " + max; + } + } +} diff --git "a/week13/\352\260\225\354\204\261\354\232\261/programmers/\355\201\260_\354\210\230_\353\247\214\353\223\244\352\270\260.java" "b/week13/\352\260\225\354\204\261\354\232\261/programmers/\355\201\260_\354\210\230_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..c31ec32 --- /dev/null +++ "b/week13/\352\260\225\354\204\261\354\232\261/programmers/\355\201\260_\354\210\230_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,43 @@ +package week13.강성욱.programmers; + +/** + * PackageName : week13.강성욱.programmers + * FileName : 큰_수_만들기 + * Author : Baekgwa + * Date : 2025-07-23 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-23 Baekgwa Initial creation + */ +public class 큰_수_만들기 { + // 맨앞이 가장 큰수가 나와야함. + // 그다음도 남은 것 중 가장 큰수 + // 숫자를 앞에서부터 넣는데, 이전에 넣은것보다 더 큰 수가 나오면? 이전꺼 삭제 + // 이걸 k 만큼 반복? + // k만큼 반복하면 안됨. 전부 다 확인해야됨. + + public class Solution { + public String solution(String number, int k) { + int[] resultArray = new int[number.length()]; + int targetLen = number.length() - k; + int left = -1; + + for (int i = 0; i < number.length(); i++) { + int digit = Integer.parseInt(number.substring(i, i+1)); + while (left >= 0 && k > 0 && resultArray[left] < digit) { + left--; + k--; + } + resultArray[++left] = digit; + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < targetLen; i++) { + sb.append(resultArray[i]); + } + return sb.toString(); + } + } +} diff --git "a/week13/\352\260\225\354\204\261\354\232\261/programmers/\355\202\244\355\214\250\353\223\234_\353\210\204\353\245\264\352\270\260.java" "b/week13/\352\260\225\354\204\261\354\232\261/programmers/\355\202\244\355\214\250\353\223\234_\353\210\204\353\245\264\352\270\260.java" new file mode 100644 index 0000000..792d6e9 --- /dev/null +++ "b/week13/\352\260\225\354\204\261\354\232\261/programmers/\355\202\244\355\214\250\353\223\234_\353\210\204\353\245\264\352\270\260.java" @@ -0,0 +1,98 @@ +package week13.강성욱.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week13.강성욱.programmers + * FileName : 키패드_누르기 + * Author : Baekgwa + * Date : 2025-07-24 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-24 Baekgwa Initial creation + */ +public class 키패드_누르기 { + //빡구현? + //numbers 를 order 로 구분해서 진행 + //[1, 4, 7], [3, 6, 9] 는 상관없고 + //[2, 5, 8, 0] 이 들어오면, left, right 손가락 위치 맞춰서 최소 거리 계산하기. + //같으면 주력 손에 따라서 구분. + + //최소 이동거리를 계산하기? + //가장 쉬운건 bfs긴함. 근데 이미 고정된 숫자인데, 계산식으로 어케 안되려나? + //현재 좌표는 pos으로 계속 관리를 하니, 키패드별 구조를 map으로 관리해두면 바로 쏙쏙 나오니 좋을듯? Map 쓰자 + + class Solution { + public String solution(int[] numbers, String hand) { + int[] leftPos = new int[]{0, 3}; //x, y 순서 + int[] rightPos = new int[]{2, 3}; //x, y 순서 + Map phone = new HashMap<>(); //key : 키패드, value : 키패드 좌표, [x, y] + String LEFT = "L"; + String RIGHT = "R"; + + //키패드 좌표 저장 + phone.put(1, new Integer[]{0, 0}); phone.put(2, new Integer[]{1, 0}); phone.put(3, new Integer[]{2, 0}); + phone.put(4, new Integer[]{0, 1}); phone.put(5, new Integer[]{1, 1}); phone.put(6, new Integer[]{2, 1}); + phone.put(7, new Integer[]{0, 2}); phone.put(8, new Integer[]{1, 2}); phone.put(9, new Integer[]{2, 2}); + phone.put(0, new Integer[]{1, 3}); + + StringBuilder sb = new StringBuilder(); + + //현재 좌표 기반, numbers 누르기 시작 + for (int order : numbers) { + switch (order) { + case 1: case 4: case 7: + updateHandPos(LEFT, order, leftPos, rightPos, phone); + sb.append(LEFT); + continue; + case 3: case 6: case 9: + updateHandPos(RIGHT, order, leftPos, rightPos, phone); + sb.append(RIGHT); + continue; + } + + //여기부터는, 비교 작업 필요 + //2, 5, 8, 0 일경우 + int leftCnt = calculateCnt(leftPos, phone.get(order)); + int rightCnt = calculateCnt(rightPos, phone.get(order)); + + if(leftCnt == rightCnt) { + if(hand.equals("right")) { + updateHandPos(RIGHT, order, leftPos, rightPos, phone); + sb.append("R"); + } else { + updateHandPos(LEFT, order, leftPos, rightPos, phone); + sb.append("L"); + } + } else if(leftCnt < rightCnt) { + updateHandPos(LEFT, order, leftPos, rightPos, phone); + sb.append("L"); + } else { + updateHandPos(RIGHT, order, leftPos, rightPos, phone); + sb.append("R"); + } + } + + return sb.toString(); + } + + private int calculateCnt(int[] nowPos, Integer[] targetPos) { + return Math.abs(nowPos[0] - targetPos[0]) + Math.abs(nowPos[1] - targetPos[1]); + } + + //손에 따라서, 현재 손, 타겟 포지션으로 업데이트 + private void updateHandPos(String hand, int target, int[] leftPos, int[] rightPos, Map phone) { + Integer[] pos = phone.get(target); + if(hand.equals("L")) { + leftPos[0] = pos[0]; + leftPos[1] = pos[1]; + } else { + rightPos[0] = pos[0]; + rightPos[1] = pos[1]; + } + } + } +} diff --git "a/week13/\352\260\225\354\204\261\354\232\261/programmers/\355\233\204\353\263\264\355\202\244.java" "b/week13/\352\260\225\354\204\261\354\232\261/programmers/\355\233\204\353\263\264\355\202\244.java" new file mode 100644 index 0000000..3c3ccab --- /dev/null +++ "b/week13/\352\260\225\354\204\261\354\232\261/programmers/\355\233\204\353\263\264\355\202\244.java" @@ -0,0 +1,80 @@ +package week13.강성욱.programmers; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * PackageName : week13.강성욱.programmers + * FileName : 후보키 + * Author : Baekgwa + * Date : 2025-07-23 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-23 Baekgwa Initial creation + */ +public class 후보키 { + // 헷갈리네? + // String 으로 묶어서 set으로 저장시켜서 확인해본다? + // 그럼 조합을 만들어야 겟네? + // 확인 해봐야 하는 조합은, (학번), (이름), (전공), (학년), (학번, 이름), (학번, 전공), ... (학번, 이름, 전공, 학년) + // 그럼 인덱스를 활용해서, arrayList 에 조합을 하나씩 저걸 만들어둘까? ㅇㅇ 그러고 하나씩 뽑아쓰면 될듯 + // 최소성 만족을 어떻게 해야하나...? + // 위에서 유일성을 만족하는 슈퍼키 조합을 만들어두고, contains 로 검사? + + class Solution { + public int solution(String[][] relation) { + int row = relation.length; + int col = relation[0].length; + + List> combiList = new ArrayList<>(); + List> candidateKeyList = new ArrayList<>(); + + for (int size = 1; size <= col; size++) { + combine(col, size, 0, new ArrayList<>(), combiList); + } + // System.out.println(combiList); + + for(List combi : combiList) { + //최소성 확인 + //현재 키 조합이, 이미 모두 들어있는 조합이라면 + if (candidateKeyList.stream().anyMatch(candidateKey -> combi.containsAll(candidateKey))) { + continue; + } + + //유일성 확인을 위한 set + Set checkSet = new HashSet<>(); + + for(String[] cols : relation) { + StringBuilder sb = new StringBuilder(); + for(int index : combi) { + sb.append(cols[index]); + } + checkSet.add(sb.toString()); + } + + if(checkSet.size() == row) { + candidateKeyList.add(combi); //해당 조합은 유일성, 최소성 만족 + } + } + System.out.println(candidateKeyList); + + return candidateKeyList.size(); + } + + private void combine(int n, int r, int start, List temp, List> result) { + if (temp.size() == r) { + result.add(new ArrayList<>(temp)); + return; + } + for (int i = start; i < n; i++) { + temp.add(i); + combine(n, r, i + 1, temp, result); + temp.remove(temp.size() - 1); + } + } + } +} diff --git "a/week13/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" "b/week13/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" new file mode 100644 index 0000000..5fb4d01 --- /dev/null +++ "b/week13/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" @@ -0,0 +1,32 @@ +package week13.김나은.programmers; + +public class 최댓값과_최솟값 { + + class Solution { + + public String solution(String s) { + // 입력받은 문자열을 공백(" ") 기준으로 split해서 배열로 만듬 + String[] sNum = s.split(" "); + + // 배열의 첫 번째 값을 int로 변환해서 max, min에 초기값으로 설정 + int max = Integer.parseInt(sNum[0]); + int min = Integer.parseInt(sNum[0]); + + // 배열 전체를 돌면서 최대값과 최소값을 찾음 + for (String str : sNum) { + int intNum = Integer.parseInt(str); // 현재 값을 int로 변환 + + // 현재 숫자가 max보다 크거나 같으면 max 갱신 + if (intNum > max) { + max = intNum; + // 현재 숫자가 min보다 작으면 min 갱신 + } else if (intNum < min) { + min = intNum; + } + } + + // 최소값과 최대값을 "min max" 형태로 반환 + return min + " " + max; + } + } +} \ No newline at end of file diff --git "a/week13/\352\271\200\353\210\204\353\246\254/programmers/\354\247\225\352\262\200\353\213\244\353\246\254_\352\261\264\353\204\210\352\270\260.java" "b/week13/\352\271\200\353\210\204\353\246\254/programmers/\354\247\225\352\262\200\353\213\244\353\246\254_\352\261\264\353\204\210\352\270\260.java" new file mode 100644 index 0000000..3fc9cbb --- /dev/null +++ "b/week13/\352\271\200\353\210\204\353\246\254/programmers/\354\247\225\352\262\200\353\213\244\353\246\254_\352\261\264\353\204\210\352\270\260.java" @@ -0,0 +1,79 @@ +package week13.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week13.김누리.programmers + * FileName : 징검다리_건너기 + * Author : 김누리(NRKim) + * Date : 2025-07-23 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 23. 김누리(NRKim) Initial creation + */ + +/* +디딤돌을 밟으면 밟은 디딤돌은 내구도 -- +내구도가 0인 디딤돌은 pass +내구도가 0은 디딤돌이 연속으로 k개 존재한다면? 횡단 불가 ==> 내구도가 0인 돌 + 내구도가 0이 아닌 도착 돌 <= K여야 슈퍼 점프 가능 + +그렇게 해서 건넌 사람 수를 ++ 하면 됨 + +그러면 배열의 크기나..... 내구성을 보면? 완전 탐색은 불가능 20만 * 200만 ? 프로그램이 난죽택을 선택함 + +이진 탐색을 통해 + +left right? 비교하며 위치를 조정해가며 ㄱㄱ 하면 될거 같은데? + +*/ + +public class 징검다리_건너기 { + public int solution(int[] stones, int k) { + int answer = 0; + + answer = binarySearch(stones,k); + + return answer; + } + + // 이진 탐색용 함수 + public int binarySearch(int[] stones, int k) { + int left = 1; // 최초 위치 1 + int right = Arrays.stream(stones).max().getAsInt(); // 내구도가 가장 큰 인자를 right에 + int complete = 0; + + while(left <= right) { + int mid = (left + right) / 2; + + if(canCross(stones, k, mid)) { + complete = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + + return complete; + } + + // 건널 수 있는지 확인 + public boolean canCross(int[] stones, int k, int p) { + int skip = 0; // 연속 점프 가능한 돌 수 + + for(int s : stones) { + if (s - p < 0) { + // 돌 - 인수 >= 0 인 경우 계속 ㄱㄱ + skip++; + + // 연속되는 돌 수가 K 이상이면 못건넘 + if(skip >= k) return false; + } else { + skip = 0; + } + } + + return true; + } +} diff --git "a/week13/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" "b/week13/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" new file mode 100644 index 0000000..005d601 --- /dev/null +++ "b/week13/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" @@ -0,0 +1,34 @@ +package week13.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week13.김누리.programmers + * FileName : 최댓값과_최솟값 + * Author : 김누리(NRKim) + * Date : 2025-07-22 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 22. 김누리(NRKim) Initial creation + */ + +public class 최댓값과_최솟값 { + public String solution(String s) { + String answer = ""; + String[] str = s.split(" "); + int[] arr = new int[str.length]; + + int idx = 0; + + for(String i : str) arr[idx++] = Integer.parseInt(i); + + Arrays.sort(arr); + + if(arr.length == 2) answer = Integer.toString(arr[0]) + " " + Integer.toString(arr[1]); + else answer = Integer.toString(arr[0]) + " " + Integer.toString(arr[arr.length-1]); + + return answer; + } +} diff --git "a/week13/\352\271\200\353\210\204\353\246\254/programmers/\355\201\260_\354\210\230_\353\247\214\353\223\244\352\270\260.java" "b/week13/\352\271\200\353\210\204\353\246\254/programmers/\355\201\260_\354\210\230_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..87d9861 --- /dev/null +++ "b/week13/\352\271\200\353\210\204\353\246\254/programmers/\355\201\260_\354\210\230_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,52 @@ +package week13.김누리.programmers; + +/** + * PackageName : week13.김누리.programmers + * FileName : 큰_수_만들기 + * Author : 김누리(NRKim) + * Date : 2025-07-22 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 22. 김누리(NRKim) Initial creation + */ + +/* +StringBuilder 써도 될 거 같은데... + +정렬 하면? + +9421 >> 94 까지 걍 뒤에 2개만 빼면 됨 + +1231234 + +4332211 >> 3개 제거 해야 함 4332 >> 요구와 맞지 않음 + +StringBuilder의 맨 뒤와 다음 숫자 비교하며 만들어나가면 될듯 + +풀이 진행 + +*/ + +public class 큰_수_만들기 { + public StringBuilder solution(String number, int k) { + StringBuilder sb = new StringBuilder(); + + for(char c : number.toCharArray()) { + + while(sb.length() > 0 && c > sb.charAt(sb.length()-1) && k > 0) { + sb.setLength(sb.length() - 1); // StringBuilder의 길이 조절 + k--; + + } + + sb.append(c); + } + + if(k > 0) sb.setLength(sb.length() - k); + + + return sb; + } +} diff --git "a/week13/\352\271\200\353\210\204\353\246\254/programmers/\355\202\244\355\214\250\353\223\234_\353\210\204\353\245\264\352\270\260.java" "b/week13/\352\271\200\353\210\204\353\246\254/programmers/\355\202\244\355\214\250\353\223\234_\353\210\204\353\245\264\352\270\260.java" new file mode 100644 index 0000000..19a37e9 --- /dev/null +++ "b/week13/\352\271\200\353\210\204\353\246\254/programmers/\355\202\244\355\214\250\353\223\234_\353\210\204\353\245\264\352\270\260.java" @@ -0,0 +1,145 @@ +package week13.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week13.김누리.programmers + * FileName : 키패드_누르기 + * Author : 김누리(NRKim) + * Date : 2025-07-24 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 24. 김누리(NRKim) Initial creation + */ + +/* +1, 4, 7 == "L" +3, 6, 9 == "R" + +int[] lP = {3,0}; +int[] rP = {3,2}; + + + +키패드 좌표화 + +0,0 0,1 0,2 +1,0 1,1 1,2 +2,0 2,1 2,2 +3,0 3,1 3,2 + +Map을 채용 해서 진행 +Map map = new HashMap<>(); + +map = { +1 = {0,0} +2 = {0,1} +3 = {0,2} +4 = {1,0} +5 = {1,1} +6 = {1,2} +7 = {2,0} +8 = {2,1} +9 = {2,2} +* = {3,0} +0 = {3,1} +# = {3,2} +} + + +case 1 : +numbers = [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]; + +for(int n : numbers) { + if (n == 1 || n == 4 || n == 7 ) { + // L 처리 + lP = map.get(n); + answer += "L" + } else if (n == 3 || n == 6 || n == 9) { + // R 처리 + rP = map.get(n); + answer += "R" + } else { + // 0 2 5 8 일 때 처리 + 타겟 거리 계산 + int[] tmp = map.get(n) + int lToTarget = Math.abs(tmp[0]-lp[0]) + Math.abs(tmp[1] - lP[1]); + int rToTarget = Math.abs(tmp[0]-rp[0]) + Math.abs(tmp[1] - rP[1]); + + if(lToTarget > rToTarget) { + answer += "L" + } else if (lToTarget < rToTarget) { + answer += "R" + } else { + String t = hand.toUpperCase(); + answer += substring(t,0); + } + } +} + +대충 위와 같은 느낌으로 로직 진행하면 됨 + +*/ + +public class 키패드_누르기 { + public String solution(int[] numbers, String hand) { + String answer = ""; + Map map = new HashMap<>(); // 숫자패드 별 위치 저장용 map + int[] lP = {3,0}; // 초기 * 위치 + int[] rP = {3,2}; // 초기 # 위치 + + // 키패드 별 위치 등록 + map.put(0,new int[] {3,1}); + map.put(1,new int[] {0,0}); + map.put(2,new int[] {0,1}); + map.put(3,new int[] {0,2}); + map.put(4,new int[] {1,0}); + map.put(5,new int[] {1,1}); + map.put(6,new int[] {1,2}); + map.put(7,new int[] {2,0}); + map.put(8,new int[] {2,1}); + map.put(9,new int[] {2,2}); + + for(int n : numbers) { + if(n == 1 || n == 4 || n == 7) { + lP = map.get(n); + answer += "L"; + } else if(n == 3 || n == 6 || n == 9) { + rP = map.get(n); + answer += "R"; + } else { + int[] tmp = map.get(n); + int lToTarget = Math.abs(tmp[0] - lP[0]) + Math.abs(tmp[1] - lP[1]); // 좌측 엄지 > 타겟 자판 까지 거리 + int rToTarget = Math.abs(tmp[0] - rP[0]) + Math.abs(tmp[1] - rP[1]); // 우측 엄지 > 타겟 자판 까지 거리 + + if (lToTarget < rToTarget) { + // 좌측 엄지 > 타겟 자판 까지의 거리가 더 가까운 경우 + lP = map.get(n); + answer += "L"; + } else if (lToTarget > rToTarget) { + // 우측 엄지 > 타겟 자판 까지의 거리가 더 가까운 경우 + rP = map.get(n); + answer += "R"; + } else { + // 각 엄지에서 타겟 자판 까지의 거리가 같은 경우 + String t = hand.toUpperCase(); + + if (hand.equals("right")) { + // 오른손 잡이인 경우 + rP = map.get(n); + answer += t.substring(0,1); + } else if (hand.equals("left")) { + // 왼손 잡이인 경우 + lP = map.get(n); + answer += t.substring(0,1); + } + } + } + } + + return answer; + } +} diff --git "a/week13/\352\271\200\353\210\204\353\246\254/programmers/\355\233\204\353\263\264\355\202\244.java" "b/week13/\352\271\200\353\210\204\353\246\254/programmers/\355\233\204\353\263\264\355\202\244.java" new file mode 100644 index 0000000..27feef9 --- /dev/null +++ "b/week13/\352\271\200\353\210\204\353\246\254/programmers/\355\233\204\353\263\264\355\202\244.java" @@ -0,0 +1,128 @@ +package week13.김누리.programmers; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * PackageName : week13.김누리.programmers + * FileName : 후보키 + * Author : 김누리(NRKim) + * Date : 2025-07-23 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 23. 김누리(NRKim) Initial creation + */ + +/* +후보키 : 유일성과 최소성을 만족하는 키... + +유일성 : seq나 학번, 유저 고유 id 등 데이터마다 유일하게 가지고 있는 데이터 +최소성 : 유일성을 유지하며 추가적으로 인식하게 해 줄수 있는 데이터 + +데이터 구성 : +relation = { + {"학번","이름","전공","학년"}, + {"학번","이름","전공","학년"}, + {"학번","이름","전공","학년"}, + {"학번","이름","전공","학년"} +} + +set 이용해서 학번 관리 Set set = new HashSet<>(); + +set.add(relation[i][0]); >> 중복 없는 학번 취득 + +map {"100" = {"항목 1","항목 2"}} + +후보키 가능 조합 + +이름 + 전공, 이름 + 학년, 전공 + 학년, 이름 + 전공 + 학년 + +이름 + 전공 : 라이언 음악 / 어피치 수학/ 튜브 컴퓨터/ 콘 컴퓨터/ 무지 음악/ 어피치 음악 +이름 + 학년 : 라이언 2 / 어피치 2 / 튜브 3/ 콘 1/ 무지 3/ 어피치 2 >> 학번이 달라도 동일 학년에 동명 이인이 있어 판단 불가 +전공 + 학년 : 음악 2 / 수학 2/ 컴퓨터 3/ 컴퓨터 1/ 음악 3/ 음악 2 >> 학번이 있지만, 누군지 판단 불가 + 과목과 학년 조합으로 판단 불가 +이름 + 전공 + 학년 >> 최소성 만족 못함 + +그렇다면? nCm 형태의 조합 방식으로 ㄱ + +풀다가 많이 막혔음. nCm 형태의 조합 방식을 채택한건 좋지만, 이후 조합을 가지고 유일성, 최소성을 구현하는 부분에서 AI의 도움을 받음 + +*/ + +public class 후보키 { + List path; + List> combinations; + List> candidateKeys; + int row; + + public int solution(String[][] relation) { + int answer = 0; + int col = relation[0].length; // 컬럼 갯수 + row = relation.length; + + path = new ArrayList<>(); + combinations = new ArrayList<>(); // 조합 저장용 리스트 + candidateKeys = new ArrayList<>(); // 후보키용 리스트 + + // 모든 컬럼들을 가지고 만들 수 있는 모든 조합 생성 + for (int r = 1; r <= col; r++) { + combine(0, col, r); + } + + // 생성된 조합들의 유일성과 최소성 검사 + for (List c : combinations) { + if (isUnique(c,relation) && isMinimal(c)) { + candidateKeys.add(c); + answer++; + } + } + + return answer; + } + + // 키 조합 + public void combine(int start, int col, int r) { + // 각 컬럼을 r개 만큼 조합되면 재귀 종료 + if(path.size() == r) { + combinations.add(new ArrayList(path)); + return; + } + + for(int i = start; i < col; i++) { + path.add(i); + combine(i+1, col, r); + path.remove(path.size()-1); + } + } + + // 유일성 판정하기 위한 판정 + public boolean isUnique(List cols, String[][] relation) { + Set set = new HashSet<>(); + + for(int i = 0; i < row; i++) { + StringBuilder sb = new StringBuilder(); + + for(int c : cols) { + // 릴레이션의 각 투플들을 조합 + sb.append(relation[i][c]).append("|"); + } + set.add(sb.toString()); + } + + // 중복을 제거한 유일키들의 사이즈가 총 컬럼수와 같으면 true + return set.size() == row; + } + + // 최소성 만족하는지 판정 + public boolean isMinimal (List cols) { + for (List key : candidateKeys) { + // 컬럼에 키가 이미 존재하면 flase + if (cols.containsAll(key)) return false; + } + + return true; + } +} diff --git "a/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\225\352\262\200\353\213\244\353\246\254_\352\261\264\353\204\210\352\270\260.java" "b/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\225\352\262\200\353\213\244\353\246\254_\352\261\264\353\204\210\352\270\260.java" new file mode 100644 index 0000000..c6875d7 --- /dev/null +++ "b/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\225\352\262\200\353\213\244\353\246\254_\352\261\264\353\204\210\352\270\260.java" @@ -0,0 +1,51 @@ +/** + * PackageName : week13.이상억.progarmmers; + * FileName : 최댓값과_최솟값 + * Author : sangeok + * Date : 2025. 07. 24. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 24. sangeok Initial creation + */ + + +class Solution { + public int solution(int[] stones, int k) { + int left = 1; + int right = 200000000; // 최대값 + int answer = 0; + + while (left <= right) { + int mid = (left + right) / 2; + + if (canCross(stones, k, mid)) { + // mid명까지 건널 수 있음 → 더 많이 시도 + answer = mid; + left = mid + 1; + } else { + // 못 건너면 사람 수 줄이기 + right = mid - 1; + } + } + + return answer; + } + + // x명이 건널 수 있는가? -> 연속으로 0 이하가 k개 이상 나오면 false + private boolean canCross(int[] stones, int k, int x) { + int count = 0; + + for (int stone : stones) { + if (stone - x < 0) { + count++; + if (count >= k) return false; + } else { + count = 0; + } + } + + return true; + } +} diff --git "a/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" "b/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" new file mode 100644 index 0000000..00510a2 --- /dev/null +++ "b/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\353\214\223\352\260\222\352\263\274_\354\265\234\354\206\237\352\260\222.java" @@ -0,0 +1,31 @@ +/** + * PackageName : week13.이상억.progarmmers; + * FileName : 최댓값과_최솟값 + * Author : sangeok + * Date : 2025. 07. 22. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 22. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public String solution(String s) { + + int min = Integer.MAX_VALUE; + int max = Integer.MIN_VALUE; + + String[] split_s = s.split(" "); + for(String number : split_s){ + int n = Integer.parseInt(number); + min = Math.min(n,min); + max = Math.max(n,max); + } + + return min + " " + max; + } +} \ No newline at end of file diff --git "a/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\355\201\260_\354\210\230_\353\247\214\353\223\244\352\270\260.java" "b/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\355\201\260_\354\210\230_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..6c364cb --- /dev/null +++ "b/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\355\201\260_\354\210\230_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,46 @@ +/** + * PackageName : week13.이상억.progarmmers; + * FileName : 큰_수_만들기 + * Author : sangeok + * Date : 2025. 07. 24. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 24. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public String solution(String number, int k) { + Stack stack = new Stack<>(); + int len = number.length(); + + for (int i = 0; i < len; i++) { + char current = number.charAt(i); + + // 스택이 비어있지 않고, 제거 횟수가 남았고, 현재 숫자가 스택 top보다 클 때 pop + while (!stack.isEmpty() && k > 0 && stack.peek() < current) { + stack.pop(); + k--; + } + stack.push(current); + } + + // 아직 제거 안 한 수가 남은 경우 뒤에서 제거 + while (k > 0) { + stack.pop(); + k--; + } + + // 스택에 있는 문자를 StringBuilder로 연결 + StringBuilder sb = new StringBuilder(); + for (char c : stack) { + sb.append(c); + } + + return sb.toString(); + } +} diff --git "a/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\355\202\244\355\214\250\353\223\234_\353\210\204\353\245\264\352\270\260.java" "b/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\355\202\244\355\214\250\353\223\234_\353\210\204\353\245\264\352\270\260.java" new file mode 100644 index 0000000..a0f4682 --- /dev/null +++ "b/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\355\202\244\355\214\250\353\223\234_\353\210\204\353\245\264\352\270\260.java" @@ -0,0 +1,89 @@ +/** + * PackageName : week13.이상억.progarmmers; + * FileName : 키패드_누르기 + * Author : sangeok + * Date : 2025. 07. 22. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 22. sangeok Initial creation + */ + + +// 왼쪽 1,4,7 이면 left 3,6,9면 오른손, 2,5,8,0이면 더 가까운 엄지, 거리가 같다면 오른손은 오른손 엄지 왼손은 왼손 +// 1 2 3 +// 4 5 6 +// 7 8 9 +// * 0 # + +// 1 3 4 5 8 2 1 4 5 9 5 +// L R L L L R L L R R L + + +import java.util.*; + +class Solution { + public String solution(int[] numbers, String hand) { + StringBuilder answer = new StringBuilder(); + + // 고정 위치 + Map fixedHand = new HashMap<>(); + fixedHand.put(1, "L"); + fixedHand.put(4, "L"); + fixedHand.put(7, "L"); + fixedHand.put(3, "R"); + fixedHand.put(6, "R"); + fixedHand.put(9, "R"); + + // 초기 위치: 왼손은 *, 오른손은 # + int left = 10; // *를 10으로, 0은 11, #은 12로 정의 + int right = 12; + + for (int num : numbers) { + if (fixedHand.containsKey(num)) { + // 고정 위치 숫자 + String used = fixedHand.get(num); + answer.append(used); + if (used.equals("L")) left = num; + else right = num; + } else { + + int lDist = distance(left, num); + int rDist = distance(right, num); + + if (lDist < rDist) { + answer.append("L"); + left = num; + } else if (lDist > rDist) { + answer.append("R"); + right = num; + } else { + if (hand.equals("right")) { + answer.append("R"); + right = num; + } else { + answer.append("L"); + left = num; + } + } + } + } + + return answer.toString(); + } + + // 거리 계산 함수 + private int distance(int from, int to) { + + if (from == 0) from = 11; + if (to == 0) to = 11; + + int fromX = (from - 1) / 3; + int fromY = (from - 1) % 3; + int toX = (to - 1) / 3; + int toY = (to - 1) % 3; + + return Math.abs(fromX - toX) + Math.abs(fromY - toY); + } +} diff --git "a/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\355\233\204\353\263\264\355\202\244.java" "b/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\355\233\204\353\263\264\355\202\244.java" new file mode 100644 index 0000000..8032f48 --- /dev/null +++ "b/week13/\354\235\264\354\203\201\354\226\265/progarmmers/\355\233\204\353\263\264\355\202\244.java" @@ -0,0 +1,71 @@ +/** + * PackageName : week13.이상억.progarmmers; + * FileName : 후보키 + * Author : sangeok + * Date : 2025. 07. 24. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 24. sangeok Initial creation + */ + + +// 값을 hash로 등록해서 중복 되는지 확인 +// 백트래킹 이용해서 모든 조합 검사 + +import java.util.*; + +class Solution { + List> candidateKeys = new ArrayList<>(); + + public int solution(String[][] relation) { + int colSize = relation[0].length; + + // 1~colSize 길이의 조합 모두 확인 + for (int r = 1; r <= colSize; r++) { + combine(new HashSet<>(), 0, r, colSize, relation); + } + + return candidateKeys.size(); + } + + // 조합 생성 및 후보키 판별 + private void combine(Set current, int start, int r, int colSize, String[][] relation) { + if (current.size() == r) { + // 최소성 검사 + for (Set key : candidateKeys) { + if (current.containsAll(key)) return; // 최소성 위배 + } + + // 유일성 검사 + if (isUnique(current, relation)) { + candidateKeys.add(new HashSet<>(current)); // 후보키 등록 + } + return; + } + + for (int i = start; i < colSize; i++) { + current.add(i); + combine(current, i + 1, r, colSize, relation); + current.remove(i); + } + } + + // 유일성 검사 + private boolean isUnique(Set keySet, String[][] relation) { + Set seen = new HashSet<>(); + + for (String[] row : relation) { + StringBuilder key = new StringBuilder(); + for (int col : keySet) { + key.append(row[col]).append("|"); + } + if (!seen.add(key.toString())) { + return false; // 중복 있음 + } + } + + return true; // 모든 row가 유일 + } +} diff --git "a/week13_a/\352\260\225\354\204\261\354\232\261/programmers/\354\230\271\354\225\214\354\235\264_2.java" "b/week13_a/\352\260\225\354\204\261\354\232\261/programmers/\354\230\271\354\225\214\354\235\264_2.java" new file mode 100644 index 0000000..05e9548 --- /dev/null +++ "b/week13_a/\352\260\225\354\204\261\354\232\261/programmers/\354\230\271\354\225\214\354\235\264_2.java" @@ -0,0 +1,49 @@ +package week13_a.강성욱.programmers; + +/** + * PackageName : week13_a.강성욱.programmers + * FileName : 옹알이_2 + * Author : Baekgwa + * Date : 2025-07-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-25 Baekgwa Initial creation + */ +public class 옹알이_2 { + class Solution { + public int solution(String[] babbling) { + String[] canSpeak = new String[4]; + canSpeak[0] = "aya"; + canSpeak[1] = "ye"; + canSpeak[2] = "woo"; + canSpeak[3] = "ma"; + int result = 0; + + for(String word : babbling) { + String lastWord = ""; + + //StartWith 로 비교해가면서 그만큼 지우기. + //방금 지운건, 저장해놓고 다음에 연속된 발음 안되는거에 적용 + while(word.length() != 0) { + boolean speakCheckComplete = false; + for(int i=0; i<4; i++) { + if(word.startsWith(canSpeak[i]) && !canSpeak[i].equals(lastWord)) { + speakCheckComplete = true; + lastWord = canSpeak[i]; + word = word.substring(canSpeak[i].length()); + break; + } + } + + if(speakCheckComplete == false) break; //4가지 옹알이 유형중 하나라도 해당하지 않으면 while 문 나가기 + } + + if(word.length() == 0) result++; + } + + return result; + } + } +} diff --git "a/week13_a/\352\260\225\354\204\261\354\232\261/programmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" "b/week13_a/\352\260\225\354\204\261\354\232\261/programmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..2176978 --- /dev/null +++ "b/week13_a/\352\260\225\354\204\261\354\232\261/programmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" @@ -0,0 +1,36 @@ +package week13_a.강성욱.programmers; + +import java.util.ArrayDeque; +import java.util.Deque; + +/** + * PackageName : week13_a.강성욱.programmers + * FileName : 짝지어_제거하기 + * Author : Baekgwa + * Date : 2025-07-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-25 Baekgwa Initial creation + */ +public class 짝지어_제거하기 { + class Solution + { + public int solution(String s) + { + Deque deque = new ArrayDeque<>(); + + for(int i=0; i stk = new Stack<>(); + + for(String t : tmp) { + if(stk.isEmpty() || !stk.peek().equals(t)) stk.push(t); + else stk.pop(); + } + + return answer = stk.isEmpty() ? 1 : 0; + } +} diff --git "a/week13_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\271\354\225\214\354\235\264(2).java" "b/week13_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\271\354\225\214\354\235\264(2).java" new file mode 100644 index 0000000..0a82a02 --- /dev/null +++ "b/week13_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\271\354\225\214\354\235\264(2).java" @@ -0,0 +1,29 @@ +// aya,ye,woo,ma 밖에 발음 못함 +// 연속 발음 x + +import java.util.*; + +class Solution { + public int solution(String[] babbling) { + int answer = 0; + + String[] speak = {"aya","ye","woo","ma"}; + + for(String word : babbling){ + String tmp = word; + + for(String w : speak){ // 연속발음 안됨 + tmp = tmp.replace(w + w, "#"); + } + + for(String w : speak) { // 문자열 빈칸 + tmp = tmp.replace(w," "); + } + + if(tmp.trim().isEmpty()){ + answer ++; + } + } + return answer; + } +} \ No newline at end of file diff --git "a/week13_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" "b/week13_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..9f394c0 --- /dev/null +++ "b/week13_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" @@ -0,0 +1,23 @@ +// 같은 알파벳 2개 붙어 있는 짝 제거 앞 뒤로 문자열 이어 붙임 +// 반복 + +import java.util.*; + + +class Solution +{ + public int solution(String s) + { + Stack stack = new Stack<>(); + + for(char a : s.toCharArray()){ + if(!stack.isEmpty() && stack.peek() == a){ + stack.pop(); + } else{ + stack.push(a); + } + } + + return stack.isEmpty() ? 1 : 0 ; + } +} \ No newline at end of file diff --git "a/week14/\352\260\225\354\204\261\354\232\261/programmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" "b/week14/\352\260\225\354\204\261\354\232\261/programmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..8a5e977 --- /dev/null +++ "b/week14/\352\260\225\354\204\261\354\232\261/programmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,51 @@ +package week14.강성욱.programmers; + +/** + * PackageName : week14.강성욱.programmers + * FileName : JadenCase_문자열_만들기 + * Author : Baekgwa + * Date : 2025-07-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-28 Baekgwa Initial creation + */ +public class JadenCase_문자열_만들기 { + //범위가 좁기 떄문에, 최적화는 신경쓰지 않아도 될듯 + + class Solution { + // public String solution(String s) { + // //쪼개고 + // StringBuilder sb = new StringBuilder(); + // String[] sArray = s.split(" "); + // for(String sWord : sArray) { + // //첫번째, upperCase 로 올리기 + // //숫자는 무시되려나? 일딴 해보자 + // String[] sWordArray = sWord.split(""); + // sWordArray[0] = sWordArray[0].toUpperCase(); + + // for(String word : sWordArray) sb.append(word); + // sb.append(" "); + // } + + // return sb.toString().trim(); + // } + + //아 공백이 여러번 나올 수 있네...? + public String solution(String s) { + StringBuilder result = new StringBuilder(); + boolean isFirst = true; + + for(char sChar : s.toCharArray()) { + if(isFirst) result.append(Character.toUpperCase(sChar)); + else result.append(Character.toLowerCase(sChar)); + + if(sChar == ' ') isFirst = true; + else isFirst = false; + } + + return result.toString(); + } + } +} diff --git "a/week14/\352\260\225\354\204\261\354\232\261/programmers/\353\202\230\353\235\274\354\235\230_\354\210\253\354\236\220_124.java" "b/week14/\352\260\225\354\204\261\354\232\261/programmers/\353\202\230\353\235\274\354\235\230_\354\210\253\354\236\220_124.java" new file mode 100644 index 0000000..c5fc0c2 --- /dev/null +++ "b/week14/\352\260\225\354\204\261\354\232\261/programmers/\353\202\230\353\235\274\354\235\230_\354\210\253\354\236\220_124.java" @@ -0,0 +1,38 @@ +package week14.강성욱.programmers; + +/** + * PackageName : week14.강성욱.programmers + * FileName : 나라의_숫자_124 + * Author : Baekgwa + * Date : 2025-07-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-28 Baekgwa Initial creation + */ +public class 나라의_숫자_124 { + // 124진법? 새로만든 진법을 10->124진법으로 변경해야됨. + // 사실상 4진법인데, 3을 4로만 바꾸면 되는거 아닌가? + // toString(n, 4) 하고 + // replace 하기 + // 는, 4부터 안되네. 사실 4진법은, 0,1,2,3 을 쓰는구나. 그럼 안되겠네. + // 사실 3개씩 반복되는거니 계산으로 처리? + // 1 % 3 == 1 + + // 이거 진짜 이해 안되서 GPT 도움 좀 많이 받음..ㅠ + + public class Solution { + public String solution(int n) { + String[] nums = {"4", "1", "2"}; + StringBuilder sb = new StringBuilder(); + + while (n > 0) { + sb.append(nums[n % 3]); + n = (n - 1) / 3; + } + + return sb.reverse().toString(); + } + } +} diff --git "a/week14/\352\260\225\354\204\261\354\232\261/programmers/\354\202\274\352\260\201\353\213\254\355\214\275\354\235\264.java" "b/week14/\352\260\225\354\204\261\354\232\261/programmers/\354\202\274\352\260\201\353\213\254\355\214\275\354\235\264.java" new file mode 100644 index 0000000..03aec50 --- /dev/null +++ "b/week14/\352\260\225\354\204\261\354\232\261/programmers/\354\202\274\352\260\201\353\213\254\355\214\275\354\235\264.java" @@ -0,0 +1,67 @@ +package week14.강성욱.programmers; + +/** + * PackageName : week14.강성욱.programmers + * FileName : 삼각달팽이 + * Author : Baekgwa + * Date : 2025-07-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-28 Baekgwa Initial creation + */ +public class 삼각달팽이 { + //처음 시작할때, n만큼 채우고 + //n-1 만큼 넣고 .... 1만큼 채워 넣고 끝임. + //이번 반복이 n 일때는, 왼쪽 대각 아래로. (array[y][x] 에서 y만 ++) + //이번 반복이 n-1 일때는, 오른쪽으로. (array[y][x] 에서, x++) + //이번 반복이 n-2 일때는, 왼쪽 대각 위로. (array[y][x] 에서, x--, y--) + //아 n-1 이 아니라, %로 계산해야되네. + // n%3 == 0, 이런식 + // 는 이렇게 하면 안됨. 3방향을 돌아가면서 해야하고, 맨첨에는 왼쪽아래부터 가야함. + //하면서 좌표 넣으면 될듯? + //사이즈는 몇짜리 2차원 배열로 해야하나? 는 n곱하기 n으로 하면 되겟네 + + class Solution { + public int[] solution(int n) { + int[][] map = new int[n+1][n+1]; + int x = 0, y = -1; + int nowStep = n; + int cnt = 1; + int dir = 0; + while(nowStep != 0) { + for(int i=0; i 0) { + nowServerCount -= timeToCleanUp[time]; + } + + //필요한 서버 개수 확인 + int needServerCnt = needServerCount(players[time], m); + int needToScaleOutCount = needServerCnt - nowServerCount; + if(needServerCnt <= nowServerCount) continue; + + //여기부턴 서버 증설 + scaleOutCount += needToScaleOutCount; + nowServerCount += needToScaleOutCount; + timeToCleanUp[time + k] = needToScaleOutCount; + } + + return scaleOutCount; + } + + // 필요 서버 개수 확인 + private int needServerCount(int playerCount, int m) { + if(playerCount < m) return 0; + return playerCount / m; + } + } +} diff --git "a/week14/\352\260\225\354\204\261\354\232\261/programmers/\354\204\261\352\262\251\354\234\240\355\230\225\352\262\200\354\202\254.java" "b/week14/\352\260\225\354\204\261\354\232\261/programmers/\354\204\261\352\262\251\354\234\240\355\230\225\352\262\200\354\202\254.java" new file mode 100644 index 0000000..657474b --- /dev/null +++ "b/week14/\352\260\225\354\204\261\354\232\261/programmers/\354\204\261\352\262\251\354\234\240\355\230\225\352\262\200\354\202\254.java" @@ -0,0 +1,47 @@ +package week14.강성욱.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week14.강성욱.programmers + * FileName : 성격유형검사 + * Author : Baekgwa + * Date : 2025-07-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-28 Baekgwa Initial creation + */ +public class 성격유형검사 { + + class Solution { + public static final int[] pointArray = new int[]{0, 3, 2, 1, 0, 1, 2, 3}; //인덱스 값 기준, 점수 확인 + public String solution(String[] survey, int[] choices) { + Map map = new HashMap<>(); + //각 유형별 점수 모음 + map.put("R", 0); map.put("T", 0); map.put("C", 0); map.put("F", 0); + map.put("J", 0); map.put("M", 0); map.put("A", 0); map.put("N", 0); + + //survey + choices 로 유형별 점수 계산 + for(int i=0; i= 5) map.put(positive, map.get(positive) + point); + } + + //유형별 점수 계산하기 + StringBuilder sb = new StringBuilder(); + sb.append(map.get("R") >= map.get("T") ? "R" : "T"); + sb.append(map.get("C") >= map.get("F") ? "C" : "F"); + sb.append(map.get("J") >= map.get("M") ? "J" : "M"); + sb.append(map.get("A") >= map.get("N") ? "A" : "N"); + + return sb.toString(); + } + } +} diff --git "a/week14/\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/week14/\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..c2605fe --- /dev/null +++ "b/week14/\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,105 @@ +package week14.강성욱.programmers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * PackageName : week14.강성욱.programmers + * FileName : 수식_최대화 + * Author : Baekgwa + * Date : 2025-07-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-28 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); + // } + // } + // } + + // 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/week14/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\353\214\200\352\263\265\353\260\260\354\210\230.java" "b/week14/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\353\214\200\352\263\265\353\260\260\354\210\230.java" new file mode 100644 index 0000000..1e6399c --- /dev/null +++ "b/week14/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\353\214\200\352\263\265\353\260\260\354\210\230.java" @@ -0,0 +1,32 @@ +package week14.강성욱.programmers; + +/** + * PackageName : week14.강성욱.programmers + * FileName : 최대공약수와_최대공배수 + * Author : Baekgwa + * Date : 2025-07-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-28 Baekgwa Initial creation + */ +public class 최대공약수와_최대공배수 { + class Solution { + public int[] solution(int n, int m) { + int[] result = new int[2]; + + result[0] = calMin(n, m); //최대공약수 + result[1] = (n * m) / result[0]; + + return result; + } + + // 유클리드 호제법 + // GCD(a, b) = GCD(b, a % b) + private int calMin(int n, int m) { + if (m == 0) return n; + return calMin(m, n % m); + } + } +} diff --git "a/week14/\352\260\225\354\204\261\354\232\261/programmers/\355\205\214\354\235\264\353\270\224_\355\225\264\354\213\234_\355\225\250\354\210\230.java" "b/week14/\352\260\225\354\204\261\354\232\261/programmers/\355\205\214\354\235\264\353\270\224_\355\225\264\354\213\234_\355\225\250\354\210\230.java" new file mode 100644 index 0000000..dc32eac --- /dev/null +++ "b/week14/\352\260\225\354\204\261\354\232\261/programmers/\355\205\214\354\235\264\353\270\224_\355\225\264\354\213\234_\355\225\250\354\210\230.java" @@ -0,0 +1,46 @@ +package week14.강성욱.programmers; + +import java.util.Arrays; + +/** + * PackageName : week14.강성욱.programmers + * FileName : 테이블_해시_함수 + * Author : Baekgwa + * Date : 2025-07-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-07-28 Baekgwa Initial creation + */ +public class 테이블_해시_함수 { + + class Solution { + public int solution(int[][] data, int col, int row_begin, int row_end) { + + //col 값 기준으로 data 정렬하기 + Arrays.sort(data, (a, b) -> { + //같으면 키 기준 내림차순 + //그리고 col-1 이 인덱스임 + if(a[col-1] == b[col-1]) { + return Integer.compare(b[0], a[0]); + } + //다르면 col-1 인덱스값 기준 오름차순 + return Integer.compare(a[col-1], b[col-1]); + }); + + //row_begin 부터 S_i 연산해서 누적 + //아 row 값도 -1 처리해야되네 + int result = 0; + for(int i = row_begin; i <= row_end; i++) { + int sIResult = 0; + for(int now : data[i-1]) { + sIResult += now % i; + } + result ^= sIResult; + } + + return result; + } + } +} diff --git "a/week14/\352\271\200\353\202\230\354\235\200/programmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" "b/week14/\352\271\200\353\202\230\354\235\200/programmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..6466d33 --- /dev/null +++ "b/week14/\352\271\200\353\202\230\354\235\200/programmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,28 @@ +package week14.김나은.programmers; + +public class JadenCase_문자열_만들기 { + + class Solution { + + public String solution(String s) { + StringBuilder sb = new StringBuilder(); // 결과 문자열을 저장할 StringBuilder + boolean isFirstChar = true; // 단어의 첫 문자인지 여부 체크 + + // 입력 문자열을 한 글자씩 순회 + for (char c : s.toCharArray()) { + if (c == ' ') { // 공백 문자인 경우 + sb.append(c); // 그대로 결과에 추가 + isFirstChar = true; // 다음 문자를 단어의 첫 문자로 처리 + } else { + if (isFirstChar) { // 단어의 첫 문자라면 + sb.append(Character.toUpperCase(c)); // 대문자로 변환 후 추가 + isFirstChar = false; // 첫 문자가 아니게 상태 변경 + } else { + sb.append(Character.toLowerCase(c)); // 단어의 첫 문자가 아니면 소문자로 변환 후 추가 + } + } + } + return sb.toString(); // 결과 문자열 반환 + } + } +} \ No newline at end of file diff --git "a/week14/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" "b/week14/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" new file mode 100644 index 0000000..abc91dd --- /dev/null +++ "b/week14/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" @@ -0,0 +1,29 @@ +package week14.김나은.programmers; + +public class 최대공약수와_최소공배수 { + + class Solution { + + public int[] solution(int n, int m) { + + // a는 더 큰 수, b는 더 작은 수로 초기화 + int a = Math.max(n, m); + int b = Math.min(n, m); + + // 유클리드 호제법으로 최대공약수(GCD) 구함 + while (b > 0) { + int temp = a % b; // a를 b로 나눈 나머지 + a = b; // b를 a에 대입 + b = temp; // 나머지를 b에 대입 (반복) + } + + int gcd = a; // 반복문 끝나면 a가 최대공약수 + + // 최소공배수(LCM)는 두 수의 곱을 최대공약수로 나눈 것 + int lcm = n * m / gcd; + + // 결과를 배열에 담아 리턴 (0: 최대공약수, 1: 최소공배수) + return new int[]{gcd, lcm}; + } + } +} \ No newline at end of file diff --git "a/week14/\352\271\200\353\210\204\353\246\254/programmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" "b/week14/\352\271\200\353\210\204\353\246\254/programmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..da1f16d --- /dev/null +++ "b/week14/\352\271\200\353\210\204\353\246\254/programmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,43 @@ +package week14.김누리.programmers; + +/** + * PackageName : week14.김누리.programmers + * FileName : JadenCase_문자열_만들기 + * Author : 김누리(NRKim) + * Date : 2025-07-27 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 27. 김누리(NRKim) Initial creation + */ + +public class JadenCase_문자열_만들기 { + public String solution(String s) { + String answer = ""; + int idx = s.length(); + char []tmp = new char[idx]; + + for(int i = 0 ; i < s.length(); i++) { + char t = s.charAt(i); + + if (i == 0) { + if(Character.isAlphabetic(t)) { + t = Character.toUpperCase(t); + } + } else if (tmp[i-1] == ' ') { + t = Character.toUpperCase(t); + } else if (Character.isUpperCase(t)) { + t = Character.toLowerCase(t); + } + tmp[i] = t; + System.out.print(tmp[i]); + } + + for (int i = 0; i < tmp.length; i++) { + answer += tmp[i]; + } + + return answer; + } +} diff --git "a/week14/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\240\234_124_\353\202\230\353\235\274\354\235\230_\354\210\253\354\236\220.java" "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\240\234_124_\353\202\230\353\235\274\354\235\230_\354\210\253\354\236\220.java" new file mode 100644 index 0000000..0e10319 --- /dev/null +++ "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\240\234_124_\353\202\230\353\235\274\354\235\230_\354\210\253\354\236\220.java" @@ -0,0 +1,48 @@ +package week14.김누리.programmers; + +/** + * PackageName : week14.김누리.programmers + * FileName : 문제_124_나라의_숫자 + * Author : 김누리(NRKim) + * Date : 2025-07-26 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 26. 김누리(NRKim) Initial creation + */ + +/* +10 진법 124 나라 + 1 1 + 2 2 + 3 4 + 4 11 --> 1 + 1 + 5 12 --> 1 + 2 + 6 14 --> 1 + 4 + 7 21 --> 2 + 1 + + 규칙은 보임. + + 그러면 저 규칙대로 반복문 돌려가면서 문자를 만들면 됨 ㅇㅇ + +*/ + + +public class 문제_124_나라의_숫자 { + public String solution(int n) { + int[] nums = {1,2,4}; // 1,2,4 로 구성할 값 + StringBuilder sb = new StringBuilder(); + String answer = ""; + + while(n > 0) { + n--; // n값 -1 + sb.insert(0,nums[n%3]); // 맨 앞 자리에 nums[0],nums[1],nums[2] 순번으로 적재 + n /= 3; // n값 / 3 + } + + answer = sb.toString(); + + return answer; + } +} diff --git "a/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\202\274\352\260\201_\353\213\254\355\214\275\354\235\264.java" "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\202\274\352\260\201_\353\213\254\355\214\275\354\235\264.java" new file mode 100644 index 0000000..29abac9 --- /dev/null +++ "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\202\274\352\260\201_\353\213\254\355\214\275\354\235\264.java" @@ -0,0 +1,77 @@ +package week14.김누리.programmers; + +/** + * PackageName : week14.김누리.programmers + * FileName : 삼각_달팽이 + * Author : 김누리(NRKim) + * Date : 2025-07-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 29. 김누리(NRKim) Initial creation + */ + + +/* + +n = 4이라 가정 + +1. 아래로 내려가면서 1에서 부터 ++ (4까지 내려감) +2. 바닥을 찍으면 오른쪽으로 1.에서 만든 숫자를 ++ (4 ~ 7) +3. 맨 우측 갔으면 다시 위로 + +*/ + +public class 삼각_달팽이 { + public int[] solution(int n) { + int[] answer = new int [((n*(n+1))/2)]; + int[][] arr = new int [n][n]; // 삼각형 저장 배열 + + int num = 1; // 시작 숫자 + int r = -1, c = 0; // 시작 위치 + int size = n; // 남은 위치 + + while (size > 0) { + // 아래로 이동 + for(int i = 0; i < size; i++) { + r++; + arr[r][c] = num++; + } + + // 이동 후 남은 위치 조정 + size--; + + if(size == 0) break; + + // 오른쪽 + for(int i = 0; i < size; i++) { + c++; + arr[r][c] = num++; + } + + size--; + + if(size == 0) break; + + // 대각선 위로 + for(int i = 0; i < size; i++) { + r--; + c--; + arr[r][c] = num++; + } + + size--; + } + + int idx = 0; + + for(int[] a : arr) { + for(int b : a) { + if(b != 0) answer[idx++] = b; + } + } + + return answer; + } +} diff --git "a/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\204\234\353\262\204_\354\246\235\354\204\244_\355\232\237\354\210\230.java" "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\204\234\353\262\204_\354\246\235\354\204\244_\355\232\237\354\210\230.java" new file mode 100644 index 0000000..bd977f4 --- /dev/null +++ "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\204\234\353\262\204_\354\246\235\354\204\244_\355\232\237\354\210\230.java" @@ -0,0 +1,55 @@ +package week14.김누리.programmers; + +import java.util.PriorityQueue; +import java.util.Queue; + +/** + * PackageName : week14.김누리.programmers + * FileName : 서버_증설_횟수 + * Author : 김누리(NRKim) + * Date : 2025-07-30 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 30. 김누리(NRKim) Initial creation + */ + +public class 서버_증설_횟수 { + public int solution(int[] players, int m, int k) { + // 증설 서버 관리 + Queue q = new PriorityQueue<>((o1,o2) -> o1[0] - o2[0]); + + // 증설된 서버 수 + int size = 0; + + // 증설 횟수 + int cnt = 0; + + + // 24시간 동안 반복 + for(int i = 0; i < players.length; i++) { + + // 증설 종료 시간이 현재 시간과 같으면 큐 poll(); + while(!q.isEmpty() && q.peek()[0] == i) { + size -= q.poll()[1]; + } + + // 증설 필요 조건 = (n+1) * m + int need = players[i]/m; + + // 현재 증설된 서버 - 필요 서버 ==> 추가 증설해야 하는 서버 + int more = size - need; + + // 증설할 필요 없을 경우 + if (more < 0) { + more =- more; + size += more; + cnt += more; + q.add(new int[] {i+k, more}); + } + } + + return cnt; + } +} diff --git "a/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\204\261\352\262\251_\354\234\240\355\230\225_\352\262\200\354\202\254\355\225\230\352\270\260.java" "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\204\261\352\262\251_\354\234\240\355\230\225_\352\262\200\354\202\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..fe18c26 --- /dev/null +++ "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\204\261\352\262\251_\354\234\240\355\230\225_\352\262\200\354\202\254\355\225\230\352\270\260.java" @@ -0,0 +1,122 @@ +package week14.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week14.김누리.programmers + * FileName : 성격_유형_검사하기 + * Author : 김누리(NRKim) + * Date : 2025-07-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 29. 김누리(NRKim) Initial creation + */ + +/* +survey = 선택지 +예 = ["AN", "CF", "MJ", "RT", "NA"] + +choices = 점수 (1 ~ 7 까지, 매우 비동의 ~ 매우 동의) +예 = [5,3,2,7,5] + +arr1 = {R,T,C,F,J,M,A,N}; + +map1 = { + R = 0, + T = 0, + C = 0, + F = 0, + J = 0, + M = 0, + A = 0, + N = 0, +} +map2 = { + 1 = 3 + 2 = 2 + 3 = 1 + 4 = 0 + 5 = 1 + 6 = 2 + 7 = 3 +} + +예 survey[0] = AN ==> A : 비동의 N : 동의 +choices[0] => 5 ==> 긍정, 5(약간 동의) 이므로 N + 1 +choices[1] => 3 ==> 부정, 3(약간 부정) 이므로 C + 1 +choices[2] => 2 ==> 부정, 2(비동의) 이므로 M + 2 +choices[3] => 7 ==> 긍정, 7(매우 동의) 이므로 T + 3 +choices[4] => 5 ==> 긍정, 5(약간 동의) 이므로 A + 1 + +map1 = { + R = 0, + T = 3, + C = 1, + F = 0, + J = 0, + M = 2, + A = 1, + N = 1, +} + +순번대로 +Rpoint vs Tpoint => T가 우세 +Cpoint vs Fpoint => C가 우세 +Jpoint vs Mpoint => M가 우세 +Apoint vs Npoint => A와 N이 동점 ==> 사전순번에 따라 A를 선택 + + +*/ + +public class 성격_유형_검사하기 { + public String solution(String[] survey, int[] choices) { + String answer = ""; + + // 선택지 배열 사전 + String[] selection = {"R","T","C","F","J","M","A","N"}; + + // 성격 체크용 배열 사전 + String[][] check = {{"R","T"},{"C","F"},{"J","M"},{"A","N"}}; + + // 득점용 계산 배열 idx = 0인 경우 0으로 해서 자리수 맞춤 + int[] point = {0, 3, 2, 1, 0, 1, 2, 3}; + + // 각 선택지당 포인트 계산용 배열 + Map map = new HashMap<>(); + + // 유형별 획득 점수 초기화 + for(String c : selection) { + map.put(c,0); + } + + // 득점 계산 + for(int i = 0; i < survey.length; i++) { + String[] tmp = survey[i].split(""); + int p = choices[i]; + + if(p<= 3) { + map.put(tmp[0],map.getOrDefault(tmp[0],0)+point[p]); + } + + if(p >= 5) { + map.put(tmp[1],map.getOrDefault(tmp[1],0)+point[p]); + } + } + + StringBuilder sb = new StringBuilder(); + + // 성격 유형 조합 + for(String[] c : check) { + if(map.get(c[0]) > map.get(c[1])) sb.append(c[0]); + else if(map.get(c[0]) < map.get(c[1])) sb.append(c[1]); + else sb.append(c[0]); + } + + answer = sb.toString(); + + return answer; + } +} diff --git "a/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\210\230\354\213\235_\354\265\234\353\214\200\355\231\224.java" "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\210\230\354\213\235_\354\265\234\353\214\200\355\231\224.java" new file mode 100644 index 0000000..47069aa --- /dev/null +++ "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\210\230\354\213\235_\354\265\234\353\214\200\355\231\224.java" @@ -0,0 +1,118 @@ +package week14.김누리.programmers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * PackageName : week14.김누리.programmers + * FileName : 수식_최대화 + * Author : 김누리(NRKim) + * Date : 2025-07-31 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 31. 김누리(NRKim) Initial creation + */ + +/* + +expression을 분리 + +숫자 리스트, 연산자 리스트 만들어서 각각 적재 + +이후 연산자 조합에 따라 계산 진행. + +추후 성욱님 소스 참조를 많이했기 때문에 재풀이 필요함. + +*/ + +public class 수식_최대화 { + + public long solution(String expression) { + long answer = 0; + // 표현식 나누기 + String[] exp = expression.split(""); + + // 각각 숫자와 연산자들이 들어갈 리스트 + List nums = new ArrayList<>(); + List opt = new ArrayList<>(); + + // 숫자 이어붙이기 용 sb + StringBuilder sb = new StringBuilder(); + + // 연산자 > 연산자 리스트로, 숫자? 숫자 리스트로 + for(String s : exp) { + if ( s.equals("+") || s.equals("-") || s.equals("*") ) { + nums.add(Long.parseLong(sb.toString())); // 숫자 이어붙인 것들을 숫자 리스트에 저장 + sb = new StringBuilder(); // sb 초기화 + opt.add(s); // 연산자 추가 + } else { + sb.append(s); + } + } + + // 마지막 숫자 입력 + nums.add(Long.parseLong(sb.toString())); + + // 조합을 노가다로 (성욱님꺼 참조함) + List> order = Arrays.asList( + Arrays.asList("+", "-", "*"), + Arrays.asList("+", "*", "-"), + Arrays.asList("*", "+", "-"), + Arrays.asList("*", "-", "+"), + Arrays.asList("-", "+", "*"), + Arrays.asList("-", "*", "+") + ); + + + for(List orderList : order) { + // 최종 연산 + answer = Math.max(answer,Math.abs(calc(orderList, new ArrayList<>(nums), new ArrayList<>(opt)))); + } + + return answer; + } + + public long calc(List order, List nums, List opt) { + // 연산자 리스트 만큼 순회 + for(String o : order) { + + // 연산자 리스트에 대상 연산자가 있는 경우 + while(opt.contains(o)) { + for(int i = 0; i < opt.size(); i++) { + if(opt.get(i).equals(o)) { + // a (연산자) b 에서 a와 b를 추출하는 과정 + long left = nums.remove(i); + long right = nums.remove(i); + + // 추출한 숫자들, 연산자를 통해 계산 진행 + long newAnswer = calResult(left,right,o); + nums.add(i,newAnswer); + opt.remove(i); + break; + } + } + } + } + + return nums.get(0); + } + + public long calResult(long left, long right, String o) { + switch(o) { + case "+" : + return left + right; + + case "-" : + return left - right; + + case "*" : + return left * right; + } + + return 0; + } + +} diff --git "a/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" new file mode 100644 index 0000000..e0b9f59 --- /dev/null +++ "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" @@ -0,0 +1,32 @@ +package week14.김누리.programmers; + +/** + * PackageName : week14.김누리.programmers + * FileName : 최대공약수와_최소공배수 + * Author : 김누리(NRKim) + * Date : 2025-07-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 28. 김누리(NRKim) Initial creation + */ + +/* + +공약수랑 공배수의 경우 이전에 풀이했던 유클리드 호제법 이용 + +*/ + +public class 최대공약수와_최소공배수 { + public int[] solution(int n, int m) { + int gcd = gcd(n,m); + + return new int[] { gcd, (n*m) / gcd }; + } + + public int gcd(int n, int m) { + // b값이 0이면 a 값만 반환 + return m == 0 ? n : gcd(m, n % m); + } +} diff --git "a/week14/\352\271\200\353\210\204\353\246\254/programmers/\355\205\214\354\235\264\353\270\224_\355\225\264\354\213\234_\355\225\250\354\210\230.java" "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\355\205\214\354\235\264\353\270\224_\355\225\264\354\213\234_\355\225\250\354\210\230.java" new file mode 100644 index 0000000..8e36002 --- /dev/null +++ "b/week14/\352\271\200\353\210\204\353\246\254/programmers/\355\205\214\354\235\264\353\270\224_\355\225\264\354\213\234_\355\225\250\354\210\230.java" @@ -0,0 +1,73 @@ +package week14.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week14.김누리.programmers + * FileName : 테이블_해시_함수 + * Author : 김누리(NRKim) + * Date : 2025-07-27 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 27. 김누리(NRKim) Initial creation + */ + + +/* +col = 기본키 +row_begin = 행의 시작값 +row_end = 행의 끝값 + +col = 2 +row_begin = 2 +row_end = 3 + +data = [[2,2,6],[1,5,10],[4,2,9],[3,8,3]] + +col = 2 를 기준으로 asc , order by row_begin asc, col desc +[2,2,6] 이랑 [4,2,9] ==> row_begin은 동일, 그러나 col이 [4,2,9]가 우선순위이기 때문에 + +정렬하면 +[[4,2,9],[2,2,6],[1,5,10],[3,8,3]] + +S_i (여기서 i : row_begin or row_end) + + +*/ + + +public class 테이블_해시_함수 { + public int solution(int[][] data, int col, int row_begin, int row_end) { + int answer = 0; + + // row_begin 기준 asc, col 기준으로는 desc + Arrays.sort(data, (a,b) ->{ + if(a[col - 1] == b[col - 1]) return b[0] - a[0]; + + return a[col - 1] - b[col - 1]; + }); + + // row_begin ~ row_end 까지 반복 + for(int i = row_begin; i <= row_end; i++) { + + // array의 idx는 0에서 부터 + int[] r = data[i-1]; + + // S_i + int s_i = 0; + + for(int a : r) { + + // (2 mod 2) + (2 mod 2) + (6 mod 2) 처리 + s_i += a % i; + } + + // XOR 연산 + answer ^= s_i; + } + + return answer; + } +} diff --git "a/week14/\354\235\264\354\203\201\354\226\265/progarmmers/124_\353\202\230\353\235\274\354\235\230_\354\210\253\354\236\220.java" "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/124_\353\202\230\353\235\274\354\235\230_\354\210\253\354\236\220.java" new file mode 100644 index 0000000..7dd9ea7 --- /dev/null +++ "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/124_\353\202\230\353\235\274\354\235\230_\354\210\253\354\236\220.java" @@ -0,0 +1,31 @@ +/** + * PackageName : week14.이상억.progarmmers; + * FileName : 124_나라의_숫자 + * Author : sangeok + * Date : 2025. 07. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 30. sangeok Initial creation + */ + + +// 진법의 관점으로 접근하면 안될 것 같음 + + + +class Solution { + public String solution(int n) { + String[] nums = {"4", "1", "2"}; // 나머지가 0, 1, 2일 때 대응값 + StringBuilder sb = new StringBuilder(); + + while (n > 0) { + int r = n % 3; + n = (n - 1) / 3; + sb.insert(0, nums[r]); + } + + return sb.toString(); + } +} diff --git "a/week14/\354\235\264\354\203\201\354\226\265/progarmmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..846f0a9 --- /dev/null +++ "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/JadenCase_\353\254\270\354\236\220\354\227\264_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,36 @@ +/** + * PackageName : week14.이상억.progarmmers; + * FileName : JadenCase_문자열_만들기 + * Author : sangeok + * Date : 2025. 07. 28. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 28. sangeok Initial creation + */ + +// 처음에 문제에서 주는 방식으로 split 사용하려다 공백 처리에 대해 번거로움을 느껴서 아래와 같은 방식으로 풀음 + +class Solution { + public String solution(String s) { + StringBuilder sb = new StringBuilder(); + boolean start = true; + + for (char c : s.toCharArray()) { + if (c == ' ') { + sb.append(c); + start = true; + } else { + if (start) { + sb.append(Character.toUpperCase(c)); + } else { + sb.append(Character.toLowerCase(c)); + } + start = false; + } + } + + return sb.toString(); + } +} diff --git "a/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\354\202\274\352\260\201_\353\213\254\355\214\275\354\235\264.java" "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\354\202\274\352\260\201_\353\213\254\355\214\275\354\235\264.java" new file mode 100644 index 0000000..60f50c2 --- /dev/null +++ "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\354\202\274\352\260\201_\353\213\254\355\214\275\354\235\264.java" @@ -0,0 +1,55 @@ +/** + * PackageName : week14.이상억.progarmmers; + * FileName : 삼각_달팽이 + * Author : sangeok + * Date : 2025. 07. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 30. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int[] solution(int n) { + int[][] arr = new int[n][n]; // 정삼각형처럼 쓸 2차원 배열 + int[] dx = {1, 0, -1}; // 아래 → 오른쪽 → 왼대각선 위 + int[] dy = {0, 1, -1}; + + int x = 0, y = 0, dir = 0; + int num = 1; + int max = n * (n + 1) / 2; + + for (int i = 0; i < max; i++) { + arr[x][y] = num++; + int nx = x + dx[dir]; + int ny = y + dy[dir]; + + // 경계 조건 또는 이미 채워진 칸이면 방향 전환 + if (nx >= n || ny >= n || nx < 0 || ny < 0 || arr[nx][ny] != 0) { + dir = (dir + 1) % 3; + nx = x + dx[dir]; + ny = y + dy[dir]; + } + + x = nx; + y = ny; + } + + List list = new ArrayList<>(); + for (int i = 0; i < n; i++) { + for (int j = 0; j <= i; j++) { + list.add(arr[i][j]); + } + } + + int[] answer = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + answer[i] = list.get(i); + } + + return answer; + } +} diff --git "a/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\354\204\234\353\262\204_\354\246\235\354\204\244_\355\232\237\354\210\230.java" "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\354\204\234\353\262\204_\354\246\235\354\204\244_\355\232\237\354\210\230.java" new file mode 100644 index 0000000..495aa12 --- /dev/null +++ "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\354\204\234\353\262\204_\354\246\235\354\204\244_\355\232\237\354\210\230.java" @@ -0,0 +1,42 @@ +/** + * PackageName : week14.이상억.progarmmers; + * FileName : 서버_증설_횟수 + * Author : sangeok + * Date : 2025. 07. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 30. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int solution(int[] players, int m, int k) { + + // 만료 시간이 가장 빠른 순으로 서버 정보를 저장하는 우선순위 큐 + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1[0] - o2[0]); + + int size = 0; // 현재 사용 가능한(만료되지 않은) 서버의 수 + int count = 0; // 전체 서버 증설 횟수 누적 + + for (int i = 0; i < 24; i++) { + + while (!pq.isEmpty() && pq.peek()[0] == i) { + size -= pq.poll()[1]; + } + int need = players[i] / m; + int more = size - need; + + if (more < 0) { + more = -more; // 부족한 서버 수만큼 양수로 변환 + size += more; + count += more; + pq.add(new int[]{i + k, more}); // 새로 증설된 서버는 i + k 시간에 만료됨 + } + } + + return count; + } +} diff --git "a/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" new file mode 100644 index 0000000..c44cec8 --- /dev/null +++ "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" @@ -0,0 +1,44 @@ +/** + * PackageName : week14.이상억.progarmmers; + * FileName : 최대공약수와_최소공배수 + * Author : sangeok + * Date : 2025. 07. 28. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 28. sangeok Initial creation + */ + +class Solution { + public int[] solution(int n, int m) { + int[] answer = new int[2]; + answer[0] = rhddirtn(n, m); // 최대공약수 + answer[1] = rhdqotn(n, m); // 최소공배수 + return answer; + } + + public int rhddirtn(int a, int b) { + int result = 1; + int min = Math.min(a, b); + for (int i = min; i >= 1; i--) { + if (a % i == 0 && b % i == 0) { + result = i; + break; + } + } + return result; + } + + public int rhdqotn(int a, int b) { + int max = Math.max(a, b); + int result = max; + while (true) { + if (result % a == 0 && result % b == 0) { + break; + } + result++; + } + return result; + } +} diff --git "a/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\355\205\214\354\235\264\353\270\224_\355\225\264\354\213\234_\355\225\250\354\210\230.java" "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\355\205\214\354\235\264\353\270\224_\355\225\264\354\213\234_\355\225\250\354\210\230.java" new file mode 100644 index 0000000..ca4b310 --- /dev/null +++ "b/week14/\354\235\264\354\203\201\354\226\265/progarmmers/\355\205\214\354\235\264\353\270\224_\355\225\264\354\213\234_\355\225\250\354\210\230.java" @@ -0,0 +1,46 @@ +/** + * PackageName : week14.이상억.progarmmers; + * FileName : 테이블_해시_함수 + * Author : sangeok + * Date : 2025. 07. 28. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 07. 28. sangeok Initial creation + */ + +// 해시 함수는 col, row_begin, row_end 입력 받음 +// col 번째 컬럼을 기준으로 오름차순 정렬, 그 값이 동일하면 기본키인 첫 번째 칼럼의 기준으로 내림차순 정렬 +// 정렬된 데이터에서 S_i를 i 번째 행의 튜플에 대해 각 칼럼의 값을 i 로 나눈 나머지들의 합으로 정의 +// row_begin <= i <= row_end 인 모든 S_i를 누적하여 bitwise xor 한 값을 해시값으로 반환 + + + +import java.util.Arrays; + +class Solution { + public int solution(int[][] data, int col, int row_begin, int row_end) { + + Arrays.sort(data, (a, b) -> { + if (a[col - 1] != b[col - 1]) { + return Integer.compare(a[col - 1], b[col - 1]); // col 기준 오름차순 + } else { + return Integer.compare(b[0], a[0]); // 첫 번째 컬럼 내림차순 + } + }); + + int xor = 0; + + + for (int i = row_begin; i <= row_end; i++) { + int sum = 0; + for (int a : data[i - 1]) { // i번째 행은 data[i - 1]에 위치 + sum += a % i; + } + xor ^= sum; + } + + return xor; + } +} diff --git "a/week14_a/\352\260\225\354\204\261\354\232\261/programmers/\353\214\200\354\266\251_\353\247\214\353\223\240_\354\236\220\355\214\220.java" "b/week14_a/\352\260\225\354\204\261\354\232\261/programmers/\353\214\200\354\266\251_\353\247\214\353\223\240_\354\236\220\355\214\220.java" new file mode 100644 index 0000000..5b268ee --- /dev/null +++ "b/week14_a/\352\260\225\354\204\261\354\232\261/programmers/\353\214\200\354\266\251_\353\247\214\353\223\240_\354\236\220\355\214\220.java" @@ -0,0 +1,58 @@ +package week14_a.강성욱.programmers; + +import java.util.Arrays; + +/** + * PackageName : week14_a.강성욱.programmers + * FileName : 대충_만든_자판 + * Author : Baekgwa + * Date : 2025-08-01 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-01 Baekgwa Initial creation + */ +public class 대충_만든_자판 { + // 완탐으로 keymap 을 char 별로 확인해도 되긴 할듯? + // 근데, A, B, C ... 등을 최적 몇번만에 해결 가능한지 미리 구해두면 더 좋을듯? + // keymap = 최대 100개 * 100번 = 10,000 + + class Solution { + public int[] solution(String[] keymap, String[] targets) { + int[] optimize = new int['Z' - 'A' + 1]; + Arrays.fill(optimize, -1); + + for(String nowKey : keymap) { + for(int index=0; index < nowKey.length(); index++) { + char nowChar = nowKey.charAt(index); + + if(optimize[nowChar - 'A'] == -1) optimize[nowChar - 'A'] = index + 1; + else if(optimize[nowChar - 'A'] > index + 1) optimize[nowChar - 'A'] = index + 1; + } + } + + // for(int value : optimize) { + // System.out.print(value); + // System.out.print("\n"); + // } + + + // targets iter 돌면서 출력하기 + int[] result = new int[targets.length]; + for(int i=0; i= a) { + //a의 배수 중, 가장 최대한 많이 가져다 주기 + int targetCokeCount = (nowCokeCount / a) * a; + int nowReturnCokeCount = (targetCokeCount / a) * b; + totalReturnCokeCount += nowReturnCokeCount; + + //배수 하고 남은건 저장해두기 + int remainCokeCount = nowCokeCount - targetCokeCount; + + //반환 오는거 더해서 현재 값에 저장해두기 + nowCokeCount = nowReturnCokeCount + remainCokeCount; + } + + return totalReturnCokeCount; + } + } +} diff --git "a/week14_a/\352\271\200\353\210\204\353\246\254/programmers/\353\214\200\354\266\251_\353\247\214\353\223\240_\354\236\220\355\214\220.java" "b/week14_a/\352\271\200\353\210\204\353\246\254/programmers/\353\214\200\354\266\251_\353\247\214\353\223\240_\354\236\220\355\214\220.java" new file mode 100644 index 0000000..05eea58 --- /dev/null +++ "b/week14_a/\352\271\200\353\210\204\353\246\254/programmers/\353\214\200\354\266\251_\353\247\214\353\223\240_\354\236\220\355\214\220.java" @@ -0,0 +1,47 @@ +package week14_a.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week14_a.김누리.programmers + * FileName : 대충_만든_자판 + * Author : 김누리(NRKim) + * Date : 2025-08-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 02. 김누리(NRKim) Initial creation + */ + +public class 대충_만든_자판 { + public int[] solution(String[] keymap, String[] targets) { + int[] answer = new int[targets.length]; + Map map = new HashMap<>(); // 몇번 눌렸는지 카운팅용 + + for(String k : keymap) { + for(int i = 0; i < k.length(); i++) { + char c = k.charAt(i); + + map.put(c,Math.min(map.getOrDefault(c,Integer.MAX_VALUE),i+1)); + } + } + + for(int i = 0; i < targets.length; i++) { + int sum = 0; + for(char c : targets[i].toCharArray()) { + if(!map.containsKey(c)) { + sum = -1; + break; + } + sum += map.get(c); + } + + answer[i] = sum; + } + + + return answer; + } +} diff --git "a/week14_a/\352\271\200\353\210\204\353\246\254/programmers/\354\275\234\353\235\274_\353\254\270\354\240\234.java" "b/week14_a/\352\271\200\353\210\204\353\246\254/programmers/\354\275\234\353\235\274_\353\254\270\354\240\234.java" new file mode 100644 index 0000000..afb8d71 --- /dev/null +++ "b/week14_a/\352\271\200\353\210\204\353\246\254/programmers/\354\275\234\353\235\274_\353\254\270\354\240\234.java" @@ -0,0 +1,26 @@ +package week14_a.김누리.programmers; + +/** + * PackageName : week14_a.김누리.programmers + * FileName : 콜라_문제 + * Author : 김누리(NRKim) + * Date : 2025-08-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 02. 김누리(NRKim) Initial creation + */ + +public class 콜라_문제 { + public int solution(int a, int b, int n) { + int answer = 0; + + while (n >= a) { + answer += (n/a) * b; + n = (n/a) * b +(n%a); + } + + return answer; + } +} diff --git "a/week14_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\214\200\354\266\251_\353\247\214\353\223\240_\354\236\220\355\214\220.java" "b/week14_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\214\200\354\266\251_\353\247\214\353\223\240_\354\236\220\355\214\220.java" new file mode 100644 index 0000000..c0c176d --- /dev/null +++ "b/week14_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\214\200\354\266\251_\353\247\214\353\223\240_\354\236\220\355\214\220.java" @@ -0,0 +1,43 @@ +// 1번키 한번 누르면 a 두번 누르면 b 세번 누르면 c +// 키의 개수 1 ~ 100 + +// 배열 인덱스로 해시맵 만들면 될 듯 + +import java.util.*; + +class Solution { + public int[] solution(String[] keymap, String[] targets) { + + int[] answer = new int[targets.length]; + + Map map = new HashMap<>(); + + for(String keys : keymap) { + for(int i = 0 ; i < keys.length(); i++){ + char c = keys.charAt(i); + int touchcount = i + 1; + + map.put(c, Math.min(map.getOrDefault(c, Integer.MAX_VALUE), touchcount)); + } + } + + for(int i = 0 ; i < targets.length; i ++){ + String target = targets[i]; + int total = 0; + boolean ip = false; + + for(char c : target.toCharArray()){ + if(map.containsKey(c)){ + total += map.get(c); + } else { + total =-1; + ip = true; + break; + } + } + answer[i] = total; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week14_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\275\234\353\235\274_\353\254\270\354\240\234.java" "b/week14_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\275\234\353\235\274_\353\254\270\354\240\234.java" new file mode 100644 index 0000000..11a25b1 --- /dev/null +++ "b/week14_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\275\234\353\235\274_\353\254\270\354\240\234.java" @@ -0,0 +1,20 @@ +// 20 -> 10 -> 5 -> 2 + 1 +1 +// 10 + 5 + 2 + 1 + 1 + +// n : 빈병 , 빈병 a 개를 가져다 주면 콜라 b 병을 주는 마트 +class Solution { + public int solution(int a, int b, int n) { + int answer = 0; + + while(n>=a){ + int ex = (n/a) * b; + int re = n % a ; + + answer += ex; + + n = ex + re; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week15/\352\260\225\354\204\261\354\232\261/programmers/n\354\240\234\352\263\261_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" "b/week15/\352\260\225\354\204\261\354\232\261/programmers/n\354\240\234\352\263\261_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" new file mode 100644 index 0000000..78b2f25 --- /dev/null +++ "b/week15/\352\260\225\354\204\261\354\232\261/programmers/n\354\240\234\352\263\261_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" @@ -0,0 +1,33 @@ +package week15.강성욱.programmers; + +/** + * PackageName : week15.강성욱.programmers + * FileName : n제곱_배열_자르기 + * Author : Baekgwa + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-08 Baekgwa Initial creation + */ +public class n제곱_배열_자르기 { + // left 나 right 좌표를 2차원 좌표로 변경할 수 있으면 될듯? + + class Solution { + public int[] solution(int n, long left, long right) { + int size = (int)(right - left) + 1; + int[] result = new int[size]; + + int idx = 0; + for(long l = left; l <= right; l++) { + long y = l / (long)n; + long x = l % (long)n; + + result[idx++] = (int) Math.max(x, y) + 1; + } + + return result; + } + } +} diff --git "a/week15/\352\260\225\354\204\261\354\232\261/programmers/\352\264\204\355\230\270_\353\263\200\355\231\230.java" "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\352\264\204\355\230\270_\353\263\200\355\231\230.java" new file mode 100644 index 0000000..8f54cf0 --- /dev/null +++ "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\352\264\204\355\230\270_\353\263\200\355\231\230.java" @@ -0,0 +1,74 @@ +package week15.강성욱.programmers; + +/** + * PackageName : week15.강성욱.programmers + * FileName : 괄호_변환 + * Author : Baekgwa + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-08 Baekgwa Initial creation + */ +public class 괄호_변환 { + //균형잡힌 문자열 2개로 분할하는 메소드 필요 + // u / v 로 나눌때 + // u는 균형잡힌 가장 짧은 걸로. + // v는 나머지 + + class Solution { + public String solution(String p) { + return dfs(p); + } + + private String dfs(String p) { + if (p.isEmpty()) return ""; + + String[] pArray = div(p); + String left = pArray[0]; + String right = pArray[1]; + + if (isCorrect(left)) { + return left + dfs(right); + } else { + StringBuilder sb = new StringBuilder(); + sb.append("("); + sb.append(dfs(right)); + sb.append(")"); + sb.append(reverse(left.substring(1, left.length() - 1))); + return sb.toString(); + } + } + + private String[] div(String p) { + int left = 0, right = 0; + for (int i = 0; i < p.length(); i++) { + if (p.charAt(i) == '(') left++; + else right++; + if (left == right) { + return new String[]{p.substring(0, i + 1), p.substring(i + 1)}; + } + } + return new String[]{p, ""}; + } + + private boolean isCorrect(String p) { + int balance = 0; + for (char c : p.toCharArray()) { + if (c == '(') balance++; + else balance--; + if (balance < 0) return false; + } + return balance == 0; + } + + private String reverse(String p) { + StringBuilder sb = new StringBuilder(); + for (char c : p.toCharArray()) { + sb.append(c == '(' ? ')' : '('); + } + return sb.toString(); + } + } +} diff --git "a/week15/\352\260\225\354\204\261\354\232\261/programmers/\353\263\264\354\204\235_\354\207\274\355\225\221.java" "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\353\263\264\354\204\235_\354\207\274\355\225\221.java" new file mode 100644 index 0000000..417009f --- /dev/null +++ "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\353\263\264\354\204\235_\354\207\274\355\225\221.java" @@ -0,0 +1,112 @@ +package week15.강성욱.programmers; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * PackageName : week15.강성욱.programmers + * FileName : 보석_쇼핑 + * Author : Baekgwa + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-08 Baekgwa Initial creation + */ +public class 보석_쇼핑 { + //0~끝 인덱스까지 다사면 무조건 다 살 수 있다. + //끝 인덱스부터 하나씩 없애면서 확인해보기. + //그렇게 빼다가 더 이상 뺄 수 없으면, 그게 오른쪽 인덱스의 끝 지점. + //0번 인덱스부터 1, 2, 3... 까지 확인 + //그렇게 빼다가 더 뺄수 없으면 왼쪽 끝지점. + + //근데, 중간에 뺄때마다 다 계산하는건 너무 비효율 적임. 메모리제이션 해야됨. + + class Solution { + // public int[] solution(String[] gems) { + // int[] result = new int[2]; + // int left = 0; + // int right = gems.length-1; + + // Set set = new HashSet<>(); //총 몇종류 있는지 확인하는 set + // Map map = new HashMap<>(); // left ~ right 까지 얼마나 있는지 확인 + // for(String gem : gems) { + // set.add(gem); + // map.put(gem, map.getOrDefault(gem, 0) + 1); + // } + + // //right 최적화 하기 + // while(right > 0) { + // String nowGem = gems[right]; //이번에 빼야될 숫자. + // int count = map.getOrDefault(nowGem, 0); + + // if(count > 1) { + // map.put(nowGem, count -1); + // right--; + // } else { + // break; + // } + // } + // result[1] = right - 1; //인덱스라 +1 해줘야함 + + // //left 최적화 하기 + // while(left < right) { + // String nowGem = gems[left]; //이번에 빼야될 숫자. + // int count = map.getOrDefault(nowGem, 0); + + // if(count > 1) { + // map.put(nowGem, count -1); + // left++; + // } else { + // break; + // } + // } + // result[0] = left + 1; //인덱스라 +1 해줘야함 + + // return result; + // } + + //left right, 번갈아가면서 처리해야될듯? + public int[] solution(String[] gems) { + int[] result = new int[2]; + int left = 0; + int right = 0; + int minLen = Integer.MAX_VALUE; + + Map map = new HashMap<>(); + Set set = new HashSet<>(); // 보석 종류 확인용 set + for(String gem : gems) { + set.add(gem); + } + + while(true) { + //왼쪽을 늘릴지, 오른쪽을 늘릴지 어떻게 판단? set 종류와 현재 map 에 들어있는걸 비교하면 될듯? + //모든 종류의 보석이 다 담겨있음 현재 map에. 그럼 left ++ 해서 줄여봐야함 + if (map.size() == set.size()) { + if (right - left < minLen) { + minLen = right - left; + result[0] = left + 1; // 1-based + result[1] = right; // 1-based + } + // 왼쪽 빼기 + String nowGem = gems[left]; + map.put(nowGem, map.get(nowGem) - 1); + if (map.get(nowGem) == 0) map.remove(nowGem); + left++; + } + // 모든 종류가 아직 안 들어왔으면 right++ + else { + if (right == gems.length) break; // 오른쪽 끝 도달 시 종료 + String nowGem = gems[right]; + map.put(nowGem, map.getOrDefault(nowGem, 0) + 1); + right++; + } + } + + return result; + } + } +} diff --git "a/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\202\274\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\202\274\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" new file mode 100644 index 0000000..b27ad8c --- /dev/null +++ "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\202\274\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" @@ -0,0 +1,30 @@ +package week15.강성욱.programmers; + +/** + * PackageName : week15.강성욱.programmers + * FileName : 삼진법_뒤집기 + * Author : Baekgwa + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-08 Baekgwa Initial creation + */ +public class 삼진법_뒤집기 { + + class Solution { + public int solution(int n) { + //3진법 String 으로 변환 + n = 11; + String wlsqjq3 = Integer.toString(n, 3); + System.out.print(wlsqjq3); + + //reverse + StringBuffer sb = new StringBuffer(wlsqjq3); + + String result = sb.reverse().toString(); + return Integer.valueOf(result, 3); + } + } +} diff --git "a/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\213\234\354\206\214_\354\247\235\352\266\201.java" "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\213\234\354\206\214_\354\247\235\352\266\201.java" new file mode 100644 index 0000000..f549787 --- /dev/null +++ "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\213\234\354\206\214_\354\247\235\352\266\201.java" @@ -0,0 +1,87 @@ +package week15.강성욱.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week15.강성욱.programmers + * FileName : 시소_짝궁 + * Author : Baekgwa + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-08 Baekgwa Initial creation + */ +public class 시소_짝궁 { + //무게 정보가 너무 많은데...? 최적화가 필요함. + // 모든 무게 정보를 map 에 저장해두고 value 로는 count로 쓰면? + //만약 100 이 2개면 1개쌍 가능 + //100이 3개면? 1-2, 1-3, 2-3 3쌍 가능 + //100이 4개면? 1-2, 1-3, 1-4, 2-3, 2-4, 3-4 6쌍 가능 + //100이 N개면? 0 + 1 + 2 + ... + (N-1) 쌍 만큼 가는ㅇ + //Map 에 넣어두고 꺼내서 쓰면 될 것 같은데? + + class Solution { + // public long solution(int[] weights) { + + // Map map = new HashMap<>(); + // long result = 0L; + + // for(int weight : weights) { + // map.put(weight, map.getOrDefault(weight, 0) + 1); + // map.put(weight * 2, map.getOrDefault(weight * 2, 0) + 1); + // map.put(weight * 3, map.getOrDefault(weight * 3, 0) + 1); + // map.put(weight * 4, map.getOrDefault(weight * 4, 0) + 1); + // } + + // for (Map.Entry entry : map.entrySet()) { + // if(entry.getValue() >= 2) result += cal(entry.getValue()); + // } + + // return result; + // } + + // private long cal(int N) { + // System.out.println(N); + // long result = 0; + + // for(int l = N-1; l >= 0; l--) { + // result += l; + // } + + // return result; + // } + + // gpt! + // 시소의 좌석 위치(거리)는 2, 3, 4(m)이고, 두 명이 마주 앉으므로 가능한 거리 비율 조합은 다음뿐. + // 한쪽 거리 반대쪽 거리 거리 비율 (왼/오) + // 2 3 2/3 + // 2 4 1/2 + // 3 2 3/2 + // 3 4 3/4 + // 4 2 2/1 + // 4 3 4/3 + // 동일 거리 동일 거리 1 + + public long solution(int[] weights) { + long answer = 0; + Map countMap = new HashMap<>(); + + double[] ratios = {1.0, 2.0/3.0, 1.0/2.0, 3.0/2.0, 3.0/4.0, 2.0, 4.0/3.0}; + + for (int w : weights) { + for (double r : ratios) { + double target = w * r; + if (target == (int) target) { + answer += countMap.getOrDefault((int) target, 0L); + } + } + countMap.put(w, countMap.getOrDefault(w, 0L) + 1); + } + + return answer; + } + } +} diff --git "a/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\227\260\354\206\215\353\220\234_\353\266\200\353\266\204_\354\210\230\354\227\264\354\235\230_\355\225\251.java" "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\227\260\354\206\215\353\220\234_\353\266\200\353\266\204_\354\210\230\354\227\264\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..99caa76 --- /dev/null +++ "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\227\260\354\206\215\353\220\234_\353\266\200\353\266\204_\354\210\230\354\227\264\354\235\230_\355\225\251.java" @@ -0,0 +1,49 @@ +package week15.강성욱.programmers; + +/** + * PackageName : week15.강성욱.programmers + * FileName : 연속된_부분_수열의_합 + * Author : Baekgwa + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-08 Baekgwa Initial creation + */ +public class 연속된_부분_수열의_합 { + + class Solution { + public int[] solution(int[] sequence, int k) { + int start = 0; + int end = 0; + int sum = 0; + int ans1 = 0; + int ans2 = 0; + int size = sequence.length; + + for(end=0; end < sequence.length; end++){ + sum += sequence[end]; + + while(sum > k){ + sum -= sequence[start]; + start++; + } + + if(sum == k){ + if(size > end-start) { + size = end-start; + ans1 = start; + ans2 = end; + } + else if(size == end-start) { + ans1 = Math.min(ans1, start); + ans2 = Math.min(ans2, end); + } + } + } + + return new int[] {ans1, ans2}; + } + } +} diff --git "a/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" new file mode 100644 index 0000000..a23950a --- /dev/null +++ "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" @@ -0,0 +1,35 @@ +package week15.강성욱.programmers; + +/** + * PackageName : week15.강성욱.programmers + * FileName : 이진_변환_반복하기 + * Author : Baekgwa + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-08 Baekgwa Initial creation + */ +public class 이진_변환_반복하기 { + class Solution { + public int[] solution(String s) { + // String a = "1111"; + // System.out.print("a : " + a.length()); + // System.out.print("\n"); + // String b = "111"; + // System.out.print("b : " + b.length()); + int[] result = new int[2]; + + while(!s.equals("1")) { + int zeroCount = s.length() - s.replace("0", "").length(); + result[1] += zeroCount; + int oneCount = s.length() - zeroCount; + s = Integer.toString(oneCount, 2); + result[0]++; + } + + return result; + } + } +} diff --git "a/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\277\274\353\223\234\354\225\225\354\266\225_\355\233\204_\352\260\234\354\210\230_\354\204\270\352\270\260.java" "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\277\274\353\223\234\354\225\225\354\266\225_\355\233\204_\352\260\234\354\210\230_\354\204\270\352\270\260.java" new file mode 100644 index 0000000..d941f30 --- /dev/null +++ "b/week15/\352\260\225\354\204\261\354\232\261/programmers/\354\277\274\353\223\234\354\225\225\354\266\225_\355\233\204_\352\260\234\354\210\230_\354\204\270\352\270\260.java" @@ -0,0 +1,47 @@ +package week15.강성욱.programmers; + +/** + * PackageName : week15.강성욱.programmers + * FileName : 쿼드압축_후_개수_세기 + * Author : Baekgwa + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-08 Baekgwa Initial creation + */ +public class 쿼드압축_후_개수_세기 { + class Solution { + private final int[] answer = new int[2]; + + public int[] solution(int[][] arr) { + divDfs(arr, 0, 0, arr[0].length, arr.length); + return answer; + } + + private void divDfs(int[][] a, int sx, int sy, int ex, int ey) { + if (isSame(a, sx, sy, ex, ey)) { + answer[a[sx][sy]]++; + return; + } + int mx = (sx + ex) / 2; + int my = (sy + ey) / 2; + + divDfs(a, sx, sy, mx, my); + divDfs(a, sx, my, mx, ey); + divDfs(a, mx, sy, ex, my); + divDfs(a, mx, my, ex, ey); + } + + private boolean isSame(int[][] a, int sx, int sy, int ex, int ey) { + int v = a[sx][sy]; + for (int i = sx; i < ex; i++) { + for (int j = sy; j < ey; j++) { + if (a[i][j] != v) return false; + } + } + return true; + } + } +} diff --git "a/week15/\352\271\200\353\202\230\354\235\200/programmers/n2_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" "b/week15/\352\271\200\353\202\230\354\235\200/programmers/n2_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" new file mode 100644 index 0000000..3d44cf1 --- /dev/null +++ "b/week15/\352\271\200\353\202\230\354\235\200/programmers/n2_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" @@ -0,0 +1,26 @@ +package week15.김나은.programmers; + +public class n2_배열_자르기 { + + class Solution { + + public int[] solution(int n, long left, long right) { + // (right - left + 1) 크기의 정답 배열을 만든다 + int[] answer = new int[(int) (right - left) + 1]; + + for (int i = 0; i < answer.length; i++) { + // (i + left)는 1차원 배열에서의 실제 인덱스 + // n으로 나눠서 몫에 +1을 하면 "가상의 2차원 배열에서 행(1-based)"이 된다 + int row = (int) ((i + left) / n) + 1; // 1-base 행 번호 + + // n으로 나눈 나머지에 +1을 하면 "가상의 2차원 배열에서 열(1-based)"이 된다 + int col = (int) ((i + left) % n) + 1; // 1-base 열 번호 + + // 가상 2차원 배열의 (row, col) 위치의 값은 두 값 중 더 큰 값 + answer[i] = Math.max(row, col); + } + + return answer; + } + } +} \ No newline at end of file diff --git "a/week15/\352\271\200\353\202\230\354\235\200/programmers/\354\202\274\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" "b/week15/\352\271\200\353\202\230\354\235\200/programmers/\354\202\274\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" new file mode 100644 index 0000000..bed487d --- /dev/null +++ "b/week15/\352\271\200\353\202\230\354\235\200/programmers/\354\202\274\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" @@ -0,0 +1,22 @@ +package week15.김나은.programmers; + +public class 삼진법_뒤집기 { + + class Solution { + + public int solution(int n) { + int answer = 0; + + // n을 3진수 문자열로 변환 (예: 45 → "1200") + String str = Integer.toString(n, 3); + + // 3진수 문자열을 뒤집기 (예: "1200" → "0021") + String reverse = new StringBuilder(str).reverse().toString(); + + // 뒤집힌 3진수 문자열을 10진수로 변환 (예: "0021" → 7) + answer = Integer.valueOf(reverse, 3); + + return answer; + } + } +} diff --git "a/week15/\352\271\200\353\202\230\354\235\200/programmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" "b/week15/\352\271\200\353\202\230\354\235\200/programmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" new file mode 100644 index 0000000..dcfa85c --- /dev/null +++ "b/week15/\352\271\200\353\202\230\354\235\200/programmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" @@ -0,0 +1,32 @@ +package week15.김나은.programmers; + +public class 이진_변환_반복하기 { + + class Solution { + + public int[] solution(String s) { + // 결과를 저장할 배열 (answer[0]: 이진 변환 횟수, answer[1]: 제거된 0의 개수) + int[] answer = new int[2]; + + // s의 길이가 1이 될 때까지 반복 + while (s.length() > 1) { + int one = 0; // 문자열 내 1의 개수 + + // 문자열을 한 글자씩 확인 + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == '0') { + answer[1]++; // 0이 나오면 제거된 0의 개수 증가 + } else { + one++; // 1이면 one 증가 + } + } + + // 1의 개수를 2진수 문자열로 변환하여 s에 저장 + s = Integer.toBinaryString(one); + answer[0]++; // 변환 횟수 증가 + } + + return answer; + } + } +} \ No newline at end of file diff --git "a/week15/\352\271\200\353\210\204\353\246\254/programmers/n_2_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" "b/week15/\352\271\200\353\210\204\353\246\254/programmers/n_2_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" new file mode 100644 index 0000000..88a82a3 --- /dev/null +++ "b/week15/\352\271\200\353\210\204\353\246\254/programmers/n_2_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" @@ -0,0 +1,54 @@ +package week15.김누리.programmers; + +/** + * PackageName : week15.김누리.programmers + * FileName : n_2_배열_자르기 + * Author : 김누리(NRKim) + * Date : 2025-08-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 05. 김누리(NRKim) Initial creation + */ + +/* +123 +223 +333 + +012 345 678 +123 223 333 +l = 2 r = 5 + +i = 2,3,4,5 + +row = 2/3 == 0 +col = 2%3 == 2 ==> 3 + +row = 3/3 == 1 ==> 2 +col = 3%3 == 0 + +row = 4/3 == 1 ==> 2 +col = 4%3 == 1 + +row = 5/3 == 1 +col = 5%3 == 2 ==> 3 + +*/ + +public class n_2_배열_자르기 { + public int[] solution(int n, long left, long right) { + int[] answer = new int[(int) (right - left + 1)]; + int idx = 0; + + for(long i = left ; i <= right; i++) { + long row = i/n; + long col = i%n; + + answer[idx++] = Math.max((int)row, (int)col) + 1; + } + + return answer; + } +} diff --git "a/week15/\352\271\200\353\210\204\353\246\254/programmers/\352\264\204\355\230\270_\353\263\200\355\231\230.java" "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\352\264\204\355\230\270_\353\263\200\355\231\230.java" new file mode 100644 index 0000000..621caaf --- /dev/null +++ "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\352\264\204\355\230\270_\353\263\200\355\231\230.java" @@ -0,0 +1,96 @@ +package week15.김누리.programmers; + +/** + * PackageName : week15.김누리.programmers + * FileName : 괄호_변환 + * Author : 김누리(NRKim) + * Date : 2025-08-04 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 04. 김누리(NRKim) Initial creation + */ + +/* +p가 비어있다? ==> p 그대로 반환 + +case 1 : +p를 쪼갬 => {"(", "(", ")", "(", ")", ")", "(", ")"}; +u = "(()())()", v = "" + +case 2 : ")(" +u = "()" v = "" + +case 3 : "()))((()" +u = ()() v = ))(( +u = ()()() v = )( +u = ()(())() v = "" + +solution (v) 로 해서 재귀 돌림 + +() 상태인지 )( 상태인지 체크하는 메소드 필요 + +)( 상태면 appand 하는 메소드 작성 + +*/ + +public class 괄호_변환 { + public String solution(String p) { + + if(p.isEmpty()) return p; // p가 빈문자면 p 반환 + + String[] uv = splitToBalanced(p); // p를 쪼개기 + String u = uv[0]; + String v = uv[1]; + + if(isCollect(u)) return u + solution(v); + + return "(" + solution(v) + ")" + reverse(u.substring(1,u.length()-1)); + } + + // 올바른 () 문자 + public String[] splitToBalanced(String p) { + int left = 0, right = 0; + int idx = 0; + + // 시작 위치가 p의 끝자락에 도달하기 전 까지 반복 + while(left < p.length()) { + char c = p.charAt(idx); // 해당 위치의 글자 + if( c == '(' ) left++; + else right++; + + idx++; + + if(left == right) break; // 균형잡힌 괄호 완성 + } + + String u = p.substring(0,idx); + String v = p.substring(idx); + + return new String[]{u,v}; + } + + public boolean isCollect(String s) { + int cnt = 0; + + for(char c : s.toCharArray()) { + if(c == '(') cnt++; + else cnt--; + + if(cnt < 0) return false; + } + + return true; + } + + public String reverse(String s) { + StringBuilder sb = new StringBuilder(); + + for(char c : s.toCharArray()) { + sb.append(c == '(' ? ')' : '('); + } + + return sb.toString(); + } +} diff --git "a/week15/\352\271\200\353\210\204\353\246\254/programmers/\353\263\264\354\204\235_\354\207\274\355\225\221.java" "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\353\263\264\354\204\235_\354\207\274\355\225\221.java" new file mode 100644 index 0000000..eb57d9f --- /dev/null +++ "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\353\263\264\354\204\235_\354\207\274\355\225\221.java" @@ -0,0 +1,72 @@ +package week15.김누리.programmers; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +/** + * PackageName : week15.김누리.programmers + * FileName : 보석_쇼핑 + * Author : 김누리(NRKim) + * Date : 2025-08-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 03. 김누리(NRKim) Initial creation + */ + +/* +보석의 종류를 map에 저장해서 보석 종류의 구매 갯수 체크 + +left = 0, right = 0으로 선언 후, right가 일단 모든 보석들을 포함할 때 까지 이동 + +이후 left를 조정해 가며 map에 보석들이 다 포함 되는지 체크 + + +map을 이용하며 카운팅 하는건 이해했지만 구체적인 방식이 잘 안떠오름. + +left, right 변수 선언. + +while문 돌리며 right 위치 조정하면 되는것 까지는 이해함. + +그러나 while 조건문 이후에 인공지능 도움을 받다보니, 소스 완성이 안되었었음 + + +*/ + +public class 보석_쇼핑 { + public int[] solution(String[] gems) { + Map map = new HashMap<>(); + int kind = new HashSet<>(Arrays.asList(gems)).size(); + + int left = 0, right = 0; // 시작 및 끝 점 위치 + map.put(gems[0],1); // 시작 위치의 보석 담기 + + int[] answer = {1,gems.length}; + + while(right < gems.length) { + if (map.size() == kind) { + // 시작점 - 끝점의 보석 갯수 비교 + if (answer[1] - answer[0] > right - left) { + answer[0] = left + 1; + answer[1] = right + 1; + } + + // left-- + map.put(gems[left],map.get(gems[left])-1); + if(map.get(gems[left]) == 0) map.remove(gems[left]); + left++; + + } else { + right++; + if(right < gems.length) { + map.put(gems[right], map.getOrDefault(gems[right], 0) +1); + } + } + } + + return answer; + } +} diff --git "a/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\202\274\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\202\274\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" new file mode 100644 index 0000000..b92e1db --- /dev/null +++ "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\202\274\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" @@ -0,0 +1,39 @@ +package week15.김누리.programmers; + +/** + * PackageName : week15.김누리.programmers + * FileName : 삼진법_뒤집기 + * Author : 김누리(NRKim) + * Date : 2025-08-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 02. 김누리(NRKim) Initial creation + */ + +/* +풀이 방법은 2가지. + +1. n을 3으로 나눈 나머지를 순차적으로 이어붙이면 리버스 3진수화 +2. n을 Integer.toString(n,3); 해서 3진수 String으로 만들고 역정렬 + +간단하긴 1번이 간단해 보여서 1번 채용. + +*/ + +public class 삼진법_뒤집기 { + public int solution(int n) { + int answer = 0; + StringBuilder sb = new StringBuilder(); + + while(n > 0) { + sb.append(n%3); + n /= 3; + } + + answer = Integer.parseInt(sb.toString(),3); + + return answer; + } +} diff --git "a/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\213\234\354\206\214_\354\247\235\352\277\215.java" "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\213\234\354\206\214_\354\247\235\352\277\215.java" new file mode 100644 index 0000000..272ac0e --- /dev/null +++ "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\213\234\354\206\214_\354\247\235\352\277\215.java" @@ -0,0 +1,65 @@ +package week15.김누리.programmers; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week15.김누리.programmers + * FileName : 시소_짝궁 + * Author : 김누리(NRKim) + * Date : 2025-08-04 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 04. 김누리(NRKim) Initial creation + */ + +/* +시소 위치 4 3 2 0 2 3 4 + +weights = {100,180,360,100,270} + +우선은 정렬 = {100,100,180,270,360} + +맵을 통해 이전까지 나온 무게들을 체크하며 진행. + + +*/ + +public class 시소_짝꿍 { + public long solution(int[] weights) { + long answer = 0; + Map map = new HashMap<>(); + + // 몸무게별 오름차순 정렬 + Arrays.sort(weights); + + for(int w : weights) { + + // 시소 위치별 나온 무게들 체크 + double[] rations = {1.0, 2.0/3, 2.0/4, 3.0/2, 3.0/4, 4.0/2, 4.0/3}; + + for(double r : rations) { + double tar = r * w; + + if(tar == Math.floor(tar)) { + // 정수 확인용 + int t = (int) tar; + + // 맵에 해당 값이 있으면 점수 추가 + if(map.containsKey(t)) { + answer += map.get(t); + } + } + } + + // 없으면 맵 현재 무게 추가 + map.put(w, map.getOrDefault(w,0) + 1); + } + + + return answer; + } +} diff --git "a/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\227\260\354\206\215\353\220\234_\353\266\200\353\266\204_\354\210\230\354\227\264\354\235\230_\355\225\251.java" "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\227\260\354\206\215\353\220\234_\353\266\200\353\266\204_\354\210\230\354\227\264\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..fe7d164 --- /dev/null +++ "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\227\260\354\206\215\353\220\234_\353\266\200\353\266\204_\354\210\230\354\227\264\354\235\230_\355\225\251.java" @@ -0,0 +1,57 @@ +package week15.김누리.programmers; + +/** + * PackageName : week15.김누리.programmers + * FileName : 연속된_부분_수열의_합 + * Author : 김누리(NRKim) + * Date : 2025-08-06 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 06. 김누리(NRKim) Initial creation + */ + +/* + +시작점과 끝점을 선언 + +끝점의 위치를 추가해가며 더해가면 됨 + +*/ + +public class 연속된_부분_수열의_합 { + public int[] solution(int[] sequence, int k) { + int[] answer = new int[2]; + int start = 0, end = 0; // 시작점 및 끝점 + int sum = sequence[0]; // 시퀀스 위치에 해당하는 값들을 더하는 변수 + + int min = Integer.MAX_VALUE; // 최소 길이 비교용 변수 + + while(end < sequence.length) { + if(sum < k) { + end++; + if(end < sequence.length) sum += sequence[end]; // 끝점이 위치가 배열을 벗어나는지 체크 + } else { + if (sum == k) { + if((end - start) < min) { + min = end - start; // 최소 거리값 계산. + answer[0] = start; // 시작점 + answer[1] = end; // 끝점 + } + } + + sum -= sequence[start]; // 시작점 변동을 위해 시작점 만큼 뺌 + start++; // 시작점 변경 + + // 시작점을 옮긴 후 위치 확인 + if (start > end && start < sequence.length) { + end = start; + sum = sequence[start]; + } + } + } + + return answer; + } +} diff --git "a/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" new file mode 100644 index 0000000..bf9486b --- /dev/null +++ "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" @@ -0,0 +1,60 @@ +package week15.김누리.programmers; + +/** + * PackageName : week15.김누리.programmers + * FileName : 이진_변환_반복하기 + * Author : 김누리(NRKim) + * Date : 2025-08-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 02. 김누리(NRKim) Initial creation + */ + +/* +입력 값이 110010101001 인 경우 + 1회차 110010101001 > 111111 : 0 제거 횟수 : 6번, 남은 길이 : 6, 남은 길이 2진수 변환 : 110 + 2회차 110 > 11 : 0 제거 횟수 : 1번, 남은 길이 : 2, 남은 길이 2진수 변환 : 10 + 3회차 10 > 1 : 0 제거 횟수 : 1번, 남은 길이 : 1, 남은 길이 2진수 변환 : 1 + 리턴값 {변환 횟수 : 3, 0이 제거된 횟수 : 8 } + +입력 값이 1111111 인 경우 + 1회차 1111111 > 1111111 : 0 제거 횟수 : 0번, 남은 길이 : 7, 남은 길이 2진수 변환 : 111 + 2회차 111 > 111 : 0 제거 횟수 : 0번, 남은 길이 : 3, 남은 길이 2진수 변환 : 11 + 3회차 11 > 11 : 0 제거 횟수 : 0번, 남은 길이 : 2, 남은 길이 2진수 변환 : 10 + 4회차 10 > 1 : 0 제거 횟수 : 1번, 남은 길이 : 1, 남은 길이 2진수 변환 : 1 + 리턴값 {변환 횟수 : 4, 0이 제거된 횟수 : 1 } + + s = s.replace("0",""); + +*/ + +public class 이진_변환_반복하기 { + public int[] solution(String s) { + int[] answer = new int[2]; + int zeroCnt = 0; + int cnt = 0; + int size = 0; + + while(s.length() > 1) { + // 0의 갯수 카운팅 + for(String z : s.split("")) { + if(z.equals("0")) zeroCnt++; + } + + // 0 제거 + s = s.replaceAll("0",""); + size = s.length(); + s = Integer.toString(size,2); + + // 변환 횟수 증가 + cnt++; + } + + answer[0] = cnt; + answer[1] = zeroCnt; + + return answer; + } +} diff --git "a/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\277\274\353\223\234\354\225\225\354\266\225_\355\233\204_\352\260\234\354\210\230_\354\204\270\352\270\260.java" "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\277\274\353\223\234\354\225\225\354\266\225_\355\233\204_\352\260\234\354\210\230_\354\204\270\352\270\260.java" new file mode 100644 index 0000000..e16ee34 --- /dev/null +++ "b/week15/\352\271\200\353\210\204\353\246\254/programmers/\354\277\274\353\223\234\354\225\225\354\266\225_\355\233\204_\352\260\234\354\210\230_\354\204\270\352\270\260.java" @@ -0,0 +1,84 @@ +package week15.김누리.programmers; + +/** + * PackageName : week15.김누리.programmers + * FileName : 쿼드압축_후_개수_세기 + * Author : 김누리(NRKim) + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 08. 김누리(NRKim) Initial creation + */ + +/* +dfs를통해 재귀로 한 구역을 체크 + +체크를 진행하며 해당 구역이 전부 1이다? 그러면 oneCnt += 1 +1과 0이 혼재하는경우 + +if(1인 조건) oneCnt++; +else if(0인 조건) zeroCnt++; + + +answer[0] = zeroCnt; +answer[1] = oneCnt; +*/ + +public class 쿼드압축_후_개수_세기 { + int oneCnt = 0; + int zeroCnt = 0; + + public int[] solution(int[][] arr) { + int[] answer = new int[2]; + int size = arr.length; + + dfs(arr,0,0,size); + + answer[0] = zeroCnt; // 0의 갯수 + answer[1] = oneCnt; // 1의 갯수 + + return answer; + } + + // 색션 탐색 + public void dfs (int[][]arr, int x, int y, int size) { + if(isSame(arr,x,y,size)) { + // 한 섹터의 모든 수가 동일한 경우 1이면 1의 갯수 증가, + // 아니면 0의 갯수 증가 + if(arr[x][y] == 1) oneCnt++; + else zeroCnt++; + return; + } + + // 구역 재설정 + int newSize = size/2; + + // 좌상 + dfs(arr,x,y,newSize); + + // 우상 + dfs(arr,x,y + newSize,newSize); + + // 좌하 + dfs(arr,x + newSize,y,newSize); + + // 우하 + dfs(arr,x + newSize,y + newSize,newSize); + + } + + // 섹터 내 모든 숫자가 동일한 값인지 체크 + public boolean isSame(int[][]arr, int x, int y, int size) { + int base = arr[x][y]; + + for(int i = x; i < x + size; i++) { + for(int j = y; j < y+ size; j++) { + if (arr[i][j] != base) return false; + } + } + + return true; + } +} diff --git "a/week15/\354\235\264\354\203\201\354\226\265/progarmmers/3\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/3\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" new file mode 100644 index 0000000..7f68e10 --- /dev/null +++ "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/3\354\247\204\353\262\225_\353\222\244\354\247\221\352\270\260.java" @@ -0,0 +1,33 @@ +/** + * PackageName : week15.이상억.progarmmers; + * FileName : 3진법_뒤집기 + * Author : sangeok + * Date : 2025. 08. 06. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 06. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int solution(int n) { + int answer = 0; + List list = new ArrayList<>(); + + while( n > 0 ) { + list.add(n%3); + n = n/3; + } + + for(int i = 0; i < list.size(); i++){ + list.get(i); + answer += list.get(i) * Math.pow(3, list.size() - i - 1); + } + + return answer; + + } +} \ No newline at end of file diff --git "a/week15/\354\235\264\354\203\201\354\226\265/progarmmers/n^2_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/n^2_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" new file mode 100644 index 0000000..6e54ed2 --- /dev/null +++ "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/n^2_\353\260\260\354\227\264_\354\236\220\353\245\264\352\270\260.java" @@ -0,0 +1,66 @@ +/** + * PackageName : week15.이상억.progarmmers; + * FileName : n^2_배열_자르기 + * Author : sangeok + * Date : 2025. 08. 06. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 06. sangeok Initial creation + */ + +// 1 2 3 +// 2 2 3 +// 3 3 3 + +// 0 1 2 3 4 5 6 7 8 +// 1 2 3 2 2 3 3 3 3 +// left : 2 right : 5 + +// 2 3 4 5 +// 3 2 2 3 + +import java.util.*; +class Solution { + public int[] solution(int n, long left, long right) { + + int[] answer = new int[(int)(right - left + 1)]; + + List list = new ArrayList<>(); + + for(long i = left; i <= right; i++){ + long row = i/n; + long col = i%n; + + answer[(int)(i-left)] = (int)Math.max(row,col) + 1; + } + + return answer; + } +} + + +// 메모리 초과 +// 일일이 다 배열을 만들어서 메모리 터짐 + +//import java.util.*; +//class Solution { +// public int[] solution(int n, long left, long right) { +// +// int[] answer = new int[(int)(right - left + 1)]; +// +// List list = new ArrayList<>(); +// for (int i = 0; i < n; i++) { +// for (int j = 0; j < n; j++) { +// list.add(Math.max(i, j) + 1); +// } +// } +// +// for (int a = 0; a < answer.length; a++) { +// answer[a] = list.get((int)(left + a)); +// } +// +// return answer; +// } +//} \ No newline at end of file diff --git "a/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\352\264\204\355\230\270_\353\263\200\355\231\230.java" "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\352\264\204\355\230\270_\353\263\200\355\231\230.java" new file mode 100644 index 0000000..acefbd7 --- /dev/null +++ "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\352\264\204\355\230\270_\353\263\200\355\231\230.java" @@ -0,0 +1,69 @@ +/** + * PackageName : week15.이상억.progarmmers; + * FileName : 괄호_변환 + * Author : sangeok + * Date : 2025. 08. 07. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 07. sangeok Initial creation + */ + +// 문제 잘 읽고 시키는대로 하자 +class Solution { + public String solution(String p) { + if (p.isEmpty()) return ""; + if (correct(p)) return p; + + String[] uv = split_balance(p); + String u = uv[0]; + String v = uv[1]; + + if (correct(u)) { + return u + solution(v); + } else { + return "(" + solution(v) + ")" + reverse(u.substring(1, u.length() - 1)); + } + } + + // 올바른 괄호 문자열 판단 + public boolean correct(String s) { + int balance = 0; + + for (char c : s.toCharArray()) { + if (c == '(') balance++; + else balance--; + + if (balance < 0) return false; + } + return balance == 0; + } + + // 균형 잡힌 u,v 분리 + public String[] split_balance(String w) { + int balance = 0; + int idx = 0; + + for (; idx < w.length(); idx++) { + if (w.charAt(idx) == '(') balance++; + else balance--; + + if (balance == 0) break; + } + + String u = w.substring(0, idx + 1); + String v = w.substring(idx + 1); + return new String[]{u, v}; + } + + // 괄호 반전 + public String reverse(String s) { + StringBuilder sb = new StringBuilder(); + for (char c : s.toCharArray()) { + if (c == '(') sb.append(')'); + else sb.append('('); + } + return sb.toString(); + } +} diff --git "a/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\353\263\264\354\204\235_\354\207\274\355\225\221.java" "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\353\263\264\354\204\235_\354\207\274\355\225\221.java" new file mode 100644 index 0000000..7816dd7 --- /dev/null +++ "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\353\263\264\354\204\235_\354\207\274\355\225\221.java" @@ -0,0 +1,58 @@ +/** + * PackageName : week15.이상억.progarmmers; + * FileName : 보석_쇼핑 + * Author : sangeok + * Date : 2025. 08. 07. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 07. sangeok Initial creation + */ + +// HashSet + Sliding Window ? + +import java.util.*; + +class Solution { + public int[] solution(String[] gems) { + int[] answer = new int[2]; + + Set jewelSet = new HashSet<>(); // 전체 보석 개수 확인 + Map jewelMap = new HashMap<>(); // 현재 윈도우 내 보석 개수 카운팅 + + int start = 0; + int end = 0; + int minlen = Integer.MAX_VALUE; + + for(String g : gems){ + jewelSet.add(g); + } + + while(end < gems.length){ + + String gem = gems[end]; + jewelMap.put(gem, jewelMap.getOrDefault(gem, 0) + 1); + end++; + + while(jewelMap.size() == jewelSet.size()){ + if(end - start < minlen){ + minlen = end - start; + answer[0] = start + 1; + answer[1] = end; + } + + String startgem = gems[start]; + jewelMap.put(startgem, jewelMap.get(startgem) -1); + if(jewelMap.get(startgem) == 0){ + jewelMap.remove(startgem); + } + + start ++; + + + } + } + return answer; + } +} \ No newline at end of file diff --git "a/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\213\234\354\206\214_\354\247\235\352\277\215.java" "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\213\234\354\206\214_\354\247\235\352\277\215.java" new file mode 100644 index 0000000..2ae4f02 --- /dev/null +++ "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\213\234\354\206\214_\354\247\235\352\277\215.java" @@ -0,0 +1,44 @@ +/** + * PackageName : week15.이상억.progarmmers; + * FileName : 시소_짝궁 + * Author : sangeok + * Date : 2025. 08. 07. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 07. sangeok Initial creation + */ + + +// 중심으로부터 2,3,4 거리 지점에 좌석이 하나씩 + +// 두 명이 마주보고 탄다 했을 때 토크 크기가 상쇄 되어 균형을 이룬다면 ? -> 시소 짝궁 +// 탑승한 사람의 무게, 시소 축과 좌석 간의 거리의 곱이 양 쪽다 같다면 시소 짝궁. + + +import java.util.*; + +class Solution { + public long solution(int[] weights) { + Arrays.sort(weights); + + Map map = new HashMap<>(); + + long answer = 0; + + for (int w : weights) { + double[] ratios = {1.0, 2.0 / 3.0, 1.0 / 2.0, 3.0 / 4.0}; + + for (double r : ratios) { + double key = w * r; + if (map.containsKey(key)) { + answer += map.get(key); // 이미 나온 짝꿍 수만큼 더함 + } + } + + map.put((double) w, map.getOrDefault((double) w, 0) + 1); + } + return answer; + } +} \ No newline at end of file diff --git "a/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\227\260\354\206\215\353\220\234_\353\266\200\353\266\204_\354\210\230\354\227\264\354\235\230_\355\225\251.java" "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\227\260\354\206\215\353\220\234_\353\266\200\353\266\204_\354\210\230\354\227\264\354\235\230_\355\225\251.java" new file mode 100644 index 0000000..3d74bce --- /dev/null +++ "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\227\260\354\206\215\353\220\234_\353\266\200\353\266\204_\354\210\230\354\227\264\354\235\230_\355\225\251.java" @@ -0,0 +1,61 @@ +/** + * PackageName : week15.이상억.progarmmers; + * FileName : 연속된_부분_수열의_합 + * Author : sangeok + * Date : 2025. 08. 06. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 06. sangeok Initial creation + */ + +// 기존 수열에서 임의의 두 인덱스의 원소와 그 사이의 원소를 모두 포함하는 부분 수열 +// 부분 수열의 합 : k +// 합이 k 인 부분 수열이 여러개인 경우 길이가 가장 짧은 수열 +// 길이가 짧은 수열이 여러 개의 경우 ( 시작 인덱스가 작은 ) + + +// 기존 수열에서 임의의 두 인덱스의 원소와 그 사이의 원소를 모두 포함하는 부분 수열 +// 부분 수열의 합 : k +// 합이 k 인 부분 수열이 여러개인 경우 길이가 가장 짧은 수열 +// 길이가 짧은 수열이 여러 개의 경우 ( 시작 인덱스가 작은 ) + + +class Solution { + public int[] solution(int[] sequence, int k) { + + int sum = 0; + + int minlen = Integer.MAX_VALUE; + int beststart = 0; + int bestend = 0; + + int start = 0; + int end = 0; + + while( end < sequence.length){ + sum += sequence[end]; + + while(sum > k){ + sum -= sequence[start]; + start++; + } + + if(sum == k){ + + int len = end - start + 1; + + if(minlen > len){ + minlen = len; + beststart = start; + bestend = end; + } + } + + end ++; + } + + return new int[]{beststart,bestend}; + } +} \ No newline at end of file diff --git "a/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" new file mode 100644 index 0000000..1d3e3a3 --- /dev/null +++ "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\247\204_\353\263\200\355\231\230_\353\260\230\353\263\265\355\225\230\352\270\260.java" @@ -0,0 +1,48 @@ +/** + * PackageName : week15.이상억.progarmmers; + * FileName : 이진_변환_반복하기 + * Author : sangeok + * Date : 2025. 08. 06. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 06. sangeok Initial creation + */ + +// x의 모든 0 을 제거 +// x의 길이를 c 라 하면 c -> 2진 변환 + +// s가 1이 될 때 까지 s에 이진 변환을 가했을 때 , +// 이진 변환의 횟수와 변환 과정에서 제거 된 0의 개수 배열의 담기 + +import java.util.*; +class Solution { + public int[] solution(String s) { + int[] answer = new int[2]; + + while (!s.equals("1")) { + + answer[1] += s.length() - s.replace("0", "").length(); + s = s.replace("0", ""); + s = bit(s.length()); + answer[0]++; + + } + return answer; + + } + + public String bit(int value) { + StringBuilder bit = new StringBuilder(); + + while (value > 0) { + bit.insert(0, value % 2); + value = value / 2; + } + + return bit.toString(); + } + +} + diff --git "a/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\277\274\353\223\234_\354\225\225\354\266\225_\355\233\204_\352\260\234\354\210\230_\354\204\270\352\270\260.java" "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\277\274\353\223\234_\354\225\225\354\266\225_\355\233\204_\352\260\234\354\210\230_\354\204\270\352\270\260.java" new file mode 100644 index 0000000..4de0e5c --- /dev/null +++ "b/week15/\354\235\264\354\203\201\354\226\265/progarmmers/\354\277\274\353\223\234_\354\225\225\354\266\225_\355\233\204_\352\260\234\354\210\230_\354\204\270\352\270\260.java" @@ -0,0 +1,43 @@ +/** + * PackageName : week15.이상억.progarmmers; + * FileName : 쿼드_압축_후_개수_세기 + * Author : sangeok + * Date : 2025. 08. 07. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 07. sangeok Initial creation + */ + +class Solution { + int[] answer = new int[2]; // [0의 개수, 1의 개수] + + public int[] solution(int[][] arr) { + compress(arr, 0, 0, arr.length); + return answer; + } + + void compress(int[][] arr, int x, int y, int size) { + if (isAllSame(arr, x, y, size)) { + answer[arr[x][y]]++; // 0 또는 1 중 하나 + return; + } + + int newSize = size / 2; + compress(arr, x, y, newSize); // 왼쪽 위 + compress(arr, x + newSize, y, newSize); // 오른쪽 위 + compress(arr, x, y + newSize, newSize); // 왼쪽 아래 + compress(arr, x + newSize, y + newSize, newSize); // 오른쪽 아래 + } + + boolean isAllSame(int[][] arr, int x, int y, int size) { + int value = arr[x][y]; + for (int i = x; i < x + size; i++) { + for (int j = y; j < y + size; j++) { + if (arr[i][j] != value) return false; + } + } + return true; + } +} diff --git "a/week15_a/\352\260\225\354\204\261\354\232\261/programmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" "b/week15_a/\352\260\225\354\204\261\354\232\261/programmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" new file mode 100644 index 0000000..6ddd18b --- /dev/null +++ "b/week15_a/\352\260\225\354\204\261\354\232\261/programmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" @@ -0,0 +1,81 @@ +package week15_a.강성욱.programmers; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * PackageName : week15_a.강성욱.programmers + * FileName : 둘만의_암호 + * Author : Baekgwa + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-08 Baekgwa Initial creation + */ +public class 둘만의_암호 { + class Solution { + // public String solution(String s, String skip, int index) { + // //skip 확인용 set. + // //set에 들어있으면, 스킵해야함 + // Set skipSet = new HashSet<>(); + // for(Character c : skip.toCharArray()) { + // skipSet.add(c); + // } + + // StringBuilder sb = new StringBuilder(); + + // for(Character c : s.toCharArray()) { + // if(skipSet.contains(c)) { + // sb.append(c); + // continue; + // } + + // sb.append(convertByIndex(c, index)); + // } + + // return sb.toString(); + // } + + // // index 만큼 c를 미루는 메소드 + // // z + 1(index) => a 가 되어야함. + // // c = a + // // c - 'a' + index % 26 + // // a b c d e f g h i j k l m n o p q r s t u v w x y z //26개네 + // private char convertByIndex(Character C, int index) { + // char c = C.charValue(); + // return (char)((c-'a'+index)%26 + 'a'); + // } + + //아 문제 잘못읽음 ㅠㅜ + public String solution(String s, String skip, int index) { + List aplList = new ArrayList<>(); + + Set skipSet = new HashSet<>(); + for(Character c : skip.toCharArray()) { + skipSet.add(c); + } + + for(char c = 'a'; c <= 'z'; c++) { + if(skipSet.contains(c)) continue; + aplList.add(c); + } + + StringBuilder sb = new StringBuilder(); + for(char c : s.toCharArray()) { + sb.append(convertByIndex(c, index, aplList)); + } + + return sb.toString(); + } + + private char convertByIndex(char c, int index, List aplList) { + int nowIdx = aplList.indexOf(c); + int convertedIdx = (nowIdx + index) % aplList.size(); + return aplList.get(convertedIdx); + } + } +} diff --git "a/week15_a/\352\260\225\354\204\261\354\232\261/programmers/\353\246\254\354\275\224\354\263\207_\353\241\234\353\264\207.java" "b/week15_a/\352\260\225\354\204\261\354\232\261/programmers/\353\246\254\354\275\224\354\263\207_\353\241\234\353\264\207.java" new file mode 100644 index 0000000..f727951 --- /dev/null +++ "b/week15_a/\352\260\225\354\204\261\354\232\261/programmers/\353\246\254\354\275\224\354\263\207_\353\241\234\353\264\207.java" @@ -0,0 +1,109 @@ +package week15_a.강성욱.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week15_a.강성욱.programmers + * FileName : 리코쳇_로봇 + * Author : Baekgwa + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-08 Baekgwa Initial creation + */ +public class 리코쳇_로봇 { + class Solution { + + public static final int[] dx = new int[]{0, 0, -1, 1}; + public static final int[] dy = new int[]{-1, 1, 0, 0}; + public static int maxY = 0; + public static int maxX = 0; + + public int solution(String[] board) { + maxY = board.length; + maxX = board[0].length(); + int sx = 0, sy = 0; + boolean[][] visited = new boolean[maxY][maxX]; + char[][] map = new char[maxY][maxX]; + + //map 으로 변환 및 시작지점, 도착지점 저장 + for(int y = 0; y < maxY; y++) { + char[] cArray = board[y].toCharArray(); + for(int x=0; x q = new LinkedList<>(); + q.offer(new Point(sx, sy, 0)); + visited[sy][sx] = true; + + //bfs로 4방향 이동 + while(!q.isEmpty()) { + Point nowPoint = q.poll(); + //도착지점 걸리면 return + if(map[nowPoint.getY()][nowPoint.getX()] == 'G') return nowPoint.getDepth(); + + //4방향 이동 시작 + //그냥 마음속으로, 상-하-좌-우 순서로 보자 + for(int dir=0; dir<4; dir++) { + Point nextPoint = calculateNextPoint(nowPoint, dir, map); + if(isDenied(nextPoint, visited)) continue; + visited[nextPoint.getY()][nextPoint.getX()] = true; + q.offer(nextPoint); + } + } + + //중간에 탈출 못하고 다 진행하면 목적지 도달 불가임 + return -1; + } + + // 현재 방향(dir 상-하-좌-우 순서)로 map 최대 거리까지 가는 좌표 Point return + private Point calculateNextPoint(Point nowPoint, int dir, char[][] map) { + int nx = nowPoint.getX(); + int ny = nowPoint.getY(); + + while(true) { + int nextX = nx + dx[dir]; + int nextY = ny + dy[dir]; + + if(nextX < 0 || nextY < 0 || nextX >= maxX || nextY >= maxY) break; + if(map[nextY][nextX] == 'D') break; + + nx = nextX; + ny = nextY; + } + + return new Point(nx, ny, nowPoint.getDepth() + 1); + } + + // 갈수 있는 곳인지, 들린곳인지 확인하는 메서드 + private boolean isDenied(Point point, boolean[][] visited) { + return visited[point.getY()][point.getX()]; + } + + private static class Point { + private int x; + private int y; + private int depth; + + public Point(int x, int y, int depth) { + this.x = x; + this.y = y; + this.depth = depth; + } + + public int getX() { return this.x; } + public int getY() { return this.y; } + public int getDepth() { return this.depth; } + } + } +} diff --git "a/week15_a/\352\271\200\353\202\230\354\235\200/programmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" "b/week15_a/\352\271\200\353\202\230\354\235\200/programmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" new file mode 100644 index 0000000..2687991 --- /dev/null +++ "b/week15_a/\352\271\200\353\202\230\354\235\200/programmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" @@ -0,0 +1,36 @@ +package week15_a.김나은.programmers; + +public class 둘만의_암호 { + + class Solution { + + public String solution(String s, String skip, int index) { + // 변환된 문자열을 담을 StringBuilder + StringBuilder sb = new StringBuilder(); + + // 주어진 문자열 s의 각 문자를 순회 + for (char ch : s.toCharArray()) { + // skip에 없는 알파벳을 몇 번 건너뛰었는지 세는 변수 + int count = 0; + + // count가 index에 도달할 때까지 반복 + while (count < index) { + // 현재 문자가 'z'라면 'a'부터 다시 시작 (알파벳 순환) + if (ch == 'z') { + ch = 'a'; + } else { + ch++; // 다음 알파벳으로 이동 + } + // skip 문자열에 현재 ch가 없으면 count 증가 + // skip에 있으면 그냥 건너뛰기 (count 증가 안함) + if (!skip.contains(String.valueOf(ch))) { + count++; + } + } + // index만큼 건너뛴 최종 문자 추가 + sb.append(ch); + } + return sb.toString(); + } + } +} \ No newline at end of file diff --git "a/week15_a/\352\271\200\353\210\204\353\246\254/programmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" "b/week15_a/\352\271\200\353\210\204\353\246\254/programmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" new file mode 100644 index 0000000..adb8b49 --- /dev/null +++ "b/week15_a/\352\271\200\353\210\204\353\246\254/programmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" @@ -0,0 +1,71 @@ +package week15_a.김누리.programmers; + +import java.util.HashSet; +import java.util.Set; + +/** + * PackageName : week15_a.김누리.programmers + * FileName : 둘만의_암호 + * Author : 김누리(NRKim) + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 08. 김누리(NRKim) Initial creation + */ + +/* +s = a u k k s +skip = w b q d +index = 5 + +변환 시작 + +a + 5 > c e f g h +u + 5 > v x y z a +k + 5 > l m n o p +k + 5 > l m n o p +s + 5 > t u v x y + +*/ + +public class 둘만의_암호 { + public String solution(String s, String skip, int index) { + String answer = ""; + Set skipped = new HashSet<>(); // 스킵용 문자열 + char[] ch = s.toCharArray(); // 문자열 쪼개기 + StringBuilder sb = new StringBuilder(); + + + for(char c : skip.toCharArray()) { + skipped.add(c); + } + + // 로직 시작 + for(char c : ch) { + // 진행 횟수 + int cnt = 0; + + while(cnt < index) { + c++; + + // z 넘어가면 a 로 + if( c > 'z') { + c = 'a'; + } + + // 스킵 문자열에 포함되는지 확인 + if(skipped.contains(c)) { + continue; + } + + cnt++; + } + sb.append(c); + + } + + return sb.toString(); + } +} diff --git "a/week15_a/\352\271\200\353\210\204\353\246\254/programmers/\353\246\254\354\275\224\354\263\207_\353\241\234\353\264\207.java" "b/week15_a/\352\271\200\353\210\204\353\246\254/programmers/\353\246\254\354\275\224\354\263\207_\353\241\234\353\264\207.java" new file mode 100644 index 0000000..75a842f --- /dev/null +++ "b/week15_a/\352\271\200\353\210\204\353\246\254/programmers/\353\246\254\354\275\224\354\263\207_\353\241\234\353\264\207.java" @@ -0,0 +1,109 @@ +package week15_a.김누리.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week15_a.김누리.programmers + * FileName : 리코쳇_로봇 + * Author : 김누리(NRKim) + * Date : 2025-08-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 08. 김누리(NRKim) Initial creation + */ + +/* +좌표가 제공되니까... bfs로 풀이가 가능할거 같은데... + +board가 String[]으로 오니 아싸리 그냥 이차원 배열로 분해 하고 + +n, m 값 구해서 진행 하면 될듯. + +이 과정에서 R의 위치, D의 위치, G의 위치 파악하며 D면 장애물이니 못가는 걸로 생각 하면 된다. +*/ + +public class 리코쳇_로봇 { + int n; + int m; + boolean[][] visited; + int[] dx = {1,-1,0,0}; + int[] dy = {0,0,1,-1}; + + public int solution(String[] board) { + Queue q = new LinkedList<>(); + String[][] boards = new String[board.length][]; + + // board 2차원 배열화 + int idx = 0; + for(String b : board) { + boards[idx++] = b.split(""); + } + + n = boards.length; // x축 길이 + m = boards[0].length; // y축 길이 + + int[] start = {}; + int[] end = {}; + + // 시작점 && 끝점 파악 + for(int i = 0; i < boards.length; i++) { + for(int j = 0; j < boards[i].length; j++) { + // 시작점 위치 + if (boards[i][j].equals("R")) { + start = new int[] {i,j}; + } + + // 끝점 위치 + if (boards[i][j].equals("G")) { + end = new int[] {i,j}; + } + } + } + visited = new boolean[n][m]; + + q.offer(new int[] {start[0], start[1], 0}); + + while(!q.isEmpty()) { + int[] now = q.poll(); + int x = now[0]; + int y = now[1]; + int cnt = now[2]; + + // 끝점(G) 도달 시 리턴 + if ( x == end[0] && y == end[1]) return cnt; + + for(int i = 0; i < 4; i++) { + int nx = x; + int ny = y; + + // D를 만나기 전 까지 쭈욱 이동 + while(true) { + int tx = nx + dx[i]; + int ty = ny + dy[i]; + + // 범위 밖 + if(tx < 0 || tx >= n || ty < 0 || ty >= m) break; + + // 장애물(D) 조우 + if (boards[tx][ty].equals("D")) break; + + nx = tx; + ny = ty; + } + + // 현재위치 스킵 + if (visited[nx][ny]) continue; + + visited[nx][ny] = true; + q.offer(new int[] {nx,ny,cnt+1}); + } + + } + + // 도달할 수 없음 + return -1; + } +} diff --git "a/week15_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" "b/week15_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" new file mode 100644 index 0000000..c0c176d --- /dev/null +++ "b/week15_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\221\230\353\247\214\354\235\230_\354\225\224\355\230\270.java" @@ -0,0 +1,43 @@ +// 1번키 한번 누르면 a 두번 누르면 b 세번 누르면 c +// 키의 개수 1 ~ 100 + +// 배열 인덱스로 해시맵 만들면 될 듯 + +import java.util.*; + +class Solution { + public int[] solution(String[] keymap, String[] targets) { + + int[] answer = new int[targets.length]; + + Map map = new HashMap<>(); + + for(String keys : keymap) { + for(int i = 0 ; i < keys.length(); i++){ + char c = keys.charAt(i); + int touchcount = i + 1; + + map.put(c, Math.min(map.getOrDefault(c, Integer.MAX_VALUE), touchcount)); + } + } + + for(int i = 0 ; i < targets.length; i ++){ + String target = targets[i]; + int total = 0; + boolean ip = false; + + for(char c : target.toCharArray()){ + if(map.containsKey(c)){ + total += map.get(c); + } else { + total =-1; + ip = true; + break; + } + } + answer[i] = total; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week15_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\246\254\354\275\224\354\263\207_\353\241\234\353\264\207.java" "b/week15_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\246\254\354\275\224\354\263\207_\353\241\234\353\264\207.java" new file mode 100644 index 0000000..5e64e24 --- /dev/null +++ "b/week15_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\246\254\354\275\224\354\263\207_\353\241\234\353\264\207.java" @@ -0,0 +1,72 @@ +// . : 빈 공간 , R : 로봇의 처음 위치, D : 장애물의 위치 , G : 목표 지점 + +import java.util.*; + +class Solution { + int[] dx = {-1, 1 , 0, 0}; + int[] dy = {0 , 0 , -1, 1}; + public int solution(String[] board) { + int answer = 0; + + int n = board.length; + int m = board[0].length(); + + int start_x = 0; + int start_y = 0; + + int end_x = 0; + int end_y = 0; + + for(int i = 0; i < n; i++){ + for(int j = 0; j < m; j++){ + if(board[i].charAt(j) == 'R'){ + start_x = i; + start_y = j; + } else if(board[i].charAt(j) == 'G'){ + end_x = i; + end_y = j; + } + } + } + + boolean[][] visited = new boolean[n][m]; + + Queue qe = new LinkedList<>(); + qe.offer(new int[]{start_x,start_y,0}); + visited[start_x][start_y] = true; + + while(!qe.isEmpty()){ + int[] cur = qe.poll(); + int x = cur[0]; + int y = cur[1]; + int count = cur[2]; + + for(int i = 0; i < 4; i++){ + int nx = x; + int ny = y; + + while(true){ + int vx = nx + dx[i]; + int vy = ny + dy[i]; + + if( vx < 0 || vx >= n || vy < 0 || vy >= m || board[vx].charAt(vy) == 'D') break; + + nx = vx; + ny = vy; + + } + if( (nx == end_x) & (ny == end_y)) return count + 1; + + + if(!visited[nx][ny]){ + visited[nx][ny] = true; + qe.offer(new int[]{nx,ny,count+1}); + } + } + + + } + + return -1; + } +} \ No newline at end of file diff --git "a/week16/\352\260\225\354\204\261\354\232\261/backjoon/\353\247\210\353\235\274\355\206\244_1.java" "b/week16/\352\260\225\354\204\261\354\232\261/backjoon/\353\247\210\353\235\274\355\206\244_1.java" new file mode 100644 index 0000000..a1fc21f --- /dev/null +++ "b/week16/\352\260\225\354\204\261\354\232\261/backjoon/\353\247\210\353\235\274\355\206\244_1.java" @@ -0,0 +1,65 @@ +package week16.강성욱.backjoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * PackageName : week16.강성욱.backjoon + * FileName : 마라톤_1 + * Author : Baekgwa + * Date : 2025-08-12 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-12 Baekgwa Initial creation + */ +public class 마라톤_1 { + //체크포인트를 모두 건너간다. + // 그 중, 가장 큰 이동거리를 가지는 체크포인트를 기억해두기. + // 그 체크포인트를 위해 이동한 A -> B -> C 만큼의 거리를 제거하고 + // A -> C 로 이동하는 거리 계산해서 추가. + + 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()); + int maxSave = 0; + int sum = 0; + int maxIdx = 0; + + int[][] map = new int[n][2]; + for (int i = 0; i < n; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + map[i][0] = Integer.parseInt(st.nextToken()); + map[i][1] = Integer.parseInt(st.nextToken()); + } + + for (int i = 0; i < n - 1; i++) { + int nowDistance = calDistance(map[i], map[i + 1]); + sum += nowDistance; + + // 처음과 마지막 체크포인트는 건너뛰기 불가 + if (i == 0 || i == n - 1) continue; + + // 절약할 거리 계산. + int save = calDistance(map[i - 1], map[i]) + + calDistance(map[i], map[i + 1]) + - calDistance(map[i - 1], map[i + 1]); + + if (save > maxSave) { + maxSave = save; + maxIdx = i; + } + } + + System.out.println(sum - maxSave); + } + + private static int calDistance(int[] from, int[] to) { + return Math.abs(from[0] - to[0]) + Math.abs(from[1] - to[1]); + } + } +} diff --git "a/week16/\352\260\225\354\204\261\354\232\261/backjoon/\355\232\214\354\235\230\354\213\244_\353\260\260\354\240\225.java" "b/week16/\352\260\225\354\204\261\354\232\261/backjoon/\355\232\214\354\235\230\354\213\244_\353\260\260\354\240\225.java" new file mode 100644 index 0000000..26cfd62 --- /dev/null +++ "b/week16/\352\260\225\354\204\261\354\232\261/backjoon/\355\232\214\354\235\230\354\213\244_\353\260\260\354\240\225.java" @@ -0,0 +1,52 @@ +package week16.강성욱.backjoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +/** + * PackageName : week16.강성욱.backjoon + * FileName : 회의실_배정 + * Author : Baekgwa + * Date : 2025-08-12 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-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)); + + int n = Integer.parseInt(br.readLine()); + int[][] info = new int[n][2]; // idx 0 = 시작, idx-1 = 종료 + + for(int i=0; i { + if(a[1] == b[1]) return Integer.compare(a[0], b[0]); + return Integer.compare(a[1], b[1]); + }); + + int endTime = 0; + int cnt = 0; + for(int[] now : info) { + + // 만약, 마지막에 넣은 회의가 아직 끝나지 않았다면, 처리 불가 + int nowStartTime = now[0]; + if(endTime > nowStartTime) continue; + cnt++; + endTime = now[1]; + } + + System.out.println(cnt); + } + } +} diff --git "a/week16/\352\260\225\354\204\261\354\232\261/programmers/n\354\247\204\354\210\230_\352\262\214\354\236\204.java" "b/week16/\352\260\225\354\204\261\354\232\261/programmers/n\354\247\204\354\210\230_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..7bc8342 --- /dev/null +++ "b/week16/\352\260\225\354\204\261\354\232\261/programmers/n\354\247\204\354\210\230_\352\262\214\354\236\204.java" @@ -0,0 +1,53 @@ +package week16.강성욱.programmers; + +/** + * PackageName : week16.강성욱.backjoon + * FileName : n진수_게임 + * Author : Baekgwa + * Date : 2025-08-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-13 Baekgwa Initial creation + */ +public class n진수_게임 { + // class Solution { + // public String solution(int n, int t, int m, int p) { + // StringBuilder sb = new StringBuilder(); + // StringBuilder result = new StringBuilder(); + + // for(int number=0; number<=t; number++) { + // sb.append(Integer.toString(number, n).toUpperCase()); + // } + + // int loopCnt = (sb.length() / m); + // if(sb.length() % m >= p) loopCnt++; + + // for(int i = 0; i 10 으로 바꿔야되네 + + long[] result = new long[numbers.length]; + + for(int idx=0; idx= 0; i--) { + if (bits[i] == '0') { + bits[i] = '1'; + bits[i + 1] = '0'; + changed = true; + break; + } + } + + if (!changed) { + return Long.parseLong("10" + binary.substring(1), 2); + } + + return Long.parseLong(new String(bits), 2); + } + } +} diff --git "a/week16/\352\260\225\354\204\261\354\232\261/programmers/\353\260\251\352\270\210\352\267\270\352\263\241.java" "b/week16/\352\260\225\354\204\261\354\232\261/programmers/\353\260\251\352\270\210\352\267\270\352\263\241.java" new file mode 100644 index 0000000..56f8c3c --- /dev/null +++ "b/week16/\352\260\225\354\204\261\354\232\261/programmers/\353\260\251\352\270\210\352\267\270\352\263\241.java" @@ -0,0 +1,132 @@ +package week16.강성욱.programmers; + +/** + * PackageName : week16.강성욱.programmers + * FileName : 방금그곡 + * Author : Baekgwa + * Date : 2025-08-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-13 Baekgwa Initial creation + */ +public class 방금그곡 { + // // 음 musicinfos 의 3번째 인덱스 값을 들리는 만큼 그냥 길게 붙여주고 contain 검사? + + // import java.util.*; + + // class Solution { + // public String solution(String m, String[] musicinfos) { + // String result = ""; + + // for(String musicInfo : musicinfos) { + // StringBuilder repeatMelody = new StringBuilder(); + + // String[] musicInfoArray = musicInfo.split(","); + // int musicLength = calcMusicLength(musicInfoArray[0], musicInfoArray[1]); // 시작부터 끝까지 몇초 + // String nowMelody = musicInfoArray[3]; + // // 현재 멜로디를 반복하기 편하도록 array 로 만들기. 즉, C, C#, D, D#, E, F, F#, G, G#, A, A#, B 등, # 고려해서 저장 + // String[] nowMelodyArray = convertArray(nowMelody); + // for(int i=0; i list = new ArrayList<>(); + + // int idx = 0; + // for(char c : melody.toCharArray()) { + // // # 이면 이전 인덱스에 # 붙이기 + // if(c == '#') { + // list.set(idx - 1, list.get(idx - 1) + c); + // continue; + // } + // list.add(String.valueOf(c)); + // idx++; + // } + + // String[] result = new String[list.size()]; + // for(int i=0; i resultPlayTime) { + result = nowMusicName; + resultPlayTime = nowPlayTime; + } + } + + return result; + } + + private String convertShap(String str) { + return + str.replace("C#", "c") + .replace("D#", "d") + .replace("F#", "f") + .replace("G#", "g") + .replace("A#", "a") + .replace("B#", "b") // 아니 이거 어이가 없네 지문에 없는데 이거 넣어야 통과네ㅋㅋㅋ + .replace("E#", "e") // 아니 이거 어이가 없네 지문에 없는데 이거 넣어야 통과네ㅋㅋㅋ + ; + } + + private String makeRepeatString(String str, int cnt) { + StringBuilder sb = new StringBuilder(); + + for(int i=0; i map = new HashMap<>(); //key : 의상 종류, value = 의상 이름 list + + for(String[] cloth : clothes) { + String clothType = cloth[1]; + map.put(clothType, map.getOrDefault(clothType, 0) + 1); + } + + int result = 1; + for(int cnt : map.values()) { + result *= cnt + 1; + } + + return result - 1; + } + } +} diff --git "a/week16/\352\260\225\354\204\261\354\232\261/programmers/\354\272\220\354\213\234.java" "b/week16/\352\260\225\354\204\261\354\232\261/programmers/\354\272\220\354\213\234.java" new file mode 100644 index 0000000..9535593 --- /dev/null +++ "b/week16/\352\260\225\354\204\261\354\232\261/programmers/\354\272\220\354\213\234.java" @@ -0,0 +1,80 @@ +package week16.강성욱.programmers; + +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.PriorityQueue; + +/** + * PackageName : week16.강성욱.programmers + * FileName : 캐시 + * Author : Baekgwa + * Date : 2025-08-14 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-14 Baekgwa Initial creation + */ +public class 캐시 { + // class Solution { + // public int solution(int cacheSize, String[] cities) { + // PriorityQueue pq = new PriorityQueue<>(Comparator.comparingInt(CityCache::getUsedTime)); + // + // int runningTime = 0; + // + // for (int time = 0; time < cities.length; time++) { + // String nowCity = cities[time]; + // + // // 캐시 히트 상황 + // if(pq.contains(nowCity)) { + // } + // } + // } + // + // public static class CityCache { + // private int usedTime; + // private String city; + // + // public CityCache(int usedTime, String city) { + // this.usedTime = usedTime; + // this.city = city; + // } + // + // public int getUsedTime() { + // return usedTime; + // } + // + // public String getCity() { + // return city; + // } + // } + // } + class Solution { + public int solution(int cacheSize, String[] cities) { + Map map = new LinkedHashMap<>(cacheSize); + + int runningTime = 0; + for(String city : cities) { + city = city.toLowerCase(); + + //캐시 히트 확인 + if(map.containsKey(city)) { + runningTime += 1; + map.remove(city); //지우고 다시 넣기 + map.put(city, 0); + } else { // 캐시 미스 + runningTime += 5; + map.put(city, 0); + // 크기가 더 크면 삭제 + if (map.size() > cacheSize) { + String firstKey = map.keySet().iterator().next(); + map.remove(firstKey); + } + } + } + + return runningTime; + } + } +} \ No newline at end of file diff --git "a/week16/\352\260\225\354\204\261\354\232\261/programmers/\355\214\214\354\235\274\353\252\205_\354\240\225\353\240\254.java" "b/week16/\352\260\225\354\204\261\354\232\261/programmers/\355\214\214\354\235\274\353\252\205_\354\240\225\353\240\254.java" new file mode 100644 index 0000000..ebffd6e --- /dev/null +++ "b/week16/\352\260\225\354\204\261\354\232\261/programmers/\355\214\214\354\235\274\353\252\205_\354\240\225\353\240\254.java" @@ -0,0 +1,108 @@ +package week16.강성욱.programmers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week16.강성욱.backjoon + * FileName : 파일명_정렬 + * Author : Baekgwa + * Date : 2025-08-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-13 Baekgwa Initial creation + */ +public class 파일명_정렬 { + // 일딴, 3가지로 나눠야함. + // Head, Number, [Tail] 부 + // 각 부는, 없을 수도 있나? + // 숫자는 반드시 있다고 하기 대문에, number 까지는 있을꺼임. 단, tail 부는 없을 수도 있음. + // 심지어 정렬 순서에 tail 부는 없어도 되기 때문에, 저장만 해두면 될듯. + // 정렬 우선순위는 Head + //Head -> 사전순 정렬. 단 대소문자 구분하지 않으므로 underCase 및 UpperCase 변환 후 정렬검사가 필요. + //Number 는, 숫자 정렬. 앞숫자 무시이니깐, long 으로 변환해서 사용하는걸로 + //Tail은, 고려하지 않아도 됨. 원래 입력에 주어진 순서를 유지 + + class Solution { + public String[] solution(String[] files) { + String[] result = new String[files.length]; + List fileList = new ArrayList<>(); + + for(String file : files) { + fileList.add(new CustomFile(div(file))); + } + + Collections.sort(fileList); + + int idx = 0; + for(CustomFile c : fileList) { + result[idx++] = c.getOrdinalFileName(); + } + + return result; + } + + private String[] div(String file) { + boolean isNumberStart = false; + boolean isNumberEnd = false; + StringBuilder sbHead = new StringBuilder(); + StringBuilder sbNumber = new StringBuilder(); + StringBuilder sbTail = new StringBuilder(); + + int i = 0; + for(char c : file.toCharArray()) { + if(isNumberStart == false && !Character.isDigit(c) && !isNumberEnd) { + sbHead.append(c); + continue; + } else if(Character.isDigit(c) && !isNumberEnd) { + isNumberStart = true; + sbNumber.append(c); + if (sbNumber.length() == 5) { //숫자는 최대 5자리 + isNumberEnd = true; + } + } else { + isNumberEnd = true; + sbTail.append(c); + } + } + // 잘 나눴는지 확인용 출력 + // System.out.printf(file + " : "); + // System.out.printf(sbHead.toString() + ", " + sbNumber.toString() + ", " + sbTail.toString()); + // System.out.printf("\n"); + return new String[]{ sbHead.toString(), sbNumber.toString(), sbTail.toString() }; + } + + public static class CustomFile implements Comparable { + private String head; + private String number; + private String tail; + + public CustomFile (String[] arr) { + this.head = arr[0]; + this.number = arr[1]; + this.tail = arr[2]; + } + + public String getOrdinalFileName() { + return this.head + this.number + this.tail; + } + + @Override + public int compareTo(CustomFile o) { + int headCompare = this.head.toLowerCase().compareTo(o.head.toLowerCase()); + if (headCompare != 0) return headCompare; + + int numCompare = Integer.compare( + Integer.parseInt(this.number), + Integer.parseInt(o.number) + ); + if (numCompare != 0) return numCompare; + + return 0; + } + } + } +} diff --git "a/week16/\352\271\200\353\202\230\354\235\200/programmers/\354\235\230\354\203\201.java" "b/week16/\352\271\200\353\202\230\354\235\200/programmers/\354\235\230\354\203\201.java" new file mode 100644 index 0000000..5fc170c --- /dev/null +++ "b/week16/\352\271\200\353\202\230\354\235\200/programmers/\354\235\230\354\203\201.java" @@ -0,0 +1,31 @@ +package week16.김나은.programmers; + +import java.util.HashMap; +import java.util.Map; + +public class 의상 { + + class Solution { + + public int solution(String[][] clothes) { + + // 의상 종류별 개수를 저장할 Map + Map map = new HashMap<>(); + + // clothes 배열 순회하면서 종류별 개수 세기 + for (String[] c : clothes) { + // 이미 해당 종류가 있으면 +1, 없으면 0에서 시작해서 +1 + map.put(c[1], map.getOrDefault(c[1], 0) + 1); + } + + // 조합 계산을 위한 초기값 (곱셈이니까 1로 시작) + int answer = 1; + + for (int v : map.values()) { + answer *= (v + 1); // 해당 아이템을 안입는 경우를 포함해야 하므로 + 1 해줌 + } + + return answer - 1; // 모든 아이템을 착용하지 않는 경우를 빼야하므로 - 1 + } + } +} \ No newline at end of file diff --git "a/week16/\352\271\200\353\202\230\354\235\200/programmers/\354\235\274\354\260\250_\354\272\220\354\213\234.java" "b/week16/\352\271\200\353\202\230\354\235\200/programmers/\354\235\274\354\260\250_\354\272\220\354\213\234.java" new file mode 100644 index 0000000..95df4b5 --- /dev/null +++ "b/week16/\352\271\200\353\202\230\354\235\200/programmers/\354\235\274\354\260\250_\354\272\220\354\213\234.java" @@ -0,0 +1,43 @@ +package week16.김나은.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +public class 일차_캐시 { + + class Solution { + + public int solution(int cacheSize, String[] cities) { + // 총 실행 시간 저장 변수 + int answer = 0; + + // 캐시를 큐로 구현 (FIFO 구조 사용, 실제 LRU 동작은 remove & offer로 보완) + Queue cache = new LinkedList<>(); + + // 입력받은 도시 cities 순회 + for (String s : cities) { + s = s.toLowerCase(); // 대소문자 구분 없이 처리하기 위해 소문자로 변환 + + if (cache.contains(s)) { + // 캐시에 해당 도시가 이미 존재 (cache hit) -> + 1 + answer++; + cache.remove(s); // 기존 위치에서 제거 + cache.offer(s); // 최근 사용으로 갱신 (맨 뒤로 이동) + } else { + // 캐시에 해당 도시가 없음 (cache miss) -> + 5 + answer += 5; + // 캐시가 꽉 차 있으면 가장 오래된 데이터 제거 + if (cache.size() == cacheSize) { + cache.poll(); // 맨 앞(오래된 데이터) 제거 + } + // 캐시 크기가 0이 아닐 경우만 새로운 도시 추가 + if (cache.size() < cacheSize) { + cache.offer(s); + } + } + } + + return answer; + } + } +} \ No newline at end of file diff --git "a/week16/\352\271\200\353\210\204\353\246\254/baekjoon/\353\247\210\353\235\274\355\206\244_1.java" "b/week16/\352\271\200\353\210\204\353\246\254/baekjoon/\353\247\210\353\235\274\355\206\244_1.java" new file mode 100644 index 0000000..49968cb --- /dev/null +++ "b/week16/\352\271\200\353\210\204\353\246\254/baekjoon/\353\247\210\353\235\274\355\206\244_1.java" @@ -0,0 +1,83 @@ +package week16.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.StringTokenizer; + +/** + * PackageName : week16.김누리.baekjoon + * FileName : 마라톤_1 + * Author : 김누리(NRKim) + * Date : 2025-08-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 13. 김누리(NRKim) Initial creation + */ + +/* +* +* 1번쨰 줄 : 체크 포인트 수 +* 2 ~ N번쨰 줄 > x좌표 y좌표 +* +* 로직 흐름 +* +* 시작 ==> 0 0 : (0,0) +* +* 0,0 -> 8,3 -> 10,0 ==> 이동 거리 : 0,0 -> 8,3 (8 +3 == 11), 8,3 -> 10,0 (2 + (3) == 5) == 16 +* 0,0 -> 11 ,1 -> 10,0 ==> 이동 거리 : 14 +* +* 거리 = (x2 - x1) + (y2 - y1) +*/ + +public class 마라톤_1 { + static class Spot { + int x, y; + + Spot(int x, int y) {this.x = x; this.y = y;} + } + + public static int dist(Spot a, Spot b ) { + return Math.abs(a.x - b.x) + Math.abs(a.y - b.y); + } + + public static void main (String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + int n = Integer.parseInt(br.readLine()); // 1번째 줄이 총 체크포인트 갯수 + + // 체크 포인트 관리용 배열 + Spot[] arr = new Spot[n]; + + // 배열에 위치 정리 + for(int i = 0; i < arr.length; i++) { + StringTokenizer token = new StringTokenizer(br.readLine()); + int left = Integer.parseInt(token.nextToken()); + int right = Integer.parseInt(token.nextToken()); + arr[i] = new Spot(left,right); + } + + // 전체 거리 + int total = 0; + + // 전체 거리 계산 + for(int i = 1; i < n; i++) { + total += dist(arr[i-1],arr[i]); + } + + int max = 0; + // 스킵 포인트 별 거리 계산 + for(int i = 1; i < n - 1; i++) { + int keep = dist(arr[i-1],arr[i]) + dist(arr[i],arr[i+1]); + int skip = dist(arr[i-1],arr[i+1]); + max = Math.max(max,keep - skip); + } + + bw.write(String.valueOf(total-max)); + bw.flush(); + bw.close(); + } +} diff --git "a/week16/\352\271\200\353\210\204\353\246\254/baekjoon/\355\232\214\354\235\230\354\213\244_\353\260\260\354\240\225.java" "b/week16/\352\271\200\353\210\204\353\246\254/baekjoon/\355\232\214\354\235\230\354\213\244_\353\260\260\354\240\225.java" new file mode 100644 index 0000000..6d37688 --- /dev/null +++ "b/week16/\352\271\200\353\210\204\353\246\254/baekjoon/\355\232\214\354\235\230\354\213\244_\353\260\260\354\240\225.java" @@ -0,0 +1,96 @@ +package week16.김누리.baekjoon; + +import static java.util.Arrays.*; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.StringTokenizer; + +/** + * PackageName : week16.김누리.baekjoon + * FileName : 회의실_배정 + * Author : 김누리(NRKim) + * Date : 2025-08-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 13. 김누리(NRKim) Initial creation + */ + + +/* +* +* 1번째 줄 = 사용할 수 있는 회의실의 총 갯수 +* +*예) 1 4 >> 1 : 회의 시작시간 4 : 회의 끝시간 +* +* 처음에 1 4 입장 +* +* 다음 3 5 >> 1 4 와 시간 겹침 못씀 +* +* 0 6 >> 시간이 겹치게 되어 못씀 +* +* 5 7 >> 1 4와 시간이 안겹침 5 7 이용 가능 >> 현재 1 4, 5 7 +* +* 3 8 >> 시간이 겹침 1 3 4 5 7 8 >> 불가 +* 5 9 >> 시간이 겹침 +* +* 6 10 1 4 5 6 7 >> 5-7과 시간이 겹침 +* +* 8 11 >> 시간이 겹치지 않음 1 4 5 7 8 11 +* 8 12 >> 8 11과 겹쳐서 안됨 +* 2 13 >> 시간 겹침 +* 12 14 >> 1 4 5 7 8 11 12 14 +* +* ※ 그래서 1 4, 5 7, 8 11, 12 14로 등록이 가능 +* +*/ + +public class 회의실_배정 { + static class Meeting { + int s,e; + Meeting(int s, int e) {this.s = s; this.e = e; }; + } + + public static void main (String[] args) throws Exception{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + int n = Integer.parseInt(br.readLine().trim()); + + // 회의시간 관리용 배열 + Meeting[] arr = new Meeting[n]; + + // 회의시간 배열에 등록 + for(int i = 0 ;i < arr.length; i++) { + StringTokenizer tk = new StringTokenizer(br.readLine()); + int start = Integer.parseInt(tk.nextToken()); + int end = Integer.parseInt(tk.nextToken()); + arr[i] = new Meeting(start,end); + } + + // 끝시간 기준 배열 정렬 + sort(arr,(a1,a2) -> { + if(a1.e != a2.e) return Integer.compare(a1.e, a2.e); + return Integer.compare(a1.s,a2.s); + }); + + int cnt = 0; + int lastEnd = -1; // 아무도 회의 시간을 회의실에 기록하지 않음 + + for(Meeting m : arr ) { + // 시작시간이 마지막 회의 종료 시간 보다 큰 경우에만 cnt 증가 + if (m.s >= lastEnd) { + cnt++; + lastEnd = m.e; + } + } + + bw.write(String.valueOf(cnt)); + bw.flush(); + bw.close(); + } +} diff --git "a/week16/\352\271\200\353\210\204\353\246\254/programmers/n\354\247\204\354\210\230_\352\262\214\354\236\204.java" "b/week16/\352\271\200\353\210\204\353\246\254/programmers/n\354\247\204\354\210\230_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..5882561 --- /dev/null +++ "b/week16/\352\271\200\353\210\204\353\246\254/programmers/n\354\247\204\354\210\230_\352\262\214\354\236\204.java" @@ -0,0 +1,80 @@ +package week16.김누리.programmers; + +/** + * PackageName : week16.김누리.programmers + * FileName : n진수_게임 + * Author : 김누리(NRKim) + * Date : 2025-08-10 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 10. 김누리(NRKim) Initial creation + */ + +/* +n 진법 +t 미리 구할 숫자 갯수 +m 총원 +p 순번 + +case 1 +n = 2 +t = 4 +m = 2 +p = 1 + +2진수 미리 구해야 할 숫자 4개 총원 2명 1번째 +(0) 0 (1) 1 +(10) 2 (11) 3 +(100) 4 (101) 5 +(110) 6 (111) 7 + +0111 1101 + +case 2 + +n = 16 +t = 16 +m = 2 +p = 1 + +(0) 0 (1)1 +(2) 2 (3)3 +(4) 4 (5)5 +(6) 6 (7)7 +(8) 8 (9)9 +(A)10 (B)11 +(C)12 (D)13 +(E)14 (F)15 +(1)16 (0)16 +(1)17 (1)17 +(1)18 (2)18 + +이런 패턴으로 가게 될 거임 + +*/ + +public class n진수_게임 { + public String solution(int n, int t, int m, int p) { + StringBuilder sb = new StringBuilder(); + int num = 0; + + // 진수 변환 다 이어 붙이기 + while(sb.length() < t*m) { + sb.append(Integer.toString(num++, n).toUpperCase()); + } + + + // 진수 변환 후 내 앞에 몇개가 있는지 계산 + StringBuilder sb2 = new StringBuilder(); + int idx = p-1; + + for(int i = 0; i < t; i++) { + sb2.append(sb.charAt(idx)); + idx += m; + } + + return sb2.toString(); + } +} diff --git "a/week16/\352\271\200\353\210\204\353\246\254/programmers/\353\221\220\352\260\234_\354\235\264\355\225\230\353\241\234_\353\213\244\353\245\270_\353\271\204\355\212\270.java" "b/week16/\352\271\200\353\210\204\353\246\254/programmers/\353\221\220\352\260\234_\354\235\264\355\225\230\353\241\234_\353\213\244\353\245\270_\353\271\204\355\212\270.java" new file mode 100644 index 0000000..95e2cb2 --- /dev/null +++ "b/week16/\352\271\200\353\210\204\353\246\254/programmers/\353\221\220\352\260\234_\354\235\264\355\225\230\353\241\234_\353\213\244\353\245\270_\353\271\204\355\212\270.java" @@ -0,0 +1,99 @@ +package week16.김누리.programmers; + +/** + * PackageName : week16.김누리.programmers + * FileName : 두개_이하로_다른_비트 + * Author : 김누리(NRKim) + * Date : 2025-08-10 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 10. 김누리(NRKim) Initial creation + */ + +/* + +1. number[i]를 2진 변환 +2. number[i]를 + 1 후 2진 변환 +3. 1에서 변환한 값과, 2에서 변환한 값을 비교해서 다른 갯수 비교 +4. 2번이랑 3번 비교 했을 때, 다른 값이 2개 이하인가? >> answer[i]에 추가 +5. 아니면 2~4 반복 + + +예) +case 1 : [2,7] +1. number[0] = 2 >> 0010 +2. number[0] + 1 = 3 >> 0011 + +결과 : 1개만 다름 + + +위 방식대로 가면?? timeout 발생 +*/ + + +public class 두개_이하로_다른_비트 { + // 타임아웃 소스 + // public long[] solution(long[] numbers) { + // long[] answer = new long[numbers.length]; + // + // for(int t = 0; t < numbers.length; t++) { + // long n = numbers[t]; + // long a = n + 1; + // + // while (true) { + // String s1 = Long.toBinaryString(n); + // String s2 = Long.toBinaryString(a); + // + // int l = Math.max(s1.length(),s2.length()); + // s1 = String.format("%" + l + "s",s1).replace(' ','0'); + // s2 = String.format("%" + l + "s",s2).replace(' ','0'); + // + // int diff = 0; + // + // for(int i = 0; i < l; i++) { + // if(s1.charAt(i) != s2.charAt(i)) { + // diff++; + // if (diff > 2) break; + // } + // } + // + // if (diff <= 2) { + // answer[t] = a; + // break; + // } + // + // a++; + // + // } + // } + // return answer; + // + // } + + // 비트 연산을 이용한 방법 + public long[] solution(long[] numbers) { + long[] answer = new long[numbers.length]; + + for(int i = 0; i < numbers.length; i++) { + long n = numbers[i]; // 변환 대상 값 + + // 짝수인 경우 + if((n & 1L) == 0) { + // 짝수인 경우 이진수로 표현하면마지막 비트가 0으로 끝남. + // 그래서 1을 더하게 되면 이진수로 변환 시, 맨 마지막 비트가 1로 바뀜 + // 그 결과, n+1이 n보다 크면서 가장 가까운 수이기 때문에 1L을 더해야 함 + answer[i] = n +1L; + } else { + // 이진수 화 했을 떄 마지막이 0인 비트를 탐색 + long z = (~n) & (n + 1L); + + // 비트 우측이동 + answer[i] = n + (z >> 1); + } + } + + return answer; + } +} diff --git "a/week16/\352\271\200\353\210\204\353\246\254/programmers/\353\260\251\352\270\210\352\267\270\352\263\241.java" "b/week16/\352\271\200\353\210\204\353\246\254/programmers/\353\260\251\352\270\210\352\267\270\352\263\241.java" new file mode 100644 index 0000000..552d9b7 --- /dev/null +++ "b/week16/\352\271\200\353\210\204\353\246\254/programmers/\353\260\251\352\270\210\352\267\270\352\263\241.java" @@ -0,0 +1,89 @@ +package week16.김누리.programmers; + +/** + * PackageName : week16.김누리.programmers + * FileName : 방금그곡 + * Author : 김누리(NRKim) + * Date : 2025-08-10 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 10. 김누리(NRKim) Initial creation + */ + + +/* +m = 멜로디 ("ABCDEFG") + +musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"} + +시작 = 12:00 +끝 = 12:14 +제목 HELLO +멜로디 = CDEFGAB + +시작 = 13:00 +끝 = 13:05 +제목 WORLD +멜로디 = ABCDEF + +근데 멜로디 1개당 1분이라 가정하면. HELLO는 멜로디 전체 사이즈가 2번 반복 되야함 +근데 WORLD는 5분이거 멜로디 길이는 6이라 마지막 멜로디가 스킵됨 + + +*/ + +public class 방금그곡 { + public String solution(String m, String[] musicinfos) { + String me = norm(m); + int bestLen = -1; + String bestTitle = "(None)"; + + for(String s : musicinfos) { + String[] tmp = s.split(","); + int start = toSecond(tmp[0]); + int end = toSecond(tmp[1]); + int play = end - start; + String title = tmp[2]; + String melody = tmp[3]; + if (play <= 0) continue; + + String t = norm(melody); + + StringBuilder sb = new StringBuilder(play); + + for(int i = 0; i < play ; i++) { + sb.append(t.charAt(i % t.length())); + } + + String played = sb.toString(); + + if(played.contains(me)) { + if(play > bestLen) { + bestLen = play; + bestTitle = title; + } + } + + } + + return bestTitle; + } + + private int toSecond(String min) { + String[] m = min.split(":"); + + return Integer.parseInt(m[0]) * 60 + Integer.parseInt(m[1]); + } + + private String norm (String melody) { + return melody + .replace("C#","c") + .replace("D#","d") + .replace("F#","f") + .replace("G#","g") + .replace("A#","a") + .replace("B#","b"); + } +} diff --git "a/week16/\352\271\200\353\210\204\353\246\254/programmers/\354\235\230\354\203\201.java" "b/week16/\352\271\200\353\210\204\353\246\254/programmers/\354\235\230\354\203\201.java" new file mode 100644 index 0000000..0623fe2 --- /dev/null +++ "b/week16/\352\271\200\353\210\204\353\246\254/programmers/\354\235\230\354\203\201.java" @@ -0,0 +1,56 @@ +package week16.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week16.김누리.programmers + * FileName : 의상 + * Author : 김누리(NRKim) + * Date : 2025-08-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 11. 김누리(NRKim) Initial creation + */ + +/* + +clothes[i][1] : 의상 종류 기준으로 map 셋팅 + +case 1 기준 + +map = {headgear = 2, eyewear = 1} + +headgear 1 (노란 모자) +headgear 1 (초록 터번) +eyewear 1 (파란 선글라스) +headgear 1 + eyewear 1 +headgear 1 + eyewear 1 + + +*/ + +public class 의상 { + public int solution(String[][] clothes) { + int answer = 1; + Map map = new HashMap<>(); + + // 의상 종류 별 갯수 확인 + for(String[] c : clothes) { + map.put(c[1],map.getOrDefault(c[1],0)+1); + } + + // 의상 조합 + for(String c : map.keySet()) { + answer *= (map.get(c)+1); + + } + + // 아무것도 안입는 경우 + answer -= 1; + + return answer; + } +} diff --git "a/week16/\352\271\200\353\210\204\353\246\254/programmers/\354\272\220\354\213\234.java" "b/week16/\352\271\200\353\210\204\353\246\254/programmers/\354\272\220\354\213\234.java" new file mode 100644 index 0000000..5af15d8 --- /dev/null +++ "b/week16/\352\271\200\353\210\204\353\246\254/programmers/\354\272\220\354\213\234.java" @@ -0,0 +1,46 @@ +package week16.김누리.programmers; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * PackageName : week16.김누리.programmers + * FileName : 캐시 + * Author : 김누리(NRKim) + * Date : 2025-08-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 11. 김누리(NRKim) Initial creation + */ + +public class 캐시 { + public int solution(int cacheSize, String[] cities) { + if(cacheSize == 0) return 5 * cities.length; // cache를 못쓰면 전부 캐시 miss + + int answer = 0; + Deque cache = new LinkedList<>(); + + // 캐싱 처리 + for(String city : cities) { + String target = city.toUpperCase(); + + // 캐시 hit + if(cache.contains(target)) { + cache.remove(target); + cache.addFirst(target); + answer += 1; + } else { + // 캐시 miss + if(cache.size() == cacheSize) { + cache.removeLast(); // 가장 오래된거 삭제 + } + cache.addFirst(target); + answer += 5; + } + } + + return answer; + } +} diff --git "a/week16/\352\271\200\353\210\204\353\246\254/programmers/\355\214\214\354\235\274\353\252\205_\354\240\225\353\240\254.java" "b/week16/\352\271\200\353\210\204\353\246\254/programmers/\355\214\214\354\235\274\353\252\205_\354\240\225\353\240\254.java" new file mode 100644 index 0000000..d3245ef --- /dev/null +++ "b/week16/\352\271\200\353\210\204\353\246\254/programmers/\355\214\214\354\235\274\353\252\205_\354\240\225\353\240\254.java" @@ -0,0 +1,80 @@ +package week16.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week16.김누리.programmers + * FileName : 파일명_정렬 + * Author : 김누리(NRKim) + * Date : 2025-08-10 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 10. 김누리(NRKim) Initial creation + */ + +/* +파일명 = foo9.txt +Head = foo +Number = 9 +tail = .txt + +Arrays.sort로 오름차순, + +새로 알게 된 개념 +Character.isDigit(char c) ==> 해당 글자가 숫자인지 판단. +Character.isLetter(char c) ==> 해당 글자가 문자인지 판단. + +*/ + +public class 파일명_정렬 { + public String[] solution(String[] files) { + + // 정렬 작업 + Arrays.sort(files, (f1,f2) -> { + String [] p1 = splitName(f1); + String [] p2 = splitName(f2); + + // 헤드 부분 비교. + int headCompare = p1[0].compareToIgnoreCase(p2[0]); // 대수문자 구분 없이 비교 + if( headCompare != 0 ) return headCompare; + + int num1 = Integer.parseInt(p1[1]); + int num2 = Integer.parseInt(p2[1]); + + return num1 - num2; // NUBMER 값 기준으로 오름차순 + }); + + return files; + } + + // 파일명 분리용 함수 + private String[] splitName(String file) { + int n = file.length(); + int idx = 0; + + // 해당 위치가 숫자가 아닌 경우 + while(idx < n && !Character.isDigit(file.charAt(idx))) idx++; + int headEnd = idx; + + + int numStart = idx; + int cnt = 0; + + // 숫자인 경우 + // NUMBER 최대 5자리 까지 가능 + while(idx < n && Character.isDigit(file.charAt(idx)) && cnt < 5) { + idx++; + cnt++; + } + + int numEnd = idx; + + String head = file.substring(0,headEnd); + String number = file.substring(numStart,numEnd); + String tail = file.substring(numEnd); + + return new String[] {head, number, tail}; + } +} diff --git "a/week16/\354\235\264\354\203\201\354\226\265/backjoon/\353\247\210\353\235\274\355\206\244_1.java" "b/week16/\354\235\264\354\203\201\354\226\265/backjoon/\353\247\210\353\235\274\355\206\244_1.java" new file mode 100644 index 0000000..05d95ae --- /dev/null +++ "b/week16/\354\235\264\354\203\201\354\226\265/backjoon/\353\247\210\353\235\274\355\206\244_1.java" @@ -0,0 +1,55 @@ +/** + * PackageName : week16.이상억.backjoon; + * FileName : 마라톤_1 + * Author : sangeok + * Date : 2025. 08. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 12. sangeok Initial creation + */ + + + +import java.io.*; +import java.util.*; + +public class Main { + static class Point { + int x, y; + Point(int x, int y) { this.x = x; this.y = y; } + } + + static int dist(Point a, Point b) { + return Math.abs(a.x - b.x) + Math.abs(a.y - b.y); + } + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine().trim()); + Point[] arr = new Point[n]; + for (int i = 0; i < n; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int x = Integer.parseInt(st.nextToken()); + int y = Integer.parseInt(st.nextToken()); + arr[i] = new Point(x, y); + } + + long base = 0; + for (int i = 1; i < n; i++) { + base += dist(arr[i - 1], arr[i]); + } + + // 하나를 건너뛸 때 절약되는 거리 중 최댓값 + long bestSave = 0; + for (int i = 1; i < n - 1; i++) { + long save = dist(arr[i - 1], arr[i]) + + dist(arr[i], arr[i + 1]) + - dist(arr[i - 1], arr[i + 1]); + if (save > bestSave) bestSave = save; + } + + System.out.println(base - bestSave); + } +} diff --git "a/week16/\354\235\264\354\203\201\354\226\265/backjoon/\355\232\214\354\235\230\354\213\244_\353\260\260\354\240\225.java" "b/week16/\354\235\264\354\203\201\354\226\265/backjoon/\355\232\214\354\235\230\354\213\244_\353\260\260\354\240\225.java" new file mode 100644 index 0000000..1c4f9f6 --- /dev/null +++ "b/week16/\354\235\264\354\203\201\354\226\265/backjoon/\355\232\214\354\235\230\354\213\244_\353\260\260\354\240\225.java" @@ -0,0 +1,55 @@ +/** + * PackageName : week16.이상억.backjoon; + * FileName : 회의실_배정 + * Author : sangeok + * Date : 2025. 08. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 12. sangeok Initial creation + */ + + +import java.util.*; +import java.io.*; + +public class Main { + static class Meeting { + int start; + int end; + Meeting(int start, int end) { + this.start = start; + this.end = end; + } + } + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine().trim()); + Meeting[] arr = new Meeting[n]; + + for(int i = 0; i < n; i++){ + StringTokenizer st = new StringTokenizer(br.readLine()); + int start = Integer.parseInt(st.nextToken()); + int end = Integer.parseInt(st.nextToken()); + arr[i] = new Meeting(start, end); + } + + Arrays.sort(arr, (a, b) -> { + if (a.end != b.end) return Integer.compare(a.end, b.end); + return Integer.compare(a.start, b.start); + }); + + int count = 0; + int last_end = 0; + for(Meeting m : arr) { + if(m.start >= last_end){ + count++; + last_end = m.end; + } + } + + System.out.println(count); + } +} diff --git "a/week16/\354\235\264\354\203\201\354\226\265/progarmmers/2\352\260\234_\354\235\264\355\225\230\353\241\234_\353\213\244\353\245\270_\353\271\204\355\212\270.java" "b/week16/\354\235\264\354\203\201\354\226\265/progarmmers/2\352\260\234_\354\235\264\355\225\230\353\241\234_\353\213\244\353\245\270_\353\271\204\355\212\270.java" new file mode 100644 index 0000000..5c5a82d --- /dev/null +++ "b/week16/\354\235\264\354\203\201\354\226\265/progarmmers/2\352\260\234_\354\235\264\355\225\230\353\241\234_\353\213\244\353\245\270_\353\271\204\355\212\270.java" @@ -0,0 +1,65 @@ +/** + * PackageName : week16.이상억.progarmmers; + * FileName : 2개_이하로_다른_비트 + * Author : sangeok + * Date : 2025. 08. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 12. sangeok Initial creation + */ + + +// x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수 + +class Solution { + public long[] solution(long[] numbers) { + long[] answer = new long[numbers.length]; + + for (int i = 0; i < numbers.length; i++) { + long x = numbers[i]; + + // 짝수면 무조건 x + 1이 비트 1개만 다름 + if ((x & 1) == 0) { + answer[i] = x + 1; + } else { + // 홀수면 가장 낮은 0을 1로 그 바로 오른쪽 1을 0으로 바꿈 + long bit = 1L; + + while ((x & bit) != 0) { + bit <<= 1; + } + + answer[i] = x + bit - (bit >> 1); + } + } + + return answer; + } +} + + +// 테스트케이스 10,11에서 시간 초과 남 -> 완전 탐색의 방식으로 접근하기엔 무리가 있어보임 + + +//class Solution { +// public long[] solution(long[] numbers) { +// long[] answer = new long[numbers.length]; +// +// for (int i = 0; i < numbers.length; i++) { +// long x = numbers[i]; +// +// for (long cand = x + 1; ; cand++) { +// int diff = Long.bitCount(x ^ cand); // XOR 후 1의 개수 = 비트 차이 개수 +// if (diff == 1 || diff == 2) { +// answer[i] = cand; +// break; +// } +// } +// } +// +// return answer; +// } +//} +// diff --git "a/week16/\354\235\264\354\203\201\354\226\265/progarmmers/n\354\247\204\354\210\230_\352\262\214\354\236\204.java" "b/week16/\354\235\264\354\203\201\354\226\265/progarmmers/n\354\247\204\354\210\230_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..b84644e --- /dev/null +++ "b/week16/\354\235\264\354\203\201\354\226\265/progarmmers/n\354\247\204\354\210\230_\352\262\214\354\236\204.java" @@ -0,0 +1,35 @@ +/** + * PackageName : week16.이상억.progarmmers; + * FileName : n진수_게임 + * Author : sangeok + * Date : 2025. 08. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 12. sangeok Initial creation + */ + + +// 진법 : n , 미리 구할 숫자의 갯수 : t , 게임에 참여하는 인원 : m , 튜브의 순서 : p +// Integer.toString 검색 안했으면 되게 힘들게 풀었거나 못풀었을듯 .. + +import java.util.*; +class Solution { + public String solution(int n, int t, int m, int p) { + + StringBuilder sb = new StringBuilder(); + int a = 0; + + while(sb.length() < t * m ){ + sb.append(Integer.toString(a++,n).toUpperCase()); + } + + StringBuilder answer = new StringBuilder(); + + for(int i = 0; i < t; i++){ + answer.append(sb.charAt((p-1) + i * m)); + } + return answer.toString(); + } +} \ No newline at end of file diff --git "a/week16/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\230\354\203\201.java" "b/week16/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\230\354\203\201.java" new file mode 100644 index 0000000..2e6680f --- /dev/null +++ "b/week16/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\230\354\203\201.java" @@ -0,0 +1,35 @@ +/** + * PackageName : week16.이상억.progarmmers; + * FileName : 의상 + * Author : sangeok + * Date : 2025. 08. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 12. sangeok Initial creation + */ + + +// 고등학교 때 했던 확률과 통계 조합 문제 같음 + +import java.util.*; + +class Solution { + public int solution(String[][] clothes) { + Map typeCount = new HashMap<>(); + + for (String[] item : clothes) { + String type = item[1]; + typeCount.put(type, typeCount.getOrDefault(type, 0) + 1); + } + + // 각 종류마다 (입는 개수 + 안 입는 경우 = +1) + int answer = 1; + for (int count : typeCount.values()) { + answer *= (count + 1); + } + + return answer - 1; + } +} diff --git "a/week16/\354\235\264\354\203\201\354\226\265/progarmmers/\354\272\220\354\213\234.java" "b/week16/\354\235\264\354\203\201\354\226\265/progarmmers/\354\272\220\354\213\234.java" new file mode 100644 index 0000000..fa50c7a --- /dev/null +++ "b/week16/\354\235\264\354\203\201\354\226\265/progarmmers/\354\272\220\354\213\234.java" @@ -0,0 +1,44 @@ +/** + * PackageName : week16.이상억.progarmmers; + * FileName : 캐사 + * Author : sangeok + * Date : 2025. 08. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 12. sangeok Initial creation + */ + +// 캐시 크기 및 도시이름 배열 +// 0 <= 캐시 크기 <= 30 +// 도시 이름 크기 <= 100,000 +// LRU => 가장 오랫동안 사용하지 않은 페이지 교체 + + +import java.util.*; + +class Solution { + public int solution(int cacheSize, String[] cities) { + int answer = 0; + + if(cacheSize == 0) return cities.length * 5; + Deque page = new LinkedList<>(); + + + for(String citys : cities){ + String city = citys.toLowerCase(); + + if(page.contains(city)){ + page.remove(city); + page.addLast(city); + answer += 1; + } else{ + if(page.size() == cacheSize) page.removeFirst(); + page.addLast(city); + answer += 5; + } + } + return answer; + } +} \ No newline at end of file diff --git "a/week16/\354\235\264\354\203\201\354\226\265/progarmmers/\355\214\214\354\235\274\353\252\205_\354\240\225\353\240\254.java" "b/week16/\354\235\264\354\203\201\354\226\265/progarmmers/\355\214\214\354\235\274\353\252\205_\354\240\225\353\240\254.java" new file mode 100644 index 0000000..17f96ee --- /dev/null +++ "b/week16/\354\235\264\354\203\201\354\226\265/progarmmers/\355\214\214\354\235\274\353\252\205_\354\240\225\353\240\254.java" @@ -0,0 +1,47 @@ +import java.util.*; + +class Solution { + public String[] solution(String[] files) { + + Arrays.sort(files, (f1, f2) -> { + String[] p1 = splitName(f1); + String[] p2 = splitName(f2); + + // HEAD 비교 (대소문자 무시) + int headCompare = p1[0].compareToIgnoreCase(p2[0]); + if (headCompare != 0) return headCompare; + + // NUMBER 비교 (정수값으로) + int num1 = Integer.parseInt(p1[1]); + int num2 = Integer.parseInt(p2[1]); + return num1 - num2; // 같으면 입력 순서 유지(안정 정렬) + }); + + return files; + } + + private String[] splitName(String file) { + String head = ""; + String number = ""; + String tail = ""; + + int i = 0; + while (i < file.length() && !Character.isDigit(file.charAt(i))) { + head += file.charAt(i); + i++; + } + + int cnt = 0; + while (i < file.length() && Character.isDigit(file.charAt(i)) && cnt < 5) { + number += file.charAt(i); + i++; + cnt++; + } + + if (i < file.length()) { + tail = file.substring(i); + } + + return new String[]{head, number, tail}; + } +} diff --git "a/week16_a/\352\271\200\353\210\204\353\246\254/baekjoon/\353\271\204\353\260\200\353\262\210\355\230\270_\354\260\276\352\270\260.java" "b/week16_a/\352\271\200\353\210\204\353\246\254/baekjoon/\353\271\204\353\260\200\353\262\210\355\230\270_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..50bb23a --- /dev/null +++ "b/week16_a/\352\271\200\353\210\204\353\246\254/baekjoon/\353\271\204\353\260\200\353\262\210\355\230\270_\354\260\276\352\270\260.java" @@ -0,0 +1,92 @@ +package week16_a.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.StringTokenizer; + +/** + * PackageName : week16_a.김누리.baekjoon + * FileName : 비밀번호_찾기 + * Author : 김누리(NRKim) + * Date : 2025-08-15 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 15. 김누리(NRKim) Initial creation + */ + +/* +* +* 입력 +* 1번째 줄 : 사이트 주소의 수_비밀번호를 찾으려는 사이트 수 +* 예 ) 16 4 >> 사이트 주소 수 : 16, 비밀번호 찾이려는 사이트 수 4 +* +* 2번째 줄 ~ N번째 줄 : 사이트 주소_비밀번호 +* 예 ) noj.am_IU > 사이트 주소 : noj.am, 비밀번호 : IU +* +* 출력 +* 비밀번호를 찾으려는 사이트 주소의 비밀번호를 출력. +* +* +* 총 입력셋 +* +* noj.am IU +* acmicpc.net UAENA +* startlink.io THEKINGOD +* google.com ZEZE +* nate.com VOICEMAIL +* naver.com REDQUEEN +* daum.net MODERNTIMES +* utube.com BLACKOUT +* zum.com LASTFANTASY +* dreamwiz.com RAINDROP +* hanyang.ac.kr SOMEDAY +* dhlottery.co.kr BOO +* duksoo.hs.kr HAVANA +* hanyang-u.ms.kr OBLIVIATE +* yd.es.kr LOVEATTACK +* mcc.hanyang.ac.kr ADREAMER +* startlink.io >> 대상 1 +* acmicpc.net >> 대상 2 +* noj.am >> 대상 3 +* mcc.hanyang.ac.kr >> 대상 4 +* +* +*/ +public class 비밀번호_찾기 { + public static void main(String[] args) throws Exception{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + String first = br.readLine(); // 첫번째 줄 읽음 + String[] part = first.split(" "); + int[] lines = new int[2]; // 각 라인수 정리 + lines[0] = Integer.parseInt(part[0]); + lines[1] = Integer.parseInt(part[1]); + + Map map = new HashMap<>(); + + + // 16개 사이트 비밀번호 저장 + for(int i = 0; i < lines[0]; i++) { + StringTokenizer tk = new StringTokenizer(br.readLine()); + String site = tk.nextToken(); + String pw = tk.nextToken(); + + map.put(site,pw); + } + + // 나머지 4 사이트에 대해pw 설정 + for(int i = 0; i < lines[1]; i++) { + String site = br.readLine(); + bw.write(map.get(site) + "\n"); + } + + bw.flush(); + bw.close(); + } +} diff --git "a/week17/\352\260\225\354\204\261\354\232\261/backjoon/\353\240\214\354\204\240_\354\236\220\353\245\264\352\270\260.java" "b/week17/\352\260\225\354\204\261\354\232\261/backjoon/\353\240\214\354\204\240_\354\236\220\353\245\264\352\270\260.java" new file mode 100644 index 0000000..dc3101d --- /dev/null +++ "b/week17/\352\260\225\354\204\261\354\232\261/backjoon/\353\240\214\354\204\240_\354\236\220\353\245\264\352\270\260.java" @@ -0,0 +1,61 @@ +package week17.강성욱.backjoon; + +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 : week17.강성욱.backjoon + * FileName : 렌선_자르기 + * Author : Baekgwa + * Date : 2025-08-21 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-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)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int k = Integer.parseInt(st.nextToken()); + int n = Integer.parseInt(st.nextToken()); + + int[] cables = new int[k]; + long left = 1; + long right = 0; + + for (int i = 0; i < k; i++) { + cables[i] = Integer.parseInt(br.readLine()); + right = Math.max(right, cables[i]); + } + + long result = 0; + + while (left <= right) { + long mid = left + (right - left) / 2; + + long count = 0; + for (int i = 0; i < k; i++) { + count += cables[i] / mid; + } + + if (count >= n) { + result = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + + System.out.println(result); + } + } +} diff --git "a/week17/\352\260\225\354\204\261\354\232\261/programmers/\353\204\244\355\212\270\354\233\214\355\201\254.java" "b/week17/\352\260\225\354\204\261\354\232\261/programmers/\353\204\244\355\212\270\354\233\214\355\201\254.java" new file mode 100644 index 0000000..3636fc3 --- /dev/null +++ "b/week17/\352\260\225\354\204\261\354\232\261/programmers/\353\204\244\355\212\270\354\233\214\355\201\254.java" @@ -0,0 +1,76 @@ +package week17.강성욱.programmers; + +/** + * PackageName : week17.강성욱.programmers + * FileName : 네트워크 + * Author : Baekgwa + * Date : 2025-08-21 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-21 Baekgwa Initial creation + */ +public class 네트워크 { + class Solution { + public int solution(int n, int[][] computers) { + + UnionFind uf = new UnionFind(n); + + for(int i=0; i q = new LinkedList<>(); + q.offer(new Item(words.length, begin)); + + while(!q.isEmpty()) { + Item item = q.poll(); + // 종료 조건에 걸리는 경우. + if(item.getNowWord().equals(target)) return item.getDepth(); + + //words 를 돌면서, 한단어만 바꿔서 갈 수 있는걸 모두 가보기. bfs + for(int i=0; i 1) { + return false; + } + } + // 혹시모르니, 같은 문자열 비교하는 경우, false 로 처리... 그럴수는 없긴 하지만 + return diffCnt == 1 ? true : false; + } + + public static class Item { + private boolean[] visited; + private String nowWord; + private int depth; + + public Item(int n, String nowWord) { + this.visited = new boolean[n]; + this.nowWord = nowWord; + this.depth = 0; + } + + public Item(Item item, String nextWord) { + this.visited = Arrays.copyOf(item.getVisited(), item.getVisited().length); + this.nowWord = nextWord; + this.depth = item.getDepth() + 1; + } + + public int getDepth() { return this.depth; } + public String getNowWord() { return this.nowWord; } + public boolean[] getVisited() { return this.visited; } + + public void setTrueVisited(int index) { this.visited[index] = true; } + public void setFalseVisited(int index) { this.visited[index] = false; } + } + } +} diff --git "a/week17/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\354\271\264\353\223\234_\353\202\230\353\210\204\352\270\260.java" "b/week17/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\354\271\264\353\223\234_\353\202\230\353\210\204\352\270\260.java" new file mode 100644 index 0000000..340eee8 --- /dev/null +++ "b/week17/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220_\354\271\264\353\223\234_\353\202\230\353\210\204\352\270\260.java" @@ -0,0 +1,81 @@ +package week17.강성욱.programmers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week17.강성욱.programmers + * FileName : 숫자_카드_나누기 + * Author : Baekgwa + * Date : 2025-08-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-19 Baekgwa Initial creation + */ +public class 숫자_카드_나누기 { + //arrayA 의 약수를 모두 구하고 + //arrayB 의 약수를 모두 구하기? + // 타임아웃 걸리면, 약수 구하는걸 조금 바꿀려고 했는데 ㄱㅊ네 + + class Solution { + public int solution(int[] arrayA, int[] arrayB) { + int result = 0; + List dirtnA = dirtn(arrayA); + List dirtnB = dirtn(arrayB); + + //A 배열의 약수 조합들 중, B가 나눠지는지 확인 + //dirtnA 는 가장 큰순서대로 정렬되어있음. 즉, 먼저 안나눠지는게 발생하면 그게 가장 큰값이니, 바로 끝내면됨. + for(int now : dirtnA) { + if(!canDiv(arrayB, now)) { + result = Math.max(result, now); + break; + } + } + + //B 배열의 약수 조합들 중, A가 나눠지는지 확인 + for(int now : dirtnB) { + if(!canDiv(arrayA, now)) { + result = Math.max(result, now); + break; + } + } + + return result; + } + + // 숫자 now 로 배열들 중, 하나라도 나눠진다면 return true + private boolean canDiv(int[] array, int now) { + for(int a : array) { + if(a % now == 0) return true; + } + return false; + } + + private List dirtn(int[] array) { + List result = new ArrayList<>(); + + Arrays.sort(array); + for(int start = array[0]; start > 1; start--) { + boolean flag = true; + + for(int i=0; i map = new HashMap<>(); + + String end = words[0].substring(words[0].length()-1); + System.out.print(end); + map.put(words[0], true); + + for(int i=1; i usedWords = new HashSet<>(); + + // 이전 단어를 저장할 변수 + String previousWord = words[0]; + + // 첫 번째 단어는 HashSet에 추가 + usedWords.add(previousWord); + + // 두 번째 단어부터 검사 + for (int i = 1; i < words.length; i++) { + String currentWord = words[i]; + + // 1. 끝말잇기 규칙 위반 검사 + if (previousWord.charAt(previousWord.length() - 1) != currentWord.charAt(0)) { + return calculateAnswer(i, n); + } + + // 2. 중복된 단어 사용 검사 + // add 메서드는 추가에 성공하면 true를 반환, 이미 존재하면 false를 반환 + if (!usedWords.add(currentWord)) { + return calculateAnswer(i, n); + } + + // 현재 단어를 다음 턴의 '이전 단어'로 설정 + previousWord = currentWord; + } + + // 모든 단어를 성공적으로 통과하면 [0, 0] 반환 + return new int[]{0, 0}; + } + + // 탈락자의 번호와 차례를 계산하는 헬퍼 함수 + private int[] calculateAnswer(int index, int n) { + int personNumber = (index % n) + 1; + int turnNumber = (index / n) + 1; + return new int[]{personNumber, turnNumber}; + } + } +} diff --git "a/week17/\352\271\200\353\202\230\354\235\200/programmers/\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.java" "b/week17/\352\271\200\353\202\230\354\235\200/programmers/\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.java" new file mode 100644 index 0000000..3800ce0 --- /dev/null +++ "b/week17/\352\271\200\353\202\230\354\235\200/programmers/\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.java" @@ -0,0 +1,25 @@ +package week17.김나은.programmers; + +public class 행렬의_곱셈 { + + class Solution { + + public int[][] solution(int[][] arr1, int[][] arr2) { + // 결과를 저장할 2차원 배열 + int[][] answer = new int[arr1.length][arr2[0].length]; + + // arr1의 행 수만큼 반복 + for (int i = 0; i < arr1.length; i++) { + // arr2의 열 수만큼 반복 + for (int j = 0; j < arr2[0].length; j++) { + // 행렬의 곱셈 + for (int k = 0; k < arr1[0].length; k++) { + answer[i][j] += arr1[i][k] * arr2[k][j]; + } + } + } + + return answer; + } + } +} \ No newline at end of file diff --git "a/week17/\352\271\200\353\210\204\353\246\254/baekjoon/\353\236\234\354\204\240_\354\236\220\353\245\264\352\270\260.java" "b/week17/\352\271\200\353\210\204\353\246\254/baekjoon/\353\236\234\354\204\240_\354\236\220\353\245\264\352\270\260.java" new file mode 100644 index 0000000..f856de9 --- /dev/null +++ "b/week17/\352\271\200\353\210\204\353\246\254/baekjoon/\353\236\234\354\204\240_\354\236\220\353\245\264\352\270\260.java" @@ -0,0 +1,97 @@ +package week17.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.StringTokenizer; + +/** + * PackageName : week17.김누리.baekjoon + * FileName : 랜선_자르기 + * Author : 김누리(NRKim) + * Date : 2025-08-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 17. 김누리(NRKim) Initial creation + */ + +/* +* +* 입력 +* 1번째 줄 : 가지고 있는 랜선의 갯수_필요한 랜선의 갯수 +* 예) 4_11 : 가지고 있는 랜선의 갯수 4, 필요한 랜선의 갯수 : 11 +* +* 2번째 줄 부터 +* +* 802 cm +* 743 cm +* 457 cm +* 539 cm +* +* 그러면 나눠야 할 랜선의 길이도 필요할테니.... >> 이것 부터 구해야 풀이가 될 거 같은데... +* +* 802 cm / x >> +* 743 cm / x >> +* 457 cm / x >> +* 539 cm / x >> +* +* 위와 같이 해야 하니까.. +* +* 그러면.... 가지고 있는 랜선의 갯수는 최대 1만개.... 필요한건 100만개 까지.... +* +* +* 입력값의 조건들이 어마무시 하니 이진 탐색 쓰면 될거 같고. +* +* int left = 1, right = 0 ; +* +* while(left <= right) { +* +* } +* +* +*/ + +public class 랜선_자르기 { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + StringTokenizer first = new StringTokenizer(br.readLine()); // 1번째줄 읽기 + int have = Integer.parseInt(first.nextToken()); // 이미 가지고 있는 랜선 수 + int need = Integer.parseInt(first.nextToken()); // 필요한 랜선 수 + long[] arr = new long[have]; // 현재 가지고 있는 랜선 수 + long max = 0; // 랜선의 최대 길이 + long answer = 0; + + // 가지고 있는 랜선들 배열에 저장 + for(int i = 0; i < have; i++) { + StringTokenizer tk = new StringTokenizer(br.readLine()); + arr[i] = Long.parseLong(tk.nextToken()); + + if(arr[i] > max) max = arr[i]; + } + + long left = 1, right = max; // left = 시작 + + // 이진 탐색 시작 + while(left <= right) { + long mid = (left + right) / 2; // 중앙값 + long cnt = 0; // 랜선 자른 갯수 cnt + + for(long a : arr) cnt += a/mid; + + if(cnt >= need) { + answer = mid; // 필요한 갯수 이상이면 중앙값 적재 + left = mid + 1; + } else { + right = mid -1; + } + } + + bw.write(String.valueOf(answer)); + bw.flush(); + bw.close(); + } +} diff --git "a/week17/\352\271\200\353\210\204\353\246\254/programmers/\353\204\244\355\212\270\354\233\214\355\201\254.java" "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\353\204\244\355\212\270\354\233\214\355\201\254.java" new file mode 100644 index 0000000..5ecb99e --- /dev/null +++ "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\353\204\244\355\212\270\354\233\214\355\201\254.java" @@ -0,0 +1,68 @@ +package week17.김누리.programmers; + +/** + * PackageName : week17.김누리.programmers + * FileName : 네트워크 + * Author : 김누리(NRKim) + * Date : 2025-08-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 19. 김누리(NRKim) Initial creation + */ + +/* +n = 3 +computers = [ + [1, 1, 0], >> 1번 - 2번 연결 + [1, 1, 0], >> 1번 - 2번 연결 + [0, 0, 1] >> 3번 - 연결 X +] + +이러면 연결된 갯수는 0 + +computers = [ + [1, 0, 0], >> 1번 - 연결 X + [0, 1, 0], >> 2번 - 연결 X + [0, 0, 1] >> 3번 - 연결 X +] + +computers = [ + [1, 1, 0], >> 1번 - 2번 연결 + [1, 1, 1], >> 1번 - 2번 - 3번 연결 + [0, 1, 1] >> 2번 - 3번 연결 +] + +단순 연결 여부를 보는거면 dfs로 ㄱㄱㄱ + +*/ + +public class 네트워크 { + boolean[] visited; + + public int solution(int n, int[][] computers) { + int answer = 0; + visited = new boolean[n]; + + for(int i = 0; i < n; i++) { + if(!visited[i]) { + dfs(i,computers); + answer++; + } + } + + return answer; + } + + private void dfs(int n, int[][] computers) { + visited[n] = true; + + for(int i = 0; i < computers.length ; i ++) { + // 해당 부분 방문 되어 있거나, 연결 되어 있다? 카운트 증가 + if(!visited[i] && computers[n][i] == 1) { + dfs(i,computers); + } + } + } +} diff --git "a/week17/\352\271\200\353\210\204\353\246\254/programmers/\353\213\250\354\226\264_\353\263\200\355\231\230.java" "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\353\213\250\354\226\264_\353\263\200\355\231\230.java" new file mode 100644 index 0000000..5ffbede --- /dev/null +++ "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\353\213\250\354\226\264_\353\263\200\355\231\230.java" @@ -0,0 +1,87 @@ +package week17.김누리.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week17.김누리.programmers + * FileName : 단어_변환 + * Author : 김누리(NRKim) + * Date : 2025-08-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 17. 김누리(NRKim) Initial creation + */ + +/* +begin : hit +target : cog + +words : ["hot", "dot", "dog", "lot", "log", "cog"] + +hit > hot > dot > dog > cog + +hit > hot : 가운데 값만 변환 +hot > dot : 첫 글자만 변환 +dot > dog : 마지막 글자 변환 +dog > cog : 첫 글자만 변환 + +그럼 진행 순서 + +target 값이 words 배열에 없다? >> return 0 + +target 값이 words 배열에 있다? >> 프로세스 진행 + +※ 단어는 자음 모음 자음 모음 ~~~ 순번 +모음을 먼저 변경해 본다 >> 모음 동일 ? >> 첫번째 글자 확인 >> 다음번 자음 확인 >> 변환 진행. + +얘는 bfs가 맞는듯.... + +왜냐 최단 거리 계산이기 때문.. + +h i t > h o t 변환 경우 + +자릿수 마다 글자 비교 > 다른 부분이 있다면 해당 부분만 변경 (1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.) + +*/ + +public class 단어_변환 { + public int solution(String begin, String target, String[] words) { + boolean[] visited = new boolean[words.length]; // 방문 체크 + Queue q = new LinkedList<>(); + q.offer(new String[] {begin,"0"}); // 시작 단어 && 변환 카운트 큐에 적재 + + while(!q.isEmpty()) { + String[] now = q.poll(); + String b = now[0]; // 현재 단어 + int cnt = Integer.parseInt(now[1]); // 변환 횟수 + + // 현재 단어가 변환 대상 타겟인 경우 변환 횟수 반환. + if (b.equals(target)) return cnt; + + // words 배열 순회 시작 + for(int i = 0; i < words.length; i++) { + // 해당 위치를 방문하지 않았고, 변환도 가능한 경우 + if(!visited[i] && canConvert(b,words[i])) { + visited[i] = true; + q.offer(new String[] {words[i],Integer.toString(cnt+1)}); + } + } + } + + return 0; + } + + private boolean canConvert(String a, String b) { + int diff = 0; + + for(int i = 0; i < a.length(); i++) { + // 현재 단어와 비교 대상 단어가 다른 곳이 1자리 이상인 경우 + if(a.charAt(i) != b.charAt(i) && ++diff > 1) return false; + } + + return true; + } +} diff --git "a/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\210\253\354\236\220_\354\271\264\353\223\234_\353\202\230\353\210\204\352\270\260.java" "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\210\253\354\236\220_\354\271\264\353\223\234_\353\202\230\353\210\204\352\270\260.java" new file mode 100644 index 0000000..75db5a6 --- /dev/null +++ "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\210\253\354\236\220_\354\271\264\353\223\234_\353\202\230\353\210\204\352\270\260.java" @@ -0,0 +1,120 @@ +package week17.김누리.programmers; + +/** + * PackageName : week17.김누리.programmers + * FileName : 숫자_카드_나누기 + * Author : 김누리(NRKim) + * Date : 2025-08-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 17. 김누리(NRKim) Initial creation + */ + +/* + +그럼 대상값 a의 경우 +arrayA 에 있는 값을 나눌 때 + +arrayA[0] ==> 나눌 수 있다 arrayA[1] ==> 나눌 수 있다 + +arrayB 에 있는 값을 나눌 때 + +arrayB[0] ==> 나눌 수 있다 arrayB[1] ==> 나눌 수 있다 + +그러나 + +a는 arrayA의 모든값이 나눌 수 있으면, arrayB의 값은 다 나눌 수 없다. + +case 1 : + +arrayA = [10,17] + >> A의 요소를 둘 다 나눌 수 있는 자연수 X + >> 10을 이용하면 B배열의 20만 나눌 수 있으므로 조건 충족 불가 + +arrayB = [5,20] >> 5를 이용하면 B의 요소를 다 나눌 수 있음 + >> 5를 이용하면 B배열의 요소를 모두 정리 가능 + >> 그러나 A의 10도 나눌 수 있으므로 조건 충족 불가 + +case 2 : + +arrayA = [10,20] + >> 10을 이용하면 A의 배열 전부 나눌 수 있음. + >> 10을 이용하면 B배열값 전부 나눌 수 없음 >> 조건 충족 >>> a = 10 + +arrayB = [5,17] + >> 5를 이용하면 B배열의 요소를 모두 정리 불가 + >> 5를 이용하면 A의 배열 모두 정리 가능 + >> a == 10 이기 때문에 5보다 크므로 a = 10임 + +case 3 : + +arrayA = [14,35,119] + >> 7을 이용하면 A의 배열 전부 나눌 수 있음. + >> 7을 이용하면 B배열값 전부 나눌 수 없음 >> 조건 충족 >>> a = 7 + +arrayB = [18,30,102] + >> 3를 이용하면 B배열의 요소 정리 가능 + >> 3을 이용하면 A배열의 요소 정리 불가 + >> 6을 이용하는 경우 상동 + >> a == 7 이기 때문에 3과 6보다 크므로 a = 7임 + + 그러면 각 배열마다 gcd를 쓰면 될 거 같은데? + + gcd(a,b%a); + +*/ + +public class 숫자_카드_나누기 { + public int solution(int[] arrayA, int[] arrayB) { + int answer = 0; + + int a = gcdArray(arrayA); + int b = gcdArray(arrayB); + + int resultA = divided(a,arrayB) ? a : 0; + int resultB = divided(b,arrayA) ? b : 0; + + answer = Math.max(resultA,resultB); + + return answer; + } + + // 배열을 반복하며 유클리드 호제법 돌리기 + private int gcdArray(int[] array) { + + // 시작 수 + int g = array[0]; + + for(int i = 0; i < array.length; i++) { + // 각 배열값을 순회하며 유클리드 호제법 진행 + g = gcd(g,array[i]); + + if(g == 1) return 1; + } + + return g; + } + + private int gcd (int a, int b) { + while(b != 0) { + int t = a%b; + a = b; + b = t; + } + + return Math.abs(a); + } + + private boolean divided(int x, int[] array) { + if(x == 0) return false; // 0 인경우 나눌수가 없기 때문에 + + for(int a : array) { + // 대상 외 배열값 중 하나라도 나눠지면 거짓 + if(a%x == 0) return false; + } + + return true; + } +} diff --git "a/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\230\201\354\226\264_\353\201\235\353\247\220\354\236\207\352\270\260.java" "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\230\201\354\226\264_\353\201\235\353\247\220\354\236\207\352\270\260.java" new file mode 100644 index 0000000..6aca5e6 --- /dev/null +++ "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\230\201\354\226\264_\353\201\235\353\247\220\354\236\207\352\270\260.java" @@ -0,0 +1,93 @@ +package week17.김누리.programmers; + +/** + * PackageName : week17.김누리.programmers + * FileName : 영어_끝말잇기 + * Author : 김누리(NRKim) + * Date : 2025-08-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 17. 김누리(NRKim) Initial creation + */ + +/* + +1. words 만큼 반복 ㄱㄱ +2. 체크 항목 + 2-1. words[i]가 기존에 나왔나? + 2-2. words[i]의 시작 글자가 직전 단어의 마지막 글자와 동일한가 +3. 반환 배열 [player 번호, turn 수] + +*/ + +public class 영어_끝말잇기 { + // 예전에 Set 방식으로 풀이를 진행했었음. 그러나 이 때눈 극 초심자 시기였고, + // 무지성으로 clone coding 했었기 때문에 내 정답이 아님. + // 그러나 참조가 될 수 있기 때문에 풀이 공유. + /*public int[] solution(int n, String[] words) { + Set usedWords = new HashSet<>(); // 중복 단어 체크 + int[] answer = new int [2]; + String lastWord = ""; + + for (int i = 0; i < words.length ; i ++) { + int p = (i%n) + 1; // 사람 수 + int t = (i/n) + 1; // 턴 수 + String w = words[i]; + + if(usedWords.contains(w)) { + answer[0] = p; + answer[1] = t; + break; + } + + if (i > 0 && lastWord.charAt(lastWord.length() - 1) != w.charAt(0)) { + answer[0] = p; + answer[1] = t; + break; + } + usedWords.add(w); + lastWord = w; + } + + return answer; + }*/ + + // 입력 조건만 보면, 플레이어는 최대 10명 까지고, 게임 진행 턴수도 100 이다 보니, + // Set을 써도 좋겠지만, 그냥 이중 for문 돌려서도 풀이가 가능할거라 판단함 + // 왜냐 다돌려도 결국 최대 값이 10 * 1000 >> 1000건 이기 때문이지... + public int[] solution(int n, String[] words) { + for(int i = 0; i < words.length; i++) { + int player = (i%n) + 1; + int turn = (i/n) + 1; + String now = words[i]; // 현재 글자. + + // 2번째 이후 순번 부터 + if(i > 0) { + String prev = words[i-1]; + + // 체크항목 2-2번 + if(prev.charAt(prev.length()-1) != now.charAt(0)) { + return setReturn(player,turn); + } + + // 체크항목 2-1번 + for(int j = 0; j < i; j++) { + if(words[j].equals(now)) { + return setReturn(player,turn); + } + } + } + }; + + return setReturn(0,0); + } + + // int[] answer가 굳이 없어도 될것 같아 + // 기교 한번 부려봄. + private int[] setReturn(int player, int turn) { + return new int[] {player,turn}; + } + +} diff --git "a/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\240\204\355\231\224\353\262\210\355\230\270_\353\252\251\353\241\235.java" "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\240\204\355\231\224\353\262\210\355\230\270_\353\252\251\353\241\235.java" new file mode 100644 index 0000000..c43fe38 --- /dev/null +++ "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\240\204\355\231\224\353\262\210\355\230\270_\353\252\251\353\241\235.java" @@ -0,0 +1,38 @@ +package week17.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week17.김누리.programmers + * FileName : 전화번호_목록 + * Author : 김누리(NRKim) + * Date : 2025-08-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 17. 김누리(NRKim) Initial creation + */ + +/* + +흠... phone_book의 각 요소들을 순회하면서 다음 단어의 시작인지 판단 + +*/ + +public class 전화번호_목록 { + public boolean solution(String[] phone_book) { + boolean answer = true; + + Arrays.sort(phone_book); + + for(int i = 0; i < phone_book.length - 1; i++) { + String now = phone_book[i]; + + if(phone_book[i+1].startsWith(now)) answer = false; + + } + + return answer; + } +} diff --git "a/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\240\220_\354\260\215\352\270\260.java" "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\240\220_\354\260\215\352\270\260.java" new file mode 100644 index 0000000..fa729e0 --- /dev/null +++ "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\354\240\220_\354\260\215\352\270\260.java" @@ -0,0 +1,57 @@ +package week17.김누리.programmers; + +/** + * PackageName : week17.김누리.programmers + * FileName : 점_찍기 + * Author : 김누리(NRKim) + * Date : 2025-08-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 17. 김누리(NRKim) Initial creation + */ + +/* +k = 추가 거리 +d = 최대 길이 ( x축이든 y축이든 ) + +case 1 : +k = 2, d = 4; + +시작점은 (0,0) + +int dist = 0; +int x = 0; +int y = 0; + +Queue q = new LinkedList<>(); + +q.offer(new int[] {x,y}); + +while(!q.isEmpty()) { + // x,y 축 계산하며 Queue에 적재 로직 +} + + +근데... 저렇게 bfs로가면? k도 d도 100만 이니 반복문 돌다 터질거 같은데... + +그래서 스쿼트(sqrt)문을 쓰면... 제곱근 만큼만 계산하니 될지도? + +*/ + +public class 점_찍기 { + public long solution(int k, int d) { + long answer = 0; + + for( int i = 0; i <= d; i+=k ) { + // a^2 + b^2 <= c^2 : 밑변^2 + 높이^2 <= 대각선^2 + // 위 공식을 통해 원의 반지름 d 인 원 안쪽의 좌표 갯수 계산 + long maxY = (long)Math.sqrt((long)d*d - (long)i*i); + + answer += (maxY / k) + 1; + } + + return answer; + } +} diff --git "a/week17/\352\271\200\353\210\204\353\246\254/programmers/\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.java" "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.java" new file mode 100644 index 0000000..a56c596 --- /dev/null +++ "b/week17/\352\271\200\353\210\204\353\246\254/programmers/\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.java" @@ -0,0 +1,65 @@ +package week17.김누리.programmers; + +/** + * PackageName : week17.김누리.programmers + * FileName : 기사단원의_무기 + * Author : 김누리(NRKim) + * Date : 2025-08-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 17. 김누리(NRKim) Initial creation + */ + +/* +Case 1 + 1 4 3 3 + 3 2 3 3 + 4 1 + + 1*3 + 4*3 1*3 + 4*3 => 15 15 + 3*3 + 2*3 3*3 + 2*3 => 15 15 + 4*3 + 1*3 4*3 + 1*3 => 15 15 + + ※ [[15,15],[15,15],[15,15]] + +Case 2 + 2 3 2 5 4 3 + 4 2 4 2 4 1 + 3 1 4 3 1 1 + + 2*5 + 3*2 + 2*3 2*4 + 3*4 + 2*1 2*3 + 3*1 + 2*1 => 22 22 11 + 4*5 + 2*2 + 4*3 4*4 + 2*4 + 4*1 4*3 + 2*1 + 4*1 => 36 28 18 + 3*5 + 1*2 + 4*3 3*4 + 1*4 + 4*1 3*3 + 1*1 + 4*1 => 29 20 14 + + ※ [[22,22,11],[36,28,18],[29,20,14]] + +결론 + 입력값 : + arr1 = [arr1[0][0],arr1[0][1]],[arr1[1][0],arr1[1][1]],[arr1[2][0],arr1[2][1]]] + arr2 = [arr2[0][0],arr2[0][1]],[arr2[1][0],arr2[1][1]] + + return [ + [arr1[0][0]*arr2[0][0] + arr1[0][1]*arr2[1][0] , arr1[0][0]*arr2[1][0] + arr1[0][1]*arr2[1][1]] , + [arr1[1][0]*arr2[0][0] + arr1[1][1]*arr2[1][0] , arr1[1][0]*arr2[1][0] + arr1[1][1]*arr2[1][1]] , + [arr1[2][0]*arr2[0][0] + arr1[2][1]*arr2[1][0] , arr1[2][0]*arr2[1][0] + arr1[2][1]*arr2[1][1]] + ] + +*/ + +public class 행렬의_곱셈 { + public int[][] solution(int[][] arr1, int[][] arr2) { + int[][] answer = new int[arr1.length][arr2[0].length]; + + for(int i = 0 ; i < arr1.length; i++) { + for (int j = 0; j < arr2[0].length; j++) { + for(int k = 0; k < arr1[0].length; k++) { + answer[i][j] += arr1[i][k] * arr2[k][j]; + } + } + } + + return answer; + } +} diff --git "a/week17/\354\235\264\354\203\201\354\226\265/backjoon/\353\236\234\354\204\240_\354\236\220\353\245\264\352\270\260.java" "b/week17/\354\235\264\354\203\201\354\226\265/backjoon/\353\236\234\354\204\240_\354\236\220\353\245\264\352\270\260.java" new file mode 100644 index 0000000..0c79002 --- /dev/null +++ "b/week17/\354\235\264\354\203\201\354\226\265/backjoon/\353\236\234\354\204\240_\354\236\220\353\245\264\352\270\260.java" @@ -0,0 +1,52 @@ +/** + * PackageName : week17.이상억.backjoon; + * FileName : 랜선_자르기 + * Author : sangeok + * Date : 2025. 08. 21. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 21. sangeok Initial creation + */ + +// 모두 같은 크기로 잘라야 함 + +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 k = Integer.parseInt(st.nextToken()); // 랜선 개수 + int n = Integer.parseInt(st.nextToken()); // 만들어야 할 조각 개수 + + long[] len = new long[k]; + long maxLen = 0; + for (int i = 0; i < k; i++) { + len[i] = Long.parseLong(br.readLine().trim()); + if (len[i] > maxLen) maxLen = len[i]; // 최댓값 갱신 + + } + + long lo = 1; + long hi = maxlen; + while(lo <= hi){ + long count = 0; + mid = (lo + hi / 2); + for(long le : len){ + count += (le/mid); + } + + if( count >= n ){ + answer = mid; + lo = mid +1; + } else { + hi = mid -1; + } + } + return answer; + } +} diff --git "a/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\353\204\244\355\212\270\354\233\214\355\201\254.java" "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\353\204\244\355\212\270\354\233\214\355\201\254.java" new file mode 100644 index 0000000..484ba11 --- /dev/null +++ "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\353\204\244\355\212\270\354\233\214\355\201\254.java" @@ -0,0 +1,37 @@ +/** + * PackageName : week17.이상억.progarmmers; + * FileName : 네트워크 + * Author : sangeok + * Date : 2025. 08. 21. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 21. sangeok Initial creation + */ + +class Solution { + public int solution(int n, int[][] computers) { + boolean[] visited = new boolean[n]; + int answer = 0; + + for (int i = 0; i < n; i++) { + if (!visited[i]) { + dfs(i, computers, visited); + answer++; + } + } + + return answer; + } + + private void dfs(int node, int[][] computers, boolean[] visited) { + visited[node] = true; + for (int j = 0; j < computers.length; j++) { + if (computers[node][j] == 1 && !visited[j]) { + dfs(j, computers, visited); + } + } + } + +} \ No newline at end of file diff --git "a/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\250\354\226\264_\353\263\200\355\231\230.java" "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\250\354\226\264_\353\263\200\355\231\230.java" new file mode 100644 index 0000000..b824798 --- /dev/null +++ "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\250\354\226\264_\353\263\200\355\231\230.java" @@ -0,0 +1,52 @@ +/** + * PackageName : week17.이상억.progarmmers; + * FileName : 단어_변환 + * Author : sangeok + * Date : 2025. 08. 21. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 21. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public int solution(String begin, String target, String[] words) { + int answer = 0; + + Queue queue = new LinkedList<>(); + boolean[] visited = new boolean[words.length]; + queue.add(new String[]{begin,"0"}); + + while(!queue.isEmpty()){ + String[] current = queue.poll(); + String word = current[0]; + int count = Integer.parseInt(current[1]); + + if(word.equals(target)){ + return count; + } + + for(int i = 0; i < words.length; i++){ + if(!visited[i] && is_changed(word,words[i])){ + visited[i] = true; + queue.add(new String[]{words[i],String.valueOf(count + 1)}); + } + } + } + return 0; + } + + + public boolean is_changed(String a,String b){ + int diff = 0; + for(int i = 0; i < a.length(); i ++){ + if(a.charAt(i) != b.charAt(i)) diff++; + if(diff > 1) return false; + } + return diff == 1; + } +} \ No newline at end of file diff --git "a/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\354\271\264\353\223\234_\353\202\230\353\210\204\352\270\260.java" "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\354\271\264\353\223\234_\353\202\230\353\210\204\352\270\260.java" new file mode 100644 index 0000000..f9e3114 --- /dev/null +++ "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220_\354\271\264\353\223\234_\353\202\230\353\210\204\352\270\260.java" @@ -0,0 +1,57 @@ +/** + * PackageName : week17.이상억.progarmmers; + * FileName : 숫자_카드_나누기 + * Author : sangeok + * Date : 2025. 08. 21. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 21. sangeok Initial creation + */ + +class Solution { + public int solution(int[] arrayA, int[] arrayB) { + int answer = 0; + + int gcdA = gcd(arrayA); + + int gcdB = gcd(arrayB); + + if (is_valid(gcdA, arrayB)) { + answer = Math.max(answer, gcdA); + } + + if (is_valid(gcdB, arrayA)) { + answer = Math.max(answer, gcdB); + } + + return answer; + } + + public int gcd(int[] array){ + int result = array[0]; + for (int i = 1; i < array.length; i++) { + result = gcd(result, array[i]); + } + return result; + } + + public int gcd(int a, int b){ + while (b != 0) { + int temp = a % b; + a = b; + b = temp; + } + return a; + } + + public boolean is_valid(int gcd_number, int[] array) { + for (int num : array) { + if (num % gcd_number == 0) { + return false; + } + } + return true; + } +} diff --git "a/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\201\354\226\264_\353\201\235\353\247\220\354\236\207\352\270\260.java" "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\201\354\226\264_\353\201\235\353\247\220\354\236\207\352\270\260.java" new file mode 100644 index 0000000..af1e761 --- /dev/null +++ "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\201\354\226\264_\353\201\235\353\247\220\354\236\207\352\270\260.java" @@ -0,0 +1,34 @@ +/** + * PackageName : week17.이상억.progarmmers; + * FileName : 영어_끝말잇기 + * Author : sangeok + * Date : 2025. 08. 20. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 20. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int[] solution(int n, String[] words) { + + Set word_set = new HashSet<>(); + + word_set.add(words[0]); + + for(int i = 1 ; i < words.length; i ++){ + String prev = words[i-1]; + String curr = words[i]; + + if(word_set.contains(curr) || prev.charAt(prev.length() - 1) != curr.charAt(0)){ + return new int[]{(i%n) +1, (i/n) + 1}; + } + word_set.add(words[i]); + } + + return new int[]{0,0}; + } +} \ No newline at end of file diff --git "a/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\204\355\231\224\353\262\210\355\230\270_\353\252\251\353\241\235.java" "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\204\355\231\224\353\262\210\355\230\270_\353\252\251\353\241\235.java" new file mode 100644 index 0000000..bb79126 --- /dev/null +++ "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\204\355\231\224\353\262\210\355\230\270_\353\252\251\353\241\235.java" @@ -0,0 +1,35 @@ +/** + * PackageName : week17.이상억.progarmmers; + * FileName : 전화번호_목록 + * Author : sangeok + * Date : 2025. 08. 20. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 20. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public boolean solution(String[] phone_book) { + boolean answer = true; + + Set number_set = new HashSet<>(); + + for(String number : phone_book){ + number_set.add(number); + } + + for(String number : phone_book){ + for(int i = 1; i < number.length(); i++){ + String pre = number.substring(0,i); + + if(number_set.contains(pre)) return false; + } + } + return answer; + } +} \ No newline at end of file diff --git "a/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\220_\354\260\215\352\270\260.java" "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\220_\354\260\215\352\270\260.java" new file mode 100644 index 0000000..211f467 --- /dev/null +++ "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\220_\354\260\215\352\270\260.java" @@ -0,0 +1,31 @@ +/** + * PackageName : week17.이상억.progarmmers; + * FileName : 점_찍기 + * Author : sangeok + * Date : 2025. 08. 20. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 20. sangeok Initial creation + */ + + +class Solution { + public long solution(int k, int d) { + long answer = 0; + + long K = k; + long D = d; + long dist = D * D; + + for(long x = 0; x <= D; x+=K){ + long y_dist = dist - (x * x); + long y = (long)Math.sqrt(y_dist); + answer += (y/k) + 1; + + } + + return answer; + } +} \ No newline at end of file diff --git "a/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.java" "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.java" new file mode 100644 index 0000000..93e9fa4 --- /dev/null +++ "b/week17/\354\235\264\354\203\201\354\226\265/progarmmers/\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.java" @@ -0,0 +1,35 @@ +/** + * PackageName : week17.이상억.progarmmers; + * FileName : 행렬의_곱셈 + * Author : sangeok + * Date : 2025. 08. 20. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 20. sangeok Initial creation + */ + + +// arr1 arr2 return +// 1 4 3 3 1 * 3 + 4 * 3 => arr1[0][0] * arr2[0][0] + arr1[0][1] * arr2[1][0] +// 3 2 3 3 arr1[0][0] * arr2[0][1] + arr1[0][1] * arr2[1][1] +// 4 1 + +class Solution { + public int[][] solution(int[][] arr1, int[][] arr2) { + int[][] answer = new int[arr1.length][arr2[0].length]; + + for(int i = 0; i < arr1.length; i++){ + for(int j = 0; j < arr2[0].length; j++){ + int sum = 0; + for (int k = 0; k < arr1[0].length; k++) { // 공통 차원 + sum += arr1[i][k] * arr2[k][j]; + } + answer[i][j] = sum; + } + } + + return answer; + } +} \ No newline at end of file diff --git "a/week17_A/\352\260\225\354\204\261\354\232\261/backjoon/\354\212\244\354\234\204\354\271\230_\354\274\234\352\263\240_\353\201\204\352\270\260.java" "b/week17_A/\352\260\225\354\204\261\354\232\261/backjoon/\354\212\244\354\234\204\354\271\230_\354\274\234\352\263\240_\353\201\204\352\270\260.java" new file mode 100644 index 0000000..e1b0574 --- /dev/null +++ "b/week17_A/\352\260\225\354\204\261\354\232\261/backjoon/\354\212\244\354\234\204\354\271\230_\354\274\234\352\263\240_\353\201\204\352\270\260.java" @@ -0,0 +1,77 @@ +package week17_A.강성욱.backjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * PackageName : week17_A.강성욱.backjoon + * FileName : 스위치_켜고_끄기 + * Author : Baekgwa + * Date : 2025-08-22 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-22 Baekgwa Initial creation + */ +public class 스위치_켜고_끄기 { + public class Main { + + public static final int MAN = 1; + public static final int WOMAN = 2; + + public static void main(String args[]) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine()); + boolean[] status = new boolean[n]; + + String[] tokenArray = br.readLine().split(" "); + for(int i=0; i= n) break; + if (status[left] != status[right]) break; + + // 대칭이면 즉시 양쪽 바꿈 + status[left] = !status[left]; + status[right] = !status[right]; + + left--; + right++; + } + + } + } + + for(int i=0; i> 3번 6번 스위치 변환 >> 즉 자신이 받은 수의 배수 위치에서 스위칭 +* 2 3 >> 자신이 받은 스위치를 기준으로 좌우 대칭 + 가장 많은 스위치 포함 구간을 찾아 스위치 상태 변경. +* 예) 3을 받았으니, 3번을 기준으로 1,2번 / 4,5번 스위치 중 많은 갯수 즉 +* +* 현재 스위치 상태는 +* +* 0 1 0 1 0 0 0 1 상태이니 +* +* 1 3 의 경우 +* +* 0 1 1 1 0 1 0 1 +* +* 이후 2 3 의 경우 +* +* 1번 0, 2번 1 +* 4번 1 5번 0 +* +* 1,2랑 4,5 값 모두 같으니 12345 모두 스위칭 +* +* 0 1 1 1 0 1 0 1 +* 1 0 0 0 1 1 0 1 +* +*/ + +public class 스위치_켜고_끄기 { + public static void main(String[] args) throws Exception{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + int N = Integer.parseInt(br.readLine()); // 스위치 갯수. + int[] sw = new int[N+1]; // 자리수 맞추기 용도 + + StringTokenizer tk = new StringTokenizer(br.readLine()); + for(int i = 1; i <= N; i++) sw[i] = Integer.parseInt(tk.nextToken()); + + int M = Integer.parseInt(br.readLine()); // 학생 수 + + // 학생 수 만큼 반복 + for(int i = 0; i < M; i++) { + StringTokenizer token = new StringTokenizer(br.readLine()); + int sex = Integer.parseInt(token.nextToken()); // 성별 + int cnt = Integer.parseInt(token.nextToken()); // 받은 스위치 갯수 + + if (sex == 1) { + for(int j = cnt; j <= N; j+= cnt) { + if(sw[j] == 1) sw[j] = 0; + else sw[j] = 1; + } + } else { + int left = cnt, right = cnt; + while (left -1 >= 1 && right +1 <= N && sw[left - 1] == sw [right+1]) { + left--; + right++; + } + + for(int j = left; j <= right; j++) { + if (sw[j] == 1) { + sw[j] = 0; + } else { + sw[j] = 1; + } + } + } + } + + for(int i = 1; i <= N; i++) { + bw.write(sw[i] + (i % 20 == 0 ? "\n" : " ")); + } + + if(N % 20 != 0) bw.write("\n"); + + bw.flush(); + bw.close(); + } +} diff --git "a/week17_a/\354\235\264\354\203\201\354\226\265/backjoon/\354\212\244\354\234\204\354\271\230_\354\274\234\352\263\240_\353\201\204\352\270\260.java" "b/week17_a/\354\235\264\354\203\201\354\226\265/backjoon/\354\212\244\354\234\204\354\271\230_\354\274\234\352\263\240_\353\201\204\352\270\260.java" new file mode 100644 index 0000000..526e1c9 --- /dev/null +++ "b/week17_a/\354\235\264\354\203\201\354\226\265/backjoon/\354\212\244\354\234\204\354\271\230_\354\274\234\352\263\240_\353\201\204\352\270\260.java" @@ -0,0 +1,56 @@ +import java.util.*; +import java.io.*; + + +public class Main{ + + static int[] switches; + + static void toggle(int idx){ + switches[idx] = (switches[idx] == 0 ) ? 1 : 0; + } + 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()); + switches = new int[n+1]; + StringTokenizer st = new StringTokenizer(br.readLine()); + for(int i = 1; i <=n; i++){ + switches[i] = Integer.parseInt(st.nextToken()); + } + + int student_count = Integer.parseInt(br.readLine()); + + for(int s = 0; s < student_count; s ++ ){ + st = new StringTokenizer(br.readLine()); + int gender = Integer.parseInt(st.nextToken()); + int num = Integer.parseInt(st.nextToken()); + + if(gender == 1){ + for(int i = num; i <= n; i +=num){ + toggle(i); + } + } + else{ + toggle(num); + int left = num - 1; + int right = num + 1; + while(left >= 1 && right <=n && switches[left] == switches[right]){ + toggle(left); + toggle(right); + left--; + right++; + } + } + } + + for(int i = 1 ; i <= n; i ++){ + sb.append(switches[i]).append(" "); + if(i % 20 == 0) sb.append("\n"); + } + + System.out.print(sb); + + } +} diff --git "a/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\247\210\353\262\225\354\235\230_\354\227\230\353\246\254\353\262\240\354\235\264\355\204\260.java" "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\247\210\353\262\225\354\235\230_\354\227\230\353\246\254\353\262\240\354\235\264\355\204\260.java" new file mode 100644 index 0000000..6b97090 --- /dev/null +++ "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\247\210\353\262\225\354\235\230_\354\227\230\353\246\254\353\262\240\354\235\264\355\204\260.java" @@ -0,0 +1,70 @@ +package week18.강성욱.programmers; + +/** + * PackageName : week18.강성욱.programmers + * FileName : 마법의_엘리베이터 + * Author : Baekgwa + * Date : 2025-08-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-29 Baekgwa Initial creation + */ +public class 마법의_엘리베이터 { + // bfs? 는 확실하게 풀릴듯? 공간 복잡도가 좀 클꺼같긴한데... + //---- + // 계산으로 가능? + // 500 이면? 5번? -100, + // 600 이면? -100 6번? +100 4번에 -1000 한번 + // 그럼 5 초과를 기점으로 하면 될듯? + + // 2554 의 경우 + // 2 => 2번 + // 5 => 5번 + // 5 => 5번 + // 4 => 4번 + // 16번 + + // 7533 의 경우 + // 7 => 7->10... 3+1 = 4; + // 5 => 5; + // 3 => 3; + // 3 => 3; + // 아 이거 역순으로 해야한다. + + class Solution { + public int solution(int storey) { + int cnt = 0; + String s = String.valueOf(storey); + int[] storeyArray = new int[s.length()]; + for (int i = 0; i < s.length(); i++) { + storeyArray[i] = s.charAt(i) - '0'; + } + + boolean nextUp = false; + for (int i = storeyArray.length - 1; i >= 0; i--) { + int now = storeyArray[i]; + if(nextUp) now += 1; + nextUp = false; + + if (now > 5) { + cnt += 10 - now; + nextUp = true; + } else if (now < 5) { + cnt += now; + } else { + int next = (i > 0) ? storeyArray[i - 1] : 0; + if (next >= 5) { + cnt += 5; + nextUp = true; + } else { + cnt += 5; + } + } + } + if (nextUp) cnt += 1; + return cnt; + } + } +} diff --git "a/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\271_1.java" "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\271_1.java" new file mode 100644 index 0000000..96fbd6a --- /dev/null +++ "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\271_1.java" @@ -0,0 +1,36 @@ +package week18.강성욱.programmers; + +import java.util.PriorityQueue; + +/** + * PackageName : week18.강성욱.programmers + * FileName : 명예의_전당_1 + * Author : Baekgwa + * Date : 2025-08-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-29 Baekgwa Initial creation + */ +public class 명예의_전당_1 { + class Solution { + public int[] solution(int k, int[] score) { + PriorityQueue pq = new PriorityQueue<>(); + int[] result = new int[score.length]; + + for(int idx = 0; idx < score.length; idx++) { + int nowScore = score[idx]; + pq.offer(nowScore); + + if(pq.size() > k) { + pq.poll(); + } + + result[idx] = pq.peek(); + } + + return result; + } + } +} diff --git "a/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\254\264\354\235\270\353\217\204_\354\227\254\355\226\211.java" "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\254\264\354\235\270\353\217\204_\354\227\254\355\226\211.java" new file mode 100644 index 0000000..570c706 --- /dev/null +++ "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\254\264\354\235\270\353\217\204_\354\227\254\355\226\211.java" @@ -0,0 +1,80 @@ +package week18.강성욱.programmers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week18.강성욱.programmers + * FileName : 무인도_여행 + * Author : Baekgwa + * Date : 2025-08-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-29 Baekgwa Initial creation + */ +public class 무인도_여행 { + // 맵 돌아가면서, 검사 + // 땅찾으면 bfs 실시 + // visisted 는 전역적으로 사용할 것. + + class Solution { + public static final int[] dx = {-1, 0, 1, 0}; + public static final int[] dy = {0, -1, 0, 1}; + public static int maxX = 0; + public static int maxY = 0; + + public int[] solution(String[] maps) { + maxX = maps[0].length(); + maxY = maps.length; + char[][] map = new char[maxY][maxX]; + boolean[][] visited = new boolean[maxY][maxX]; + + for(int y=0; y result = new ArrayList<>(); + + for(int y=0; y= maxX || ny < 0 || ny >= maxY) continue; + if(visited[ny][nx] || map[ny][nx] == 'X') continue; + + result += dfs(nx, ny, visited, map); + } + + return result; + } + } +} diff --git "a/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..5eff843 --- /dev/null +++ "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" @@ -0,0 +1,34 @@ +package week18.강성욱.programmers; + +import java.util.Arrays; + +/** + * PackageName : week18.강성욱.programmers + * FileName : 문자열_내_마음대로_정렬하기 + * Author : Baekgwa + * Date : 2025-08-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-29 Baekgwa Initial creation + */ +public class 문자열_내_마음대로_정렬하기 { + + class Solution { + public String[] solution(String[] strings, int n) { + Arrays.sort(strings, (a, b) -> { + char c1 = a.charAt(n); + char c2 = b.charAt(n); + + if(c1 == c2) { + return a.compareTo(b); + } + + return Character.compare(c1, c2); + }); + + return strings; + } + } +} diff --git "a/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\260\260\353\213\254.java" "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\260\260\353\213\254.java" new file mode 100644 index 0000000..2303a0d --- /dev/null +++ "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\353\260\260\353\213\254.java" @@ -0,0 +1,85 @@ +package week18.강성욱.programmers; + +import java.util.Arrays; +import java.util.PriorityQueue; + +/** + * PackageName : week18.강성욱.programmers + * FileName : 배달 + * Author : Baekgwa + * Date : 2025-08-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-29 Baekgwa Initial creation + */ +public class 배달 { + + class Solution { + public int solution(int N, int[][] road, int K) { + int[][] map = new int[N + 1][N + 1]; + for (int i = 1; i <= N; i++) { + Arrays.fill(map[i], Integer.MAX_VALUE); + map[i][i] = 0; + } + for (int[] r : road) { + int from = r[0]; + int to = r[1]; + int value = r[2]; + if (value < map[from][to]) { + // 양방향 간선 + map[from][to] = value; + map[to][from] = value; + } + } + + int[] dist = new int[N + 1]; + Arrays.fill(dist, Integer.MAX_VALUE); + dist[1] = 0; + + PriorityQueue pq = new PriorityQueue<>(); + pq.offer(new State(1, 0)); + + while (!pq.isEmpty()) { + State cur = pq.poll(); + int nowNode = cur.node; + int nowDist = cur.dist; + if (nowDist > dist[nowNode]) continue; + for (int nextNode = 1; nextNode <= N; nextNode++) { + if (map[nowNode][nextNode] == Integer.MAX_VALUE) continue; + int nextDist = nowDist + map[nowNode][nextNode]; + if (nextDist < dist[nextNode]) { + dist[nextNode] = nextDist; + pq.offer(new State(nextNode, nextDist)); + } + } + } + + int result = 0; + for (int i = 1; i <= N; i++) { + if (dist[i] <= K) { + result++; + } + } + return result; + } + + private static class State implements Comparable { + private final int node; + private final int dist; + + public State(int node, int dist) { + this.node = node; + this.dist = dist; + } + + @Override + public int compareTo(State o) { + int c = Integer.compare(this.dist, o.dist); + return (c != 0) ? c : Integer.compare(this.node, o.node); + } + } + } + +} diff --git "a/week18/\352\260\225\354\204\261\354\232\261/programmers/\354\231\204\354\240\204\353\262\224\354\243\204.java" "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\354\231\204\354\240\204\353\262\224\354\243\204.java" new file mode 100644 index 0000000..c18884e --- /dev/null +++ "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\354\231\204\354\240\204\353\262\224\354\243\204.java" @@ -0,0 +1,68 @@ +package week18.강성욱.programmers; + +import java.util.Arrays; + +/** + * PackageName : week18.강성욱.programmers + * FileName : 완전범죄 + * Author : Baekgwa + * Date : 2025-08-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-29 Baekgwa Initial creation + */ +public class 완전범죄 { + class Solution { + public int solution(int[][] info, int n, int m) { + // dp[j] = A 도둑이 j개의 흔적을 남겼을 때, B 도둑이 남긴 흔적의 최솟값 + int[] dp = new int[n]; + + // 도달할 수 없는 상태를 표현하기 위해 아주 큰 값을 사용 (무한대) + Arrays.fill(dp, Integer.MAX_VALUE); + + // 초기 상태: A 흔적이 0개일 때 B 흔적도 0개 + // dp[10] = 20; A 흔적이 10일때 최소 B 흔적은 20; + dp[0] = 0; + + // 각 물건을 순회하며 누가 훔칠지 결정 + for (int[] item : info) { + int aTrace = item[0]; + int bTrace = item[1]; + + // 다음 상태를 저장할 배열. Integer.MAX_VALUE 초기화하여 이전 상태와 완전히 분리 + int[] nextDp = new int[n]; + Arrays.fill(nextDp, Integer.MAX_VALUE); + + // 0부터 n-1까지 모든 가능한 A의 이전 흔적 상태를 확인 + for (int j = 0; j < n; j++) { + // 이전 상태(dp[j])가 도달 가능할 때만 다음 상태로 전이 가능 + if (dp[j] == Integer.MAX_VALUE) { + continue; + } + + // 경우 1: B가 현재 물건을 훔치는 경우 + int bIfBSteals = dp[j] + bTrace; + nextDp[j] = Math.min(nextDp[j], bIfBSteals); + + // 경우 2: A가 현재 물건을 훔치는 경우 + int newATrace = j + aTrace; + if (newATrace < n) { + int bIfASteals = dp[j]; + nextDp[newATrace] = Math.min(nextDp[newATrace], bIfASteals); + } + } + dp = nextDp; + } + + for (int j = 0; j < n; j++) { + if (dp[j] < m) { + return j; + } + } + + return -1; + } + } +} diff --git "a/week18/\352\260\225\354\204\261\354\232\261/programmers/\354\244\204_\354\204\234\353\212\224_\353\260\251\353\262\225.java" "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\354\244\204_\354\204\234\353\212\224_\353\260\251\353\262\225.java" new file mode 100644 index 0000000..6d9e119 --- /dev/null +++ "b/week18/\352\260\225\354\204\261\354\232\261/programmers/\354\244\204_\354\204\234\353\212\224_\353\260\251\353\262\225.java" @@ -0,0 +1,51 @@ +package week18.강성욱.programmers; + +import java.util.ArrayList; +import java.util.List; + +/** + * PackageName : week18.강성욱.programmers + * FileName : 줄_서는_방법 + * Author : Baekgwa + * Date : 2025-08-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-29 Baekgwa Initial creation + */ +public class 줄_서는_방법 { + // 전체 가짓수는 n! 개만큼 + // 백트래킹 사용하면 최악의 조건에서 너무 확인을 많이해야함. + // 마지막이 정답이면 20! 만큼 확인 + // ---- + // 계산? + // 4, 24가지 + // 12번째를 구한다면? + // 1을 선택했을때, [1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], [1, 3, 4, 2], [1, 4, 2, 3], [1, 4, 3, 2] 까지 + // 6씩 나누면 됨. 6 => 3*2; + // 12번째는 맨앞자리가 2어야 함. [2, ?, ?, ?]; + + // 2번째자리. 남아있는 숫자는 [1, 3, 4]; + // 2씩 나누기. + + class Solution { + public int[] solution(int n, long k) { + List numList = new ArrayList<>(n); + for (int i = 1; i <= n; i++) numList.add(i); + long kIdx = k - 1; + long block = 1L; + for (int i = 2; i <= n - 1; i++) block *= i; + + int[] ans = new int[n]; + for (int pos = 0; pos < n; pos++) { + int remaining = n - pos; + int idx = (int)(kIdx / block); + kIdx %= block; + ans[pos] = numList.remove(idx); + if (remaining > 1) block /= (remaining - 1); + } + return ans; + } + } +} diff --git "a/week18/\352\271\200\353\202\230\354\235\200/programmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\2711.java" "b/week18/\352\271\200\353\202\230\354\235\200/programmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\2711.java" new file mode 100644 index 0000000..5ea78a1 --- /dev/null +++ "b/week18/\352\271\200\353\202\230\354\235\200/programmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\2711.java" @@ -0,0 +1,31 @@ +package week18.김나은.programmers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class 명예의_전당1 { + + class Solution { + + public int[] solution(int k, int[] score) { + int[] answer = new int[score.length]; + + // 명예의 전당: 지금까지 점수 중 상위 k개만 관리하는 리스트 + List rank = new ArrayList<>(); + + for (int i = 0; i < score.length; i++) { + // k번째 이전 인덱스까지 rank에 저장 + rank.add(score[i]); + + // rank 리스트의 크기가 k보다 크면 가장 낮은 점수 제거 + if (rank.size() > k) { + rank.remove(Collections.min(rank)); + } + // 현재 명예의 전당에서 가장 낮은 점수를 발표 + answer[i] = Collections.min(rank); + } + return answer; + } + } +} \ No newline at end of file diff --git "a/week18/\352\271\200\353\202\230\354\235\200/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" "b/week18/\352\271\200\353\202\230\354\235\200/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..5a9e05e --- /dev/null +++ "b/week18/\352\271\200\353\202\230\354\235\200/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" @@ -0,0 +1,26 @@ +package week18.김나은.programmers; + +import java.util.Arrays; + +public class 문자열_내_마음대로_정렬하기 { + + class Solution { + + public String[] solution(String[] strings, int n) { + // 각 문자열 앞에 정렬 기준이 될 n번째 문자를 붙인다. + for (int i = 0; i < strings.length; i++) { + strings[i] = strings[i].charAt(n) + strings[i]; + } + + // 오름차순 정렬 + Arrays.sort(strings); + + // 정렬을 위해 붙였던 문자를 제거한 데이터를 strings에 저장한다. + for (int i = 0; i < strings.length; i++) { + strings[i] = strings[i].substring(1); + } + + return strings; + } + } +} \ No newline at end of file diff --git "a/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\247\210\353\262\225\354\235\230_\354\227\230\353\246\254\353\262\240\354\235\264\355\204\260.java" "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\247\210\353\262\225\354\235\230_\354\227\230\353\246\254\353\262\240\354\235\264\355\204\260.java" new file mode 100644 index 0000000..9bf98ec --- /dev/null +++ "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\247\210\353\262\225\354\235\230_\354\227\230\353\246\254\353\262\240\354\235\264\355\204\260.java" @@ -0,0 +1,68 @@ +package week18.김누리.programmers; + +/** + * PackageName : week18.김누리.programmers + * FileName : 마법의_엘리베이터 + * Author : 김누리(NRKim) + * Date : 2025-08-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 25. 김누리(NRKim) Initial creation + */ + +/* + +엘레베이터가 가능한 이동 거리 +-100, -10, -1, 1, 10, 100 처럼 10^n 층 단위로 이동 가능 + + +2554 + + -1 : 4번 ==> 2550 + 100 : 4번 ==> 2950 + 10 : 5번 ==> 3000 +-1000 : 3번 ==> 0 ===> goal + +이거는 그리디다. + +그러면? 자릿수 쪼개면서 ++ 할건지? -- 할건지 측정해가면서 돌 카운팅 + +*/ + +public class 마법의_엘리베이터 { + public int solution(int storey) { + int answer = 0; + + while (storey > 0) { + int d = storey % 10; // 현재 자릿수 + int next = (storey/10) % 10; // 다음번 자릿수 + + // 현재 자릿수가 5 미만일 때 + if(d < 5) { + answer += d; + storey /= 10; + } + + // 현재 자릿수가 5 초과 일 때 + else if(d > 5) { + answer += (10 - d); + storey = storey/ 10 + 1; + } + + else { + if(next >= 5) { + answer += 5; + storey = storey / 10 + 1; + } else { + answer += 5; + storey /= 10; + } + } + } + + + return answer; + } +} diff --git "a/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\271.java" "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\271.java" new file mode 100644 index 0000000..447b9d4 --- /dev/null +++ "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\271.java" @@ -0,0 +1,78 @@ +package week18.김누리.programmers; + +import java.util.ArrayList; +import java.util.List; +import java.util.PriorityQueue; + +/** + * PackageName : week18.김누리.programmers + * FileName : 명예의_전당 + * Author : 김누리(NRKim) + * Date : 2025-08-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 28. 김누리(NRKim) Initial creation + */ + +/* + + 배열 사이즈 = k + 7 < 취득 점수 배열 : [score] < 1000 + 0 < 점수 < 2000 + + Queue 이용 + Queue의 사이즈 == k ? pop ==> queue의 가장 처음 들어온거 out + + score[0] queue && answer[0]에 입력, min 변수에도 입력 + score[1] > min보다 작으면 min 갱신 + min 보다 크면 queue에 입력 + + + Case 1 + 1일차 : score[0] == 10, + queue={10}, + min = 10 answer = {10} + 2일차 : score[1] == 100, + queue={10,100}, + min = 10 answer = {10,10} + 3일차 : score[2] == 20, + queue={10,20,100}, + min = 10 answer = {10,10,10} >> queue.size > K(3) + 4일차 : score[3] == 150, + queue={20,100,150} + min = 20 answer = {10,10,10,20} + 5일차 : score[4] == 1, + queue={20,100,150} + min = 20 answer = {10,10,10,20,20} + 6일차 : score[6] == 100, + queue={100,100,150} + min = 20 answer = {10,10,10,20,20,100} + 7일차 : score[7] == 200, + queue={100,150,200} + min = 20 answer = {10,10,10,20,20,100,100} + +*/ + + +public class 명예의_전당 { + public List solution(int k, int[] score) { + List answer = new ArrayList<>(); + PriorityQueue hall = new PriorityQueue<>(); + + for (int s : score) { + if(hall.size() < k) { + hall.add(s); + } else { + if(s > hall.peek()) { + hall.poll(); + hall.add(s); + } + } + answer.add(hall.peek()); + } + + return answer; + } +} diff --git "a/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\254\264\354\235\270\353\217\204_\354\227\254\355\226\211.java" "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\254\264\354\235\270\353\217\204_\354\227\254\355\226\211.java" new file mode 100644 index 0000000..9f0c6f6 --- /dev/null +++ "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\254\264\354\235\270\353\217\204_\354\227\254\355\226\211.java" @@ -0,0 +1,99 @@ +package week18.김누리.programmers; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + * PackageName : week18.김누리.programmers + * FileName : 무인도_여행 + * Author : 김누리(NRKim) + * Date : 2025-08-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 25. 김누리(NRKim) Initial creation + */ + +/* + +이거는 bfs 방식 채용하면 될 듯 + + +maps 를 2차원 배열로 해서 맵으로 만들고 진행하면 될듯 + +*/ + +public class 무인도_여행 { + int[] dx = {1,-1,0,0}; // x축 좌표 + int[] dy = {0,0,1,-1}; // y축 좌표 + int n; + int m; + boolean[][] visited; + + public int[] solution(String[] maps) { + String[][] map = new String[maps.length][]; + + // String[] 배열로 들어온 maps를 좀 더 직관적으로 보기 위해 + // 2차원 배열화 + int idx = 0; + + for(String m : maps) { + String[] tmp = m.split(""); + + map[idx++] = tmp; + + } + + n = map.length; // x축 범위 + m = map[0].length; // y축 범위 + + List list = new ArrayList<>(); + visited = new boolean[n][m]; + + for(int i = 0; i < n; i++) { + + for(int j = 0; j < m; j++) { + // 현재 값이 X가 아닌 것만 bfs 진행 + if(!visited[i][j] && !map[i][j].equals("X")) { + list.add(bfs(i,j,map)); + } + } + } + + if(list.size() == 0) return new int[] {-1}; + return list.stream().sorted().mapToInt(Integer::intValue).toArray(); + } + + private int bfs(int x, int y, String[][] map) { + Queue q = new LinkedList<>(); + q.offer(new int[] {x,y}); + visited[x][y] = true; + int sum = 0; + + while(!q.isEmpty()) { + int[] now = q.poll(); + int cx = now[0]; + int cy = now[1]; + sum += Integer.parseInt(map[cx][cy]); + + for(int i = 0; i < 4; i++) { + int nx = cx + dx[i]; + int ny = cy + dy[i]; + + if(nx < 0 || ny < 0 || nx >= n || ny >= m) continue; + if(visited[nx][ny]) continue; + + // 인접한 좌표는 "X" 값일수도 있음 + if(map[nx][ny].equals("X")) continue; + + visited[nx][ny] = true; + q.add(new int[] {nx,ny}); + } + } + + return sum; + } +} diff --git "a/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..e350ef3 --- /dev/null +++ "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" @@ -0,0 +1,58 @@ +package week18.김누리.programmers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * PackageName : week18.김누리.programmers + * FileName : 문자열_내_마음대로_정렬하기 + * Author : 김누리(NRKim) + * Date : 2025-08-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 25. 김누리(NRKim) Initial creation + */ + +public class 문자열_내_마음대로_정렬하기 { + + // Lambda식 이용 안함 + /*public String[] solution(String[] strings, int n) { + String[] answer = new String[strings.length]; + Set hs = new HashSet(); + + for(String s : strings) { + hs.add(s.charAt(n) + s); + } + + List tmp = new ArrayList(hs); + + Collections.sort(tmp); + + for(int i = 0; i < tmp.size(); i++) { + String s = tmp.get(i); + + answer[i] = s.substring(1); + } + + return answer; + + }*/ + + // Lambda 식 풀이 + public String[] solution(String[] strings, int n) { + Arrays.sort( + strings, Comparator + .comparing((String s) -> s.charAt(n)) + .thenComparing(s -> s) + ); + + return strings; + } +} diff --git "a/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\260\260\353\213\254.java" "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\260\260\353\213\254.java" new file mode 100644 index 0000000..fbc98ae --- /dev/null +++ "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\353\260\260\353\213\254.java" @@ -0,0 +1,130 @@ +package week18.김누리.programmers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.PriorityQueue; +import java.util.Queue; + +/** + * PackageName : week18.김누리.programmers + * FileName : 배달 + * Author : 김누리(NRKim) + * Date : 2025-08-27 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 27. 김누리(NRKim) Initial creation + */ + +/* + +N은 마을의 총 갯수 , K는 제한시간. 이 시간 넘어가면 배달 안받음 + +[ + [1,2,1], >> 1 - 2 연결, 걸리는 시간 1 + [2,3,3], >> 2 - 3 연결, 걸리는 시간 3 + [5,2,2], >> 5 - 2 연결, 걸리는 시간 2 + [1,4,2], >> 1 - 4 연결, 걸리는 시간 2 + [5,3,1], >> 5 - 3 연결, 걸리는 시간 1 + [5,4,2], >> 5 - 4 연결, 걸리는 시간 2 +] + +1번에 있는 음식점에서 각 2 3 4 5로 배달 할 때 배달이 가능한 음식점의 갯수는? + +1 -> 1 : 즈그 동네이니까 가능 +1 -> 2 : 1시간 >> K(3) 이하이므로 가능. +1 -> 3 : + 1 > 2 > 3으로 가면 4시간이므로 K 범위를 초과하므로 불가능 + 1 > 2 > 5 > 3 으로 가도 4시간 NG + 1 > 4 > 5 > 3 으로 가면 5시간 NG +1 -> 4 : 2시간 가능 +1 -> 5 : + 1 > 2 > 5 >> 딱 3시간 >> OK + 1 > 4 > 5 >> 4시간이기 때문에 불가능 + +결과적으로는 1,2,4,5 마을에 배달이 가능하다..... + +딱 하고 떠오르는 선택지는 bfs, 그리고 자신없는 dp 뿐인거 같은데... + +bfs가 좀 더 맞는거 같은 느낌인데...? + + +*/ + +public class 배달 { + // 노드간 이어져있는 상황 + public static class Edge { + int to, w; + + Edge(int to, int w) { + this.to = to; + this.w = w; + } + } + + // 이어진 노드 별로 걸리는 이동 시간 + public static class State { + int node, cost; // 노드, 노드간 걸리는 시간 + + State(int node, int cost) { + this.node = node; + this.cost = cost; + } + } + + public int solution(int N, int[][] road, int K) { + final int INF = Integer.MAX_VALUE; + + // 연결 된 노드들 정리하기 위한 리스트 + List> list = new ArrayList<>(); + + // 리스트 초기화 + for (int i = 0; i <= N; i++) + list.add(new ArrayList<>()); + + for (int[] r : road) { + int a = r[0], b = r[1], w = r[2]; + list.get(a).add(new Edge(b, w)); + list.get(b).add(new Edge(a, w)); + } + + // 최단시간 값이 저장 될 배열 + // 실제 마을의 시작값은 1부터이고, 1부터 체킹하기 위해 + // 배열을 N+1사이즈로 잡고 0번 인덱스는 0으로 지정 + int[] dist = new int[N + 1]; + Arrays.fill(dist, Integer.MAX_VALUE); + dist[1] = 0; + + Queue q = new PriorityQueue<>(Comparator.comparingInt(s -> s.cost)); + q.offer(new State(1, 0)); + + while (!q.isEmpty()) { + State now = q.poll(); + + if (now.cost > dist[now.node]) + continue; // 더 먼 거리로 판명되면 skip + + for (Edge e : list.get(now.node)) { + int nd = now.cost + e.w; + + if (nd < dist[e.to]) { + dist[e.to] = nd; + q.offer(new State(e.to, nd)); + } + } + } + + // K 이하의 마을 카운트 + int answer = 0; + + for (int i = 1; i <= N; i++) { + if (dist[i] <= K) + answer++; + } + + return answer; + } +} diff --git "a/week18/\352\271\200\353\210\204\353\246\254/programmers/\354\231\204\354\240\204\353\262\224\354\243\204.java" "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\354\231\204\354\240\204\353\262\224\354\243\204.java" new file mode 100644 index 0000000..8e8bd78 --- /dev/null +++ "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\354\231\204\354\240\204\353\262\224\354\243\204.java" @@ -0,0 +1,76 @@ +package week18.김누리.programmers; + +/** + * PackageName : week18.김누리.programmers + * FileName : 완전범죄 + * Author : 김누리(NRKim) + * Date : 2025-08-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 28. 김누리(NRKim) Initial creation + */ + +/* + +n = A 도둑의 흔적 갯수 +m = B 도둑의 흔적 갯수 + +case 1 : + +info = [ + [1,2], >> 1번째 보물 >> A 도둑 흔적 1, B 도둑 흔적 2 + [2,3], >> 2번째 보물 >> A 도둑 흔적 2, B 도둑 흔적 3 + [2,1] >> 3번째 보물 >> A 도둑 흔적 2, B 도둑 흔적 1 +] + +n = 4 +m = 4 + +A도둑이 남긴 흔적의 누적 갯수의 최소값을 리턴 + +그러면... 결국 A 도둑이 가능한 적은 수를 훔쳐야 하니 dp 방식을 쓰면 될 거 같은데.. + +*/ + + +public class 완전범죄 { + public int solution(int[][] info, int n, int m) { + int maxA = 0, maxB = 0; + boolean[][] dp = new boolean[n][m]; + dp[0][0] = true; + + for(int[] i : info) { + int addA = i[0], addB = i[1]; + boolean[][] next = new boolean[n][m]; + + // 도둑질 작업 개시 + for(int a = 0; a < n; a++) { + for(int b = 0; b < m; b++) { + if(!dp[a][b]) continue; // 0,0은 스킵 + + int na = a + addA, nb = b; // A가 훔칠 경우 + + if(na < n) next[na][nb] = true; // a가 훔친 흔적이 n보다 작으면 a가 훔치기 + + na = a; // a 초기화 + nb = b + addB; // b가 훔침 + + if(nb < m) next[na][nb] = true; + } + } + + dp = next; // dp 배열 최신화 + } + + // dp 배열 순회하며 a의 최소값 반환 + for(int a = 0; a < n; a++) { + for(int b = 0; b < m; b++) { + if (dp[a][b]) return a; + } + } + + return -1; + } +} diff --git "a/week18/\352\271\200\353\210\204\353\246\254/programmers/\354\244\204_\354\204\234\353\212\224_\353\260\251\353\262\225.java" "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\354\244\204_\354\204\234\353\212\224_\353\260\251\353\262\225.java" new file mode 100644 index 0000000..acc0c7b --- /dev/null +++ "b/week18/\352\271\200\353\210\204\353\246\254/programmers/\354\244\204_\354\204\234\353\212\224_\353\260\251\353\262\225.java" @@ -0,0 +1,53 @@ +package week18.김누리.programmers; + +import java.util.ArrayList; +import java.util.List; + +/** + * PackageName : week18.김누리.programmers + * FileName : 줄_서는_방법 + * Author : 김누리(NRKim) + * Date : 2025-08-26 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 26. 김누리(NRKim) Initial creation + */ + +/* + +중고등학생 때, n!( 팩토리얼, 수열 공식 ) 구현하는 문제. + +1 ~ n 까지 인원을 나열 하는 방법을 수열 방식으로 정렬 하는게 핵심 + +*/ + +public class 줄_서는_방법 { + public int[] solution(int n, long k) { + int[] answer = new int [n]; + + // 1 ~ n 까지 리스트화 + List list = new ArrayList<>(n); + for(int i = 1; i <= n; i++) list.add(i); + + long[] fact = new long[n + 1]; + fact[0] = 1; + + // 순열 (n!) 계산 + for(int i = 1; i <= n; i++) fact[i] = fact[i - 1] * i; + + k--; // idx 맞추기 + + + for(int i = 0; i < n; i++) { + long block = fact[n - 1 - i]; + int idx = (int)(k/block); + answer[i] = list.get(idx); + list.remove(idx); + k %= block; + } + + return answer; + } +} diff --git "a/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\247\210\353\262\225\354\235\230_\354\227\230\353\246\254\353\262\240\354\235\264\355\204\260.java" "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\247\210\353\262\225\354\235\230_\354\227\230\353\246\254\353\262\240\354\235\264\355\204\260.java" new file mode 100644 index 0000000..d1ad498 --- /dev/null +++ "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\247\210\353\262\225\354\235\230_\354\227\230\353\246\254\353\262\240\354\235\264\355\204\260.java" @@ -0,0 +1,48 @@ +/** + * PackageName : week18.이상억.progarmmers; + * FileName : 마법의_엘리베이터 + * Author : sangeok + * Date : 2025. 08. 27. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 27달. sangeok Initial creation + */ + + +// 절대값이 10의 제곱승 형태인 정수들이 적힌 버튼 +// 현재 층과 버튼의 값을 더한 결과가 0 보다 작으면 움직이지 않음 +// 0 층이 가장 아래층 + + + +class Solution { + public int solution(int storey) { + int answer = 0; + + while(storey > 0){ + + int cur = storey % 10; + int next= (storey / 10 ) % 10; + + if(cur > 5 ){ + answer += (10-cur); + storey = storey / 10 + 1; + } else if( cur < 5){ + answer += cur; + storey /= 10; + } else { + if(next >= 5){ + answer += 10 - cur; + storey = (storey/10) +1; + } else { + answer += cur; + storey /= 10; + } + } + + } + return answer; + } +} \ No newline at end of file diff --git "a/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\271(1).java" "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\271(1).java" new file mode 100644 index 0000000..e5bcf8c --- /dev/null +++ "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\252\205\354\230\210\354\235\230_\354\240\204\353\213\271(1).java" @@ -0,0 +1,39 @@ +/** + * PackageName : week18.이상억.progarmmers; + * FileName : 명예의_전당(1) + * Author : sangeok + * Date : 2025. 08. 27. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 27달. sangeok Initial creation + */ + +// 상위 k 번째 이내이면 명예의 전당 기록 +// k일 다음 부터는 출연 가수의 점수가 기존의 명예의 전당 목록의 k 번째 순위의 가수 점수보다 높으면 명예의 전당 + +import java.util.*; + +class Solution { + public int[] solution(int k, int[] score) { + int[] answer = new int[score.length]; + + List list = new ArrayList<>(); + + PriorityQueue pq = new PriorityQueue<>(); + + for(int a : score){ + pq.add(a); + + if(pq.size() > k) pq.poll(); + + list.add(pq.peek()); + } + + for(int i = 0; i < list.size(); i++){ + answer[i] = list.get(i); + } + return answer; + } +} \ No newline at end of file diff --git "a/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\264\354\235\270\353\217\204_\354\227\254\355\226\211.java" "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\264\354\235\270\353\217\204_\354\227\254\355\226\211.java" new file mode 100644 index 0000000..6fe9ae3 --- /dev/null +++ "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\264\354\235\270\353\217\204_\354\227\254\355\226\211.java" @@ -0,0 +1,94 @@ +/** + * PackageName : week18.이상억.progarmmers; + * FileName : 무인도_여행 + * Author : sangeok + * Date : 2025. 08. 25. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 25. sangeok Initial creation + */ + + +// 'X' : 바다 , 숫자는 무인도 +// 지도의 각 칸에 적힌 숫자는 식량을 나타냄 , 상,하,좌,우로 연결되는 값 더할 수 있음 + +// X591X +// X1X5X +// X231X +// 1XXX1 + +import java.util.*; + +class Solution { + int[] dx = {-1, 1, 0, 0}; + int[] dy = {0, 0, -1, 1}; + + char[][] grid; + boolean[][] visited; + int n, m; + + public int[] solution(String[] maps) { + m = maps.length; + n = maps[0].length(); + grid = new char[m][n]; + visited = new boolean[m][n]; + + // maps -> grid 변환 + for (int i = 0; i < m; i++) { + grid[i] = maps[i].toCharArray(); + } + + List result = new ArrayList<>(); + + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (grid[i][j] != 'X' && !visited[i][j]) { + int sum = bfs(i, j); + result.add(sum); + } + } + } + + if (result.isEmpty()) { + return new int[]{-1}; + } + + Collections.sort(result); + + int[] answer = new int[result.size()]; + for (int i = 0; i < result.size(); i++) { + answer[i] = result.get(i); + } + return answer; + } + + public int bfs(int x, int y) { + Queue queue = new LinkedList<>(); + queue.add(new int[]{x, y}); + visited[x][y] = true; + + int sum = grid[x][y] - '0'; + + while (!queue.isEmpty()) { + int[] cur = queue.poll(); + int tx = cur[0]; + int ty = cur[1]; + + for (int t = 0; t < 4; t++) { + int nx = tx + dx[t]; + int ny = ty + dy[t]; + + if (nx < 0 || ny < 0 || nx >= m || ny >= n) continue; + if (visited[nx][ny]) continue; + if (grid[nx][ny] == 'X') continue; + + visited[nx][ny] = true; + sum += grid[nx][ny] - '0'; + queue.add(new int[]{nx, ny}); + } + } + return sum; + } +} diff --git "a/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..aa8d94d --- /dev/null +++ "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\254\270\354\236\220\354\227\264_\353\202\264_\353\247\210\354\235\214\353\214\200\353\241\234_\354\240\225\353\240\254\355\225\230\352\270\260.java" @@ -0,0 +1,43 @@ +/** + * PackageName : week18.이상억.progarmmers; + * FileName : 문자열_내_마음대로_정렬하기 + * Author : sangeok + * Date : 2025. 08. 25. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 25. sangeok Initial creation + */ + + + +class Solution { + public String[] solution(String[] strings, int n) { + return bubble_sort(strings, n); + } + + public String[] bubble_sort(String[] strings, int n) { + int len = strings.length; + for (int i = 0; i < len - 1; i++) { + for (int j = 0; j < len - i - 1; j++) { + char c1 = strings[j].charAt(n); + char c2 = strings[j + 1].charAt(n); + + if (c1 > c2) { + swap(strings, j, j + 1); + } + else if (c1 == c2 && strings[j].compareTo(strings[j + 1]) > 0) { + swap(strings, j, j + 1); + } + } + } + return strings; + } + + private void swap(String[] arr, int i, int j) { + String tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } +} diff --git "a/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\260\260\353\213\254.java" "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\260\260\353\213\254.java" new file mode 100644 index 0000000..03ed215 --- /dev/null +++ "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\353\260\260\353\213\254.java" @@ -0,0 +1,87 @@ +/** + * PackageName : week18.이상억.progarmmers; + * FileName : 배달 + * Author : sangeok + * Date : 2025. 08. 27. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 27. sangeok Initial creation + */ + +// n개의 마을로 이루어진 나라 +// n 개의 마을에서 k 시간 이하로 배달이 가능한 마을에서만 줌누을 받으려 함 + + +import java.util.*; + +class Solution { + + static class Node{ + int v; + int cost; + public Node(int v, int cost){ + this.v = v; + this.cost = cost; + } + } + + static ArrayList[] graph; + static boolean[] visited; + static int[] dist; + static final int max = Integer.MAX_VALUE; + + public int solution(int N, int[][] road, int K) { + + graph = new ArrayList[N+1]; + visited = new boolean[N+1]; + dist = new int[N+1]; + + for(int i = 1; i<=N; i++){ + graph[i] = new ArrayList<>(); + dist[i] = max; + } + + for(int[] r : road){ + int node_1 = r[0]; + int node_2 = r[1]; + int node_cost = r[2]; + + graph[node_1].add(new Node(node_2,node_cost)); + graph[node_2].add(new Node(node_1,node_cost)); + } + + + dijkstra(1); + + int answer = 0; + + for(int i = 1; i<= N; i++){ + if(dist[i] <= K){ + answer ++; + } + } + return answer; + } + public 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(); + int v = now.v; + + if (visited[v]) continue; + visited[v] = true; + + for (Node next : graph[v]) { + if (dist[next.v] > dist[v] + next.cost) { + dist[next.v] = dist[v] + next.cost; + pq.add(new Node(next.v, dist[next.v])); + } + } + } + } +} \ No newline at end of file diff --git "a/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\354\231\204\354\240\204\353\262\224\354\243\204.java" "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\354\231\204\354\240\204\353\262\224\354\243\204.java" new file mode 100644 index 0000000..a98bcfd --- /dev/null +++ "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\354\231\204\354\240\204\353\262\224\354\243\204.java" @@ -0,0 +1,77 @@ +/** + * PackageName : week18.이상억.progarmmers; + * FileName : 완전범죄 + * Author : sangeok + * Date : 2025. 08. 28. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 28. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + static final int INF = 100000; + + public int solution(int[][] info, int n, int m) { + int size = info.length; + int[][] dp = new int[size + 1][m]; + for (int i = 0; i <= size; i++) { + Arrays.fill(dp[i], INF); + } + dp[0][0] = 0; + + for (int i = 1; i <= size; i++) { + int a = info[i - 1][0]; + int b = info[i - 1][1]; + for (int j = 0; j < m; j++) { + if (dp[i - 1][j] >= INF) continue; + // A가 훔치는 경우 + dp[i][j] = Math.min(dp[i][j], dp[i - 1][j] + a); + // B가 훔치는 경우 + if (j + b < m) { + dp[i][j + b] = Math.min(dp[i][j + b], dp[i - 1][j]); + } + } + } + + int answer = INF; + for (int j = 0; j < m; j++) { + answer = Math.min(answer, dp[size][j]); + } + + return (answer >= n) ? -1 : answer; + } +} + + +// a 도둑이 훔치면 info[i][0] 개의 흔적 >= n 이면 잡힘 +// b 도둑이 훔치면 info[i][1] 개의 흔적 >= m 이면 잡힘 + +// 훔칠 때 생기는 흔적에 대한 정보를 담은 info +//class Solution { +// int answer = Integer.MAX_VALUE; // 최소 A 흔적 수를 저장 +// +// public int solution(int[][] info, int n, int m) { +// dfs(info, n, m, 0, 0, 0); +// return (answer == Integer.MAX_VALUE) ? -1 : answer; +// } +// +// +// public void dfs(int[][] info, int n, int m, int index, int aSum, int bSum) { +// +// if (aSum >= n || bSum >= m) return; +// if (index == info.length) { +// if (aSum < n && bSum < m) { +// answer = Math.min(answer, aSum); +// } +// return; +// } +// +// dfs(info, n, m, index + 1, aSum + info[index][0], bSum); +// +// dfs(info, n, m, index + 1, aSum, bSum + info[index][1]); +// } +//} diff --git "a/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\354\244\204_\354\204\234\353\212\224_\353\260\251\353\262\225.java" "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\354\244\204_\354\204\234\353\212\224_\353\260\251\353\262\225.java" new file mode 100644 index 0000000..0e07844 --- /dev/null +++ "b/week18/\354\235\264\354\203\201\354\226\265/progarmmers/\354\244\204_\354\204\234\353\212\224_\353\260\251\353\262\225.java" @@ -0,0 +1,43 @@ + +/** + * PackageName : week18.이상억.progarmmers; + * FileName : 줄_서는_방법 + * Author : sangeok + * Date : 2025. 08. 27. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 27. sangeok Initial creation + */ +import java.util.*; + +class Solution { + public int[] solution(int n, long k) { + List numbers = new ArrayList<>(); + for (int i = 1; i <= n; i++) { + numbers.add(i); + } + + int[] answer = new int[n]; + long fact = 1; + + for (int i = 1; i <= n; i++) { + fact *= i; + } + + k--; + + for (int i = 0; i < n; i++) { + fact /= (n - i); + + int index = (int)(k / fact); + answer[i] = numbers.get(index); + numbers.remove(index); + + k %= fact; + } + + return answer; + } +} diff --git "a/week18_a/\352\260\225\354\204\261\354\232\261/baekjoon/\354\240\204\354\237\201_\354\240\204\355\210\254.java" "b/week18_a/\352\260\225\354\204\261\354\232\261/baekjoon/\354\240\204\354\237\201_\354\240\204\355\210\254.java" new file mode 100644 index 0000000..c80b413 --- /dev/null +++ "b/week18_a/\352\260\225\354\204\261\354\232\261/baekjoon/\354\240\204\354\237\201_\354\240\204\355\210\254.java" @@ -0,0 +1,74 @@ +package week18_a.강성욱.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * PackageName : week18_a.강성욱.baekjoon + * FileName : 전쟁_전투 + * Author : Baekgwa + * Date : 2025-08-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-08-29 Baekgwa Initial creation + */ +public class 전쟁_전투 { + public class Main { + + public static final int[] dx = {-1, 0, 1, 0}; + public static final int[] dy = {0, -1, 0, 1}; + public static int mx, my; + + public static void main(String args[]) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String[] size = br.readLine().split(" "); + mx = Integer.parseInt(size[0]); + my = Integer.parseInt(size[1]); + char[][] map = new char[my][mx]; + boolean[][] visited = new boolean[my][mx]; + + for(int y=0; y= mx || ny >= my) continue; + if(visited[ny][nx]) continue; + if(map[ny][nx] != target) continue; + + result += dfs(nx, ny, map, visited, target); + } + + return result; + } + } +} diff --git "a/week18_a/\352\271\200\353\210\204\353\246\254/baekjoon/\354\240\204\354\237\201_\354\240\204\355\210\254.java" "b/week18_a/\352\271\200\353\210\204\353\246\254/baekjoon/\354\240\204\354\237\201_\354\240\204\355\210\254.java" new file mode 100644 index 0000000..4b6779a --- /dev/null +++ "b/week18_a/\352\271\200\353\210\204\353\246\254/baekjoon/\354\240\204\354\237\201_\354\240\204\355\210\254.java" @@ -0,0 +1,112 @@ +package week18_a.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +/** + * PackageName : week18_a.김누리.baekjoon + * FileName : 전쟁_전투 + * Author : 김누리(NRKim) + * Date : 2025-08-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 29. 김누리(NRKim) Initial creation + */ + + +/* + +입력값 +N_M >> 아군세력_수__적군세력_수 + +예 ) 5 5 > 5 : 5 상황 + +WBWWW > W 1 B 1 W 3^2 (N명이 뭉친경우 N^2임. 즉 W가 3이니 3^2) ==> W : 10, B : 1 +WWWWW > W 5 >> 5^2 >> W 25 +BBBBB > B 5 >> 5^2 >> B 25 +BBBWW > B 3 W 2 >> 3^2 + 2^2 >> B 9 W 4 +WWWWW > W 5 >> 5^2 >> W 25 + + 그러면 W : 10 + 25 + 4 + 25 >> 64 + 그러면 B : 1 + 25 + 9 >> 35 + +*/ + + +public class 전쟁_전투 { + public static boolean[][] visited; + public static int[] dx = {-1, 1, 0, 0}; + public static int[] dy = {0, 0, -1, 1}; + public static int n, m; + public static char[][] battleField; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + StringTokenizer tk1 = new StringTokenizer(br.readLine()); + n = Integer.parseInt(tk1.nextToken()); // y축 + m = Integer.parseInt(tk1.nextToken()); // x축 + battleField = new char[m][n]; + + // 전장 상황 2차원 배열로 정리 + for(int i = 0; i < m; i++) { + tk1 = new StringTokenizer(br.readLine()); + char[] tmp = tk1.nextToken().toCharArray(); + + battleField[i] = tmp; + } + + visited = new boolean[m][n]; + + // 세력별 포인트 + int w = 0, b = 0; + + // 세력별 점수 계산 + for(int i = 0; i < m; i++) { + for(int j = 0; j < n; j++) { + if(!visited[i][j]) { + int size = bfs(i, j, battleField[i][j]); + if(battleField[i][j] == 'W') w += size * size; // Math.pow(size,2); + else b += size * size; + } + } + } + + bw.write(String.valueOf(w) + " " + String.valueOf(b)); + bw.flush(); + bw.close(); + } + + public static int bfs (int i, int j, char team) { + Queue q = new LinkedList<>(); + visited[i][j] = true; + q.offer(new int[] {i, j}); + int cnt = 1; + + while (!q.isEmpty()) { + int[] now = q.poll(); + int x = now[0], y = now[1]; + + for(int c = 0; c < 4; c++) { + int nx = x + dx[c]; + int ny = y + dy[c]; + + if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue; + if (visited[nx][ny]) continue; + if(battleField[nx][ny] != team) continue;; + visited[nx][ny] = true; + q.offer(new int[] {nx, ny}); + cnt++; + } + } + + return cnt; + } +} \ No newline at end of file diff --git "a/week18_a/\354\235\264\354\203\201\354\226\265/backjoon/\354\240\204\354\237\201_\354\240\204\355\210\254.java" "b/week18_a/\354\235\264\354\203\201\354\226\265/backjoon/\354\240\204\354\237\201_\354\240\204\355\210\254.java" new file mode 100644 index 0000000..e0ba7d9 --- /dev/null +++ "b/week18_a/\354\235\264\354\203\201\354\226\265/backjoon/\354\240\204\354\237\201_\354\240\204\355\210\254.java" @@ -0,0 +1,86 @@ +// N 명이 뭉쳐 있을 때 N^2 위력 - > 대각선으로 있을때는 뭉쳐있는거 아님 +// Input : 전쟁터의 가로 크기 : n , 세로 크기 : m ( 1<= n,m <= 100) +// B : blue , W : white +// 당신의 병사의 위력의 합과 적국의 병사의 위력의 합을 출력한다. +// 예제 입력 1 +// 5 5 +// WBWWW 81 49 +// WWWWW 64 + 1 +// BBBBB +// BBBWW +// WWWWW +// 130 65 + + +import java.util.*; +import java.io.*; + +public class Main { + + static int[] dx = {1, -1, 0, 0}; + static int[] dy = {0, 0, 1, -1}; + static int N, M; + static char[][] grid; + 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()); + M = Integer.parseInt(st.nextToken()); // 열 + N = Integer.parseInt(st.nextToken()); // 행 + + grid = new char[N][M]; + visited = new boolean[N][M]; + + for (int i = 0; i < N; i++) { + String line = br.readLine(); + grid[i] = line.toCharArray(); + } + + int w_power = 0; + int b_power = 0; + + for (int i = 0; i < N; i++) { + for (int j = 0; j < M; j++) { + if (!visited[i][j]) { + char team = grid[i][j]; + int size = bfs(i, j, team); + if (team == 'W') { + w_power += size * size; + } else if (team == 'B') { + b_power += size * size; + } + } + } + } + + System.out.println(w_power + " " + b_power); + } + + static int bfs(int x, int y, char team) { + Queue queue = new LinkedList<>(); + queue.add(new int[]{x, y}); + visited[x][y] = true; + int count = 1; + + while (!queue.isEmpty()) { + int[] current = queue.poll(); + int cx = current[0]; + int cy = current[1]; + + for (int d = 0; d < 4; d++) { + int nx = cx + dx[d]; + int ny = cy + dy[d]; + + if (nx >= 0 && ny >= 0 && nx < N && ny < M) { + if (!visited[nx][ny] && grid[nx][ny] == team) { + visited[nx][ny] = true; + queue.add(new int[]{nx, ny}); + count++; + } + } + } + } + return count; + } +} diff --git "a/week19/\352\260\225\354\204\261\354\232\261/programmers/N_\354\234\274\353\241\234_\355\221\234\355\230\204.java" "b/week19/\352\260\225\354\204\261\354\232\261/programmers/N_\354\234\274\353\241\234_\355\221\234\355\230\204.java" new file mode 100644 index 0000000..4c9dfb5 --- /dev/null +++ "b/week19/\352\260\225\354\204\261\354\232\261/programmers/N_\354\234\274\353\241\234_\355\221\234\355\230\204.java" @@ -0,0 +1,59 @@ +package week19.강성욱.programmers; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * PackageName : week19.강성욱.programmers + * FileName : N_으로_표현 + * Author : Baekgwa + * Date : 2025-09-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-05 Baekgwa Initial creation + */ +public class N_으로_표현 { + class Solution { + public int solution(int N, int number) { + if (N == number) return 1; + + List> dp = new ArrayList<>(); + for (int i = 0; i <= 8; i++) dp.add(new HashSet<>()); + + for (int cnt = 1; cnt <= 8; cnt++) { + Set cur = dp.get(cnt); + + // 1) cnt개 연속 N (예: 5, 55, 555 ...) + int concat = 0; + for (int k = 0; k < cnt; k++) concat = concat * 10 + N; + cur.add(concat); + + // 2) 분할 결합: cnt = left + right + for (int left = 1; left < cnt; left++) { + int right = cnt - left; + Set A = dp.get(left); + Set B = dp.get(right); + + for (int a : A) { + for (int b : B) { + cur.add(a + b); + cur.add(a - b); + cur.add(b - a); + cur.add(a * b); + if (b != 0) cur.add(a / b); + if (a != 0) cur.add(b / a); + } + } + } + + if (cur.contains(number)) return cnt; + } + return -1; + } + } + +} diff --git "a/week19/\352\260\225\354\204\261\354\232\261/programmers/\352\261\260\353\246\254\353\221\220\352\270\260_\355\231\225\354\235\270\355\225\230\352\270\260.java" "b/week19/\352\260\225\354\204\261\354\232\261/programmers/\352\261\260\353\246\254\353\221\220\352\270\260_\355\231\225\354\235\270\355\225\230\352\270\260.java" new file mode 100644 index 0000000..0a4c3eb --- /dev/null +++ "b/week19/\352\260\225\354\204\261\354\232\261/programmers/\352\261\260\353\246\254\353\221\220\352\270\260_\355\231\225\354\235\270\355\225\230\352\270\260.java" @@ -0,0 +1,84 @@ +package week19.강성욱.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week19.강성욱.programmers + * FileName : 거리두기_확인하기 + * Author : Baekgwa + * Date : 2025-09-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-05 Baekgwa Initial creation + */ +public class 거리두기_확인하기 { + class Solution { + private static final int[] dx = {-1, 0, 1, 0}; + private static final int[] dy = {0, -1, 0, 1}; + + public int[] solution(String[][] places) { + int[] result = new int[places.length]; + + int idx = 0; + for(String[] place : places) { + char[][] map = new char[5][5]; + for(int y=0; y<5; y++) { + map[y] = place[y].toCharArray(); + } + + boolean isOk = checkCovid(map); + result[idx++] = isOk ? 1 : 0; + } + + return result; + } + + private boolean checkCovid(char[][] map) { + for (int y = 0; y < 5; y++) { + for (int x = 0; x < 5; x++) { + if (map[y][x] == 'P') { + if (!bfs(y, x, map)) { + return false; + } + } + } + } + + return true; + } + + private boolean bfs(int startY, int startX, char[][] map) { + Queue queue = new LinkedList<>(); + queue.add(new int[]{startY, startX, 0}); + boolean[][] visited = new boolean[5][5]; + visited[startY][startX] = true; + + while (!queue.isEmpty()) { + int[] current = queue.poll(); + int y = current[0]; + int x = current[1]; + int dist = current[2]; + + for (int i = 0; i < 4; i++) { + int ny = y + dy[i]; + int nx = x + dx[i]; + + if (ny < 0 || ny >= 5 || nx < 0 || nx >= 5) continue; + if (visited[ny][nx]) continue; + if (dist + 1 > 2) continue; + if (map[ny][nx] == 'X') continue; + if (map[ny][nx] == 'P') { + return false; + } + + visited[ny][nx] = true; + queue.add(new int[]{ny, nx, dist + 1}); + } + } + return true; + } + } +} diff --git "a/week19/\352\260\225\354\204\261\354\232\261/programmers/\353\224\224\355\216\234\354\212\244_\352\262\214\354\236\204.java" "b/week19/\352\260\225\354\204\261\354\232\261/programmers/\353\224\224\355\216\234\354\212\244_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..3f8a4f6 --- /dev/null +++ "b/week19/\352\260\225\354\204\261\354\232\261/programmers/\353\224\224\355\216\234\354\212\244_\352\262\214\354\236\204.java" @@ -0,0 +1,38 @@ +package week19.강성욱.programmers; + +import java.util.PriorityQueue; + +/** + * PackageName : week19.강성욱.programmers + * FileName : 디펜스_게임 + * Author : Baekgwa + * Date : 2025-09-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-05 Baekgwa Initial creation + */ +public class 디펜스_게임 { + class Solution { + public int solution(int n, int k, int[] enemy) { + PriorityQueue pq = new PriorityQueue<>(); + + int round = 0; + for(int en : enemy) { + pq.offer(en); + if(pq.size() > k) { + n -= pq.poll(); + } + + if(n < 0) { + return round; + } + + round++; + } + + return enemy.length; + } + } +} diff --git "a/week19/\352\260\225\354\204\261\354\232\261/programmers/\353\251\224\353\211\264_\353\246\254\353\211\264\354\226\274.java" "b/week19/\352\260\225\354\204\261\354\232\261/programmers/\353\251\224\353\211\264_\353\246\254\353\211\264\354\226\274.java" new file mode 100644 index 0000000..f14bdca --- /dev/null +++ "b/week19/\352\260\225\354\204\261\354\232\261/programmers/\353\251\224\353\211\264_\353\246\254\353\211\264\354\226\274.java" @@ -0,0 +1,77 @@ +package week19.강성욱.programmers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week19.강성욱.programmers + * FileName : 메뉴_리뉴얼 + * Author : Baekgwa + * Date : 2025-09-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-05 Baekgwa Initial creation + */ +public class 메뉴_리뉴얼 { + + class Solution { + public void combine(String now, List combineList, String[] menuArray, int nowIdx) { + if(now.length() >= 2) combineList.add(now); + + for(int i=nowIdx; i < menuArray.length; i++) { + combine(now + menuArray[i], combineList, menuArray, i+1); + } + } + + public String[] solution(String[] orders, int[] course) { + Map history = new HashMap<>(); + + // orders 돌며, 조합 생성. + for(String order : orders) { + String[] menuArray = order.split(""); + List combineList = new ArrayList<>(); + combine("", combineList, menuArray, 0); + + for(String combine : combineList) { + char[] arr = combine.toCharArray(); + Arrays.sort(arr); + String key = new String(arr); + history.put(key, history.getOrDefault(key, 0) + 1); + } + } + + List resultList = new ArrayList<>(); + + for (int len : course) { + int max = 0; + + for (Map.Entry entry : history.entrySet()) { + if (entry.getKey().length() == len && entry.getValue() > 1) { + max = Math.max(max, entry.getValue()); + } + } + + for (Map.Entry entry : history.entrySet()) { + if (entry.getKey().length() == len && entry.getValue() == max) { + resultList.add(entry.getKey()); + } + } + } + + Collections.sort(resultList); + String[] result = new String[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = resultList.get(i); + } + + + return result; + } + } +} diff --git "a/week19/\352\260\225\354\204\261\354\232\261/programmers/\353\271\204\353\260\200\354\247\200\353\217\204.java" "b/week19/\352\260\225\354\204\261\354\232\261/programmers/\353\271\204\353\260\200\354\247\200\353\217\204.java" new file mode 100644 index 0000000..b0d8496 --- /dev/null +++ "b/week19/\352\260\225\354\204\261\354\232\261/programmers/\353\271\204\353\260\200\354\247\200\353\217\204.java" @@ -0,0 +1,41 @@ +package week19.강성욱.programmers; + +/** + * PackageName : week19.강성욱.programmers + * FileName : 비밀지도 + * Author : Baekgwa + * Date : 2025-09-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-09-05 Baekgwa Initial creation + */ +public class 비밀지도 { + class Solution { + public String[] solution(int n, int[] arr1, int[] arr2) { + int max = arr1.length; + String[] map = new String[max]; + + for(int idx=0; idx set = new HashSet<>(); + + for (int y=0; y= 0; y--) { + if (map[y][x] != ' ') { + char ch = map[y][x]; + map[y][x] = ' '; + map[write][x] = ch; + write--; + } + } + } + } + + return result; + } + + + private static class Point { + private int x; + private int y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Point point = (Point) o; + return x == point.x && y == point.y; + } + + @Override + public int hashCode() { + return Objects.hash(x, y); + } + } + } +} diff --git "a/week19/\352\271\200\353\202\230\354\235\200/programmers/\354\206\214\354\210\230_\353\247\214\353\223\244\352\270\260.java" "b/week19/\352\271\200\353\202\230\354\235\200/programmers/\354\206\214\354\210\230_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..4aba79a --- /dev/null +++ "b/week19/\352\271\200\353\202\230\354\235\200/programmers/\354\206\214\354\210\230_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,39 @@ +package week19.김나은.programmers; + +public class 소수_만들기 { + + class Solution { + + public int solution(int[] nums) { + + // 3개의 수 더한 값을 저장할 변수 + int answer = 0; + int sum = 0; + + // 주어진 숫자 중 3개의 수 고르기 + for (int i = 0; i < nums.length; i++) { + for (int j = i + 1; j < nums.length; j++) { + for (int k = j + 1; k < nums.length; k++) { + // 3개의 수 더해서 소수인지 판단 + sum = nums[i] + nums[j] + nums[k]; + if (isPrime(sum) == true) { + answer++; + } + } + } + } + return answer; + } + + // 소수인지 판단하는 메서드 + private boolean isPrime(int num) { + // 1은 모든 숫자가 약수로 가지고 있으므로 제외한다. + for (int i = 2; i < num; i++) { + if (num % i == 0) { + return false; + } + } + return true; + } + } +} \ No newline at end of file diff --git "a/week19/\352\271\200\353\202\230\354\235\200/programmers/\354\235\274\354\260\250_\353\271\204\353\260\200\354\247\200\353\217\204.java" "b/week19/\352\271\200\353\202\230\354\235\200/programmers/\354\235\274\354\260\250_\353\271\204\353\260\200\354\247\200\353\217\204.java" new file mode 100644 index 0000000..2697070 --- /dev/null +++ "b/week19/\352\271\200\353\202\230\354\235\200/programmers/\354\235\274\354\260\250_\353\271\204\353\260\200\354\247\200\353\217\204.java" @@ -0,0 +1,64 @@ +package week19.김나은.programmers; + +public class 일차_비밀지도 { + + class Solution { + + public String[] solution(int n, int[] arr1, int[] arr2) { + + // 2진수 변환 값 저장을 위한 배열 선언 + String[] newArr1 = new String[arr1.length]; + String[] newArr2 = new String[arr2.length]; + + // answer담을 배열 선언 + String[] answer = new String[n]; + + // arr1, arr2 각 배열 값 2진수로 변환 + for (int i = 0; i < arr1.length; i++) { + newArr1[i] = toBinary(arr1[i], n); + newArr2[i] = toBinary(arr2[i], n); + } + + // arr1, arr2 값 비교해서 해독 + for (int i = 0; i < n; i++) { + // 2진수를 해독한 문자 저장하기 위해 StringBuilder 선언 + StringBuilder sb = new StringBuilder(); + for (int j = 0; j < n; j++) { + char c1 = newArr1[i].charAt(j); + char c2 = newArr2[i].charAt(j); + + // 하나라도 '1'이면 '#', 아니면 공백 + if (c1 == '1' || c2 == '1') { + sb.append('#'); + } else { + sb.append(' '); + } + } + + // 완성된 한 줄을 answer에 저장 + answer[i] = sb.toString(); + } + return answer; + } + + // 2진수 변환 메서드 + private static String toBinary(int num, int n) { + + StringBuilder sb = new StringBuilder(); + + while (num > 0) { + int remainder = num % 2; // 나머지 구하기 + sb.append(remainder); // int형 자동으로 String형으로 저장 + num /= 2; // 몫으로 갱신 + } + + String st = sb.reverse().toString(); // 뒤집어서 반환 + + // 길이가 n보다 짧으면 앞에 '0'을 붙여서 n자리 맞추기 + while (st.length() < n) { + st = "0" + st; + } + return st; + } + } +} \ No newline at end of file diff --git "a/week19/\352\271\200\353\210\204\353\246\254/programmers/N\354\234\274\353\241\234_\355\221\234\355\230\204.java" "b/week19/\352\271\200\353\210\204\353\246\254/programmers/N\354\234\274\353\241\234_\355\221\234\355\230\204.java" new file mode 100644 index 0000000..2278a86 --- /dev/null +++ "b/week19/\352\271\200\353\210\204\353\246\254/programmers/N\354\234\274\353\241\234_\355\221\234\355\230\204.java" @@ -0,0 +1,67 @@ +package week19.김누리.programmers; + +import java.util.HashSet; +import java.util.Set; + +/** + * PackageName : week19.김누리.programmers + * FileName : N으로_표현 + * Author : 김누리(NRKim) + * Date : 2025-09-01 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 01. 김누리(NRKim) Initial creation + */ + +/* + +n의 값을 선택한 갯수 만큼 계속++ 해가며 식을 구현해야 한다... + +Set[] dp = new HashSet[9]; // NN N+N N*N N-N N/N으로 구성할 수 있는 중복 값을 배제하기 위함 + +// +for(int i = 0 ; i < 9; i++) { + dp 초기화 +} + +for(int i = 1; i <= 9; i++) { + 계산 로직 +} + +*/ + +public class N으로_표현 { + public int solution(int N, int number) { + // 1 <= N <= 9 + Set[] dp = new HashSet[9]; + + for(int i = 0; i < 9; i++) dp[i] = new HashSet<>(); + + for(int i = 1; i < 9; i++) { + String str = ""; + for(int j = 0; j < i; j++) { + str += N; // 숫자 이어붙이기 + } + + dp[i].add(Integer.parseInt(str)); + + // 사칙 연산 + for(int j = 1; j < i; j++) { + for(int op1 : dp[j]) { + for(int op2 : dp[i-j]) { + dp[i].add(op1 + op2); + dp[i].add(op1 - op2); + dp[i].add(op1 * op2); + if(op2 != 0 ) dp[i].add(op1 / op2); + } + } + } + + if(dp[i].contains(number)) return i; + } + + return -1; + } +} diff --git "a/week19/\352\271\200\353\210\204\353\246\254/programmers/\352\261\260\353\246\254\353\221\220\352\270\260_\355\231\225\354\235\270\355\225\230\352\270\260.java" "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\352\261\260\353\246\254\353\221\220\352\270\260_\355\231\225\354\235\270\355\225\230\352\270\260.java" new file mode 100644 index 0000000..64b5216 --- /dev/null +++ "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\352\261\260\353\246\254\353\221\220\352\270\260_\355\231\225\354\235\270\355\225\230\352\270\260.java" @@ -0,0 +1,115 @@ +package week19.김누리.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week19.김누리.programmers + * FileName : 거리두기_확인하기 + * Author : 김누리(NRKim) + * Date : 2025-09-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 03. 김누리(NRKim) Initial creation + */ + +/* + +※ 맨헤튼 거리 +Math.abs(places[i][j] - places[i][j+1]) + Math.abs(places[i][j] - places[i+1][j]) 이게 > 3 인경우를 찾아야 한다... + +P = 응시자 / O = 빈자리 / X = 파티션 + +case 1 : +[ + ["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], + ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], + ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], + ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], + ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"] +] + +이거는 bfs일거 같다. + +place[0][0] = P를 기준으로 보면? +place[1][0] != P 여야 하고 +place[0][1] != P 여야 하니까... 그러면 + +[ + "POOOP", + "OXXOX", + "OPXPX", + "OOXOX", + "POXXP" +] +P[0][0] > P[0][1] > P[0][2] > P[0][3] > P[0][4] --> POOP +P[0][0] > P[1][0] > P[2][0] > P[3][0] > P[4][0] --> POOP + +P[i][j] == 'P' ? P[i][j+1] != 'P' && P[i+1][j] != 'P' && P[i+1][j+1] != 'P' 임을 체크해 가며 +거리계산 > 3 인경우를 찾아야 한다... + +*/ + +public class 거리두기_확인하기 { + boolean[][] visited; + int n = 5, m = 5; + int[][] dir = {{1,0},{-1,0},{0,1},{0,-1}}; + + public int[] solution(String[][] places) { + int[] answer = new int[n]; + + // places[i][j]를 2차원 배열화 + // 시험장은 5*5로 사이즈 고정됨 + char[][] place = new char[n][m]; + int idx = 0; + + for(String[] p : places) { + for(int i = 0; i < p.length; i++) place[i] = p[i].toCharArray(); + answer[idx++] = isOk(place) ? 1:0; + } + + return answer; + } + + public boolean isOk(char[][]place) { + for(int i = 0; i < n; i++) { + for(int j = 0; j < m; j++) { + if(place[i][j] == 'P') { + if(!bfs(place,i,j)) return false; // 거리두기 위반 + } + } + } + + return true; + } + + public boolean bfs(char[][]place, int x, int y) { + visited = new boolean[n][m]; + Queue q = new LinkedList<>(); + q.offer(new int[]{x,y,0}); + visited[x][y] = true; + + while(!q.isEmpty()) { + int[] now = q.poll(); + int nx = now[0], ny = now[1], cnt = now[2]; + + for(int[] d : dir) { + int dx = nx + d[0], dy = ny + d[1], nc = cnt+1; + + // x,y 범위가 5를 넘으면 스킵 + if(dx < 0 || dx >= n || dy < 0 || dy >= m) continue; + if(visited[dx][dy] || nc > 2) continue; // 방문했어도 스킵 + if(place[dx][dy] == 'X') continue; // 파티션은 통과 불가 + + if(place[dx][dy] == 'P') return false; // 사람이면 종료 + + visited[dx][dy] = true; + q.offer(new int[]{dx,dy,nc}); + } + } + + return true; + } +} diff --git "a/week19/\352\271\200\353\210\204\353\246\254/programmers/\353\224\224\355\216\234\354\212\244_\352\262\214\354\236\204.java" "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\353\224\224\355\216\234\354\212\244_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..c80f859 --- /dev/null +++ "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\353\224\224\355\216\234\354\212\244_\352\262\214\354\236\204.java" @@ -0,0 +1,43 @@ +package week19.김누리.programmers; + +import java.util.Collections; +import java.util.PriorityQueue; +import java.util.Queue; + +/** + * PackageName : week19.김누리.programmers + * FileName : 디펜스_게임 + * Author : 김누리(NRKim) + * Date : 2025-08-31 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 31. 김누리(NRKim) Initial creation + */ + +public class 디펜스_게임 { + public int solution(int n, int k, int[] enemy) { + // 적 병력 수 별로 desc + Queue q = new PriorityQueue<>(Collections.reverseOrder()); + int sum = 0; + + for(int i = 0; i < enemy.length; i++) { + sum += enemy[i]; + q.offer(enemy[i]); + + // 원소값 총합이 내 병력보다 많을 경우 + if(sum > n) { + if(k > 0) { + sum -= q.poll(); + k--; + } else { + return i; + } + } + } + + + return enemy.length; + } +} diff --git "a/week19/\352\271\200\353\210\204\353\246\254/programmers/\353\251\224\353\211\264_\353\246\254\353\211\264\354\226\274.java" "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\353\251\224\353\211\264_\353\246\254\353\211\264\354\226\274.java" new file mode 100644 index 0000000..73202ab --- /dev/null +++ "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\353\251\224\353\211\264_\353\246\254\353\211\264\354\226\274.java" @@ -0,0 +1,99 @@ +package week19.김누리.programmers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week19.김누리.programmers + * FileName : 메뉴_리뉴얼 + * Author : 김누리(NRKim) + * Date : 2025-08-31 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 31. 김누리(NRKim) Initial creation + */ + +/* +String[] order ==> 단품 메뉴들 +String[] course ==> 단품메뉴들의 갯수 + +음식의 구성은 2가지, 최소 2인 이상 주문한 조합으로만 코스메뉴화 + +orders[i]의 값들을 쪼개서 course[i] 값 만큼 nCm 처리 +Mapmap = new HashMap<>(); + +그리고 key 별로 카운팅 + + +*/ + +public class 메뉴_리뉴얼 { + public String[] solution(String[] orders, int[] course) { + List rs = new ArrayList<>(); + + // orders 순회 + for(int i = 0; i < orders.length; i++) { + // 주문 내용 split + char[] tmp = orders[i].toCharArray(); + + // 주문 내용 정렬 + Arrays.sort(tmp); + + orders[i] = new String(tmp); + } + + for(int c : course) { + Map map = new HashMap<>(); + + for(String o : orders) { + // 주문 내용이 코스에 포함되는 제품 보다 적으면 스킵 + if(o.length() < c) continue; + + // nCm + comb(o,c,0,new StringBuilder(), map); + } + + int cnt = 0; + for(int v : map.values()) cnt = Math.max(cnt,v); + if (cnt < 2) continue; // 2명 이상의 손님이 택한게 아님 + + // Map.Entry : k-v 형태로 이루어진 Map 자료구조에서 + // k-v의 한 셋트를 그 자체로 객체화 하는 용도. + for(Map.Entry e : map.entrySet()) { + + if(e.getValue() == cnt) rs.add(e.getKey()); + } + } + + // 요건 : 정답 제출 시 오름차순 할 것 + Collections.sort(rs); + + // List에 적재된 요소들의 맨 앞 글자 기준으로 정렬 + return rs.toArray(new String[0]); + } + + public void comb(String o, int n, int m, StringBuilder sb,Mapmap) { + // 조합 문자수가 n과 동일하면, map에 격납 + if(sb.length() == n) { + String key = sb.toString(); + map.put(key, map.getOrDefault(key,0)+1); + return; + } + + // 조합 가지수가 문자열과 동일하면 skip + if (m == o.length()) return; + + sb.append(o.charAt(m)); + comb(o,n,m+1,sb,map); + sb.deleteCharAt(sb.length()-1); // 맨 뒤에거 제거 + + // 미선택 + comb(o,n,m+1,sb,map); + } +} diff --git "a/week19/\352\271\200\353\210\204\353\246\254/programmers/\353\271\204\353\260\200\354\247\200\353\217\204.java" "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\353\271\204\353\260\200\354\247\200\353\217\204.java" new file mode 100644 index 0000000..938530b --- /dev/null +++ "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\353\271\204\353\260\200\354\247\200\353\217\204.java" @@ -0,0 +1,57 @@ +package week19.김누리.programmers; + +/** + * PackageName : week19.김누리.programmers + * FileName : 비밀지도 + * Author : 김누리(NRKim) + * Date : 2025-09-01 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 01. 김누리(NRKim) Initial creation + */ + +public class 비밀지도 { + public String[] solution(int n, int[] arr1, int[] arr2) { + String[] answer = new String[n]; + String[] sArr1 = new String[n], sArr2 = new String[n]; + + // 맵 이진화 + for(int i = 0; i < n; i++) { + sArr1[i] = String.format("%" + n + "s", Integer.toBinaryString(arr1[i])).replace(" ", "0"); + sArr2[i] = String.format("%" + n + "s", Integer.toBinaryString(arr2[i])).replace(" ", "0"); + } + + // 맵 겹치기 + for(int i = 0; i < sArr1.length; i++) { + StringBuilder sb = new StringBuilder(); + + String a = sArr1[i]; + String b = sArr2[i]; + + for(int j = 0; j < a.length(); j++) { + if((a.charAt(j) == '1' && b.charAt(j) == '1') || (a.charAt(j) == '1' && b.charAt(j) == '0') || (a.charAt(j) == '0' && b.charAt(j) == '1')) sb.append("#"); + else sb.append(" "); + } + + answer[i] = sb.toString(); + } + + return answer; + } + + /* + + // Stream API 이용한 풀이 + public String[] solution(int n, int[] arr1, int[] arr2) { + return IntStream.range(0,n) + .mapToObj(i -> (String.format("%"+n+"s", + Integer.toBinaryString(arr1[i] | arr2[i]) + .replace('1','#') + .replace('0',' ') + ))) + .toArray(String[]::new); + } + */ +} diff --git "a/week19/\352\271\200\353\210\204\353\246\254/programmers/\354\206\214\354\210\230_\353\247\214\353\223\244\352\270\260.java" "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\354\206\214\354\210\230_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..31236e6 --- /dev/null +++ "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\354\206\214\354\210\230_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,55 @@ +package week19.김누리.programmers; + +/** + * PackageName : week19.김누리.programmers + * FileName : 소수_만들기 + * Author : 김누리(NRKim) + * Date : 2025-09-01 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 01. 김누리(NRKim) Initial creation + */ + +/* + +간단하게 생각할것 +3중 for문 돌려서 (배열의 크기도 50, 1~1000 이하의 값이므로 최대 반복수는 5만건이라 가능) +더한 값을 소수판단 + +*/ + +public class 소수_만들기 { + public int solution(int[] nums) { + int answer = 0; + + for(int i = 0; i < nums.length-2; i++) { + int sum = 0; + + for(int j = i+1 ; j < nums.length-1; j++) { + for(int k = j+1; k < nums.length; k++) { + sum = nums[i] + nums[j] + nums[k]; + + if(isPrime(sum)) answer++; + } + } + + + } + + return answer; + } + + public boolean isPrime(int val) { + // 소수 : 2 3 5 7 11 같이 1과 자기 자신으로만 나눠짐. + // 고로 2보다 작으면 소수 판정 불가 + if(val < 2) return false; + + for(int i = 2; i <= Math.sqrt(val); i++) { + if(val % i == 0) return false; + } + + return true; + } +} diff --git "a/week19/\352\271\200\353\210\204\353\246\254/programmers/\355\224\204\353\240\214\354\246\2104\353\270\224\353\241\235.java" "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\355\224\204\353\240\214\354\246\2104\353\270\224\353\241\235.java" new file mode 100644 index 0000000..f971d82 --- /dev/null +++ "b/week19/\352\271\200\353\210\204\353\246\254/programmers/\355\224\204\353\240\214\354\246\2104\353\270\224\353\241\235.java" @@ -0,0 +1,105 @@ +package week19.김누리.programmers; + +/** + * PackageName : week19.김누리.programmers + * FileName : 프렌즈4블록 + * Author : 김누리(NRKim) + * Date : 2025-09-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 03. 김누리(NRKim) Initial creation + */ + +/* + "CCBDE", + "AAADE", + "AAABF", + "CCBBF" + + "CCBDE", + " DE", + " BF", + "CCBBF" + +answer = 6 + + " DE", + " DE", + " F", + " F" + +answer = 14; + + " E", + " E", + " DF", + " DF" + + +단순 반복문 돌리면서 터뜨릴수 있는지 보고 + +터뜨릴 수 있으면? 터뜨린 다음 위치 이동. + +*/ + +public class 프렌즈4블록 { + public int solution(int m, int n, String[] board) { + int answer = 0; + // board 2차원 배열화 + char[][] b = new char[m][n]; + + for(int i = 0; i < board.length; i++) b[i] = board[i].toCharArray(); + + int del = 0; // 삭제 대상 변서 + + while(true) { + // 퍼지 위치 + boolean[][] purge = new boolean[m][n]; + int purged = 0; + + // 위에서 아래로 떨어질거니... m,n 그대로 이용하면 NG + for(int i = 0; i < m-1; i++) { + for(int j = 0; j < n-1; j++) { + char c = b[i][j]; + if(c == ' ') continue; // 해당 위치가 공백이면 스킵 + if(c == b[i][j + 1] && c == b[i + 1][j] && c == b[i + 1][j + 1]) { + // c의 아래, 우측, 대각선이 다 일치하면 퍼지 가능 + purge[i][j] = purge[i][j+1] = purge[i+1][j] = purge[i+1][j+1] = true; + + } + } + } + + for(int i = 0; i < m; i++) { + for(int j = 0; j < n; j++) { + if(purge[i][j]) purged++; + } + } + + // 더이상 터뜨릴거 없음 + if (purged == 0) break; + + del += purged; + + // 터뜨린 후 중력 적용 + for(int i = 0; i < n; i++) { + int move = m-1; // 아래에서부터 채워질 위치 + + for(int j = m-1; j >= 0; j--) { + if(!purge[j][i] && b[j][i] != ' ') { + b[move--][i] = b[j][i]; + } + } + + // 이동한 만큼 빈칸으로 + while(move >= 0) b[move--][i] = ' '; + } + } + + answer = del; + + return answer; + } +} diff --git "a/week19/\354\235\264\354\203\201\354\226\265/progarmmers/N\354\234\274\353\241\234_\355\221\234\355\230\204.java" "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/N\354\234\274\353\241\234_\355\221\234\355\230\204.java" new file mode 100644 index 0000000..87d5e70 --- /dev/null +++ "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/N\354\234\274\353\241\234_\355\221\234\355\230\204.java" @@ -0,0 +1,47 @@ +/** + * PackageName : week19.이상억.progarmmers; + * FileName : N으로_표현 + * Author : sangeok + * Date : 2025. 09. 04 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 04. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int solution(int N, int number) { + + List> dp = new ArrayList<>(); + + for (int i = 0; i <= 8; i++) { + dp.add(new HashSet<>()); + } + + for (int i = 1; i <= 8; i++) { + + int repeatedN = Integer.parseInt(String.valueOf(N).repeat(i)); + dp.get(i).add(repeatedN); + + for (int j = 1; j < i; j++) { + for (int a : dp.get(j)) { + for (int b : dp.get(i - j)) { + dp.get(i).add(a + b); + dp.get(i).add(a - b); + dp.get(i).add(a * b); + if (b != 0) dp.get(i).add(a / b); + } + } + } + + if (dp.get(i).contains(number)) { + return i; + } + } + + return -1; + } +} diff --git "a/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\352\261\260\353\246\254\353\221\220\352\270\260_\355\231\225\354\235\270\355\225\230\352\270\260.java" "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\352\261\260\353\246\254\353\221\220\352\270\260_\355\231\225\354\235\270\355\225\230\352\270\260.java" new file mode 100644 index 0000000..74e2618 --- /dev/null +++ "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\352\261\260\353\246\254\353\221\220\352\270\260_\355\231\225\354\235\270\355\225\230\352\270\260.java" @@ -0,0 +1,83 @@ +/** + * PackageName : week19.이상억.progarmmers; + * FileName : 거리두기_확인하기 + * Author : sangeok + * Date : 2025. 09. 02. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 02. sangeok Initial creation + */ + +// 맨해튼 거리 : |x_2-x_1| + |y_2-y_1| <= 2 파티션으로 막혀있을 때는 허용 +// 5 X 5 크기 +// P : 응시자가 앉아 있는자리 +// O : 빈 자리 +// X : 파티션 + +import java.util.*; + +class Solution { + + int[] dx = {-1,1,0,0}; + int[] dy = {0,0,-1,1}; + + public int[] solution(String[][] places) { + int[] answer = new int[places.length]; + + for(int i = 0 ; i < places.length; i++){ + if(is_check(places[i])){ + answer[i] = 1; + } else { + answer[i] = 0; + } + } + return answer; + } + + + public boolean is_check(String[] place){ + for(int i = 0; i < 5; i ++){ + for(int j = 0; j < 5; j ++){ + if(place[i].charAt(j) == 'P'){ + if(!bfs(place,i,j)) return false; + } + } + } + return true; + } + + public boolean bfs(String[] place, int x, int y){ + boolean[][] visited = new boolean[5][5]; + Queue queue = new LinkedList<>(); + queue.add(new int[]{x, y, 0}); + visited[x][y] = true; + + while(!queue.isEmpty()){ + int[] cur = queue.poll(); + int cx = cur[0]; + int cy = cur[1]; + int dist = cur[2]; + + if(dist > 0 && place[cx].charAt(cy) == 'P') return false; + + if(dist >= 2) continue; + + for(int i = 0; i < 4; i++){ + int nx = cx + dx[i]; + int ny = cy + dy[i]; + + if( nx < 0 || ny < 0 || nx >= 5 || ny >= 5) continue; + if(visited[nx][ny]) continue; + if(place[nx].charAt(ny) == 'X') continue; + + visited[nx][ny] = true; + queue.add(new int[]{nx,ny, dist + 1}); + } + + } + + return true; + } +} \ No newline at end of file diff --git "a/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\353\224\224\355\216\234\354\212\244_\352\262\214\354\236\204.java" "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\353\224\224\355\216\234\354\212\244_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..4d1ec7b --- /dev/null +++ "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\353\224\224\355\216\234\354\212\244_\352\262\214\354\236\204.java" @@ -0,0 +1,44 @@ +/** + * PackageName : week19.이상억.progarmmers; + * FileName : 디펜스_게임 + * Author : sangeok + * Date : 2025. 09. 01. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 01. sangeok Initial creation + */ + + +// 매 라운드 마다 enemy[i] 마리 적 등장 +// +// 4 2 4 5 3 3 1 +// 0 1 2 3 4 5 6 + + +import java.util.*; + +class Solution { + public int solution(int n, int k, int[] enemy) { + PriorityQueue pq = new PriorityQueue<>(Collections.reverseOrder()); + int count = 0; + + for (int i = 0; i < enemy.length; i++) { + int e = enemy[i]; + n -= e; + pq.add(e); // 우선 막은 병사 큐에 담기 + + if (n < 0) { + if (k > 0) { + n += pq.poll(); // 지금까지 중 가장 큰 적 수를 무적권으로 막음 + k--; + } else { + return i; + } + } + } + + return enemy.length; + } +} diff --git "a/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\353\251\224\353\211\264_\353\246\254\353\211\264\354\226\274.java" "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\353\251\224\353\211\264_\353\246\254\353\211\264\354\226\274.java" new file mode 100644 index 0000000..db96d89 --- /dev/null +++ "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\353\251\224\353\211\264_\353\246\254\353\211\264\354\226\274.java" @@ -0,0 +1,71 @@ +/** + * PackageName : week19.이상억.progarmmers; + * FileName : 소수_만들기 + * Author : sangeok + * Date : 2025. 09. 01. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 01. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + // 결과 담을 리스트 + + List answerList = new ArrayList<>(); + + // 각 course 크기별 최대 등장 횟수 저장 + Map maxCountMap = new HashMap<>(); + + public String[] solution(String[] orders, int[] course) { + // 각 주문 문자열을 정렬해서 통일 + for (int i = 0; i < orders.length; i++) { + char[] arr = orders[i].toCharArray(); + Arrays.sort(arr); + orders[i] = new String(arr); + } + + for (int size : course) { + Map countMap = new HashMap<>(); + + // 각 주문에서 조합 생성 + for (String order : orders) { + if (order.length() >= size) { + makeCombination(order, "", 0, size, countMap); + } + } + + // 이번 course 크기에서 최대 등장 횟수 확인 + int maxCount = 0; + for (int cnt : countMap.values()) { + maxCount = Math.max(maxCount, cnt); + } + + // 2번 이상 주문된 조합만 후보에 추가 + if (maxCount >= 2) { + for (String menu : countMap.keySet()) { + if (countMap.get(menu) == maxCount) { + answerList.add(menu); + } + } + } + } + + Collections.sort(answerList); + return answerList.toArray(new String[0]); + } + + public void makeCombination(String order, String comb, int idx, int targetSize, Map countMap) { + if (comb.length() == targetSize) { + countMap.put(comb, countMap.getOrDefault(comb, 0) + 1); + return; + } + + for (int i = idx; i < order.length(); i++) { + makeCombination(order, comb + order.charAt(i), i + 1, targetSize, countMap); + } + } +} diff --git "a/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\353\271\204\353\260\200\354\247\200\353\217\204.java" "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\353\271\204\353\260\200\354\247\200\353\217\204.java" new file mode 100644 index 0000000..c8758ae --- /dev/null +++ "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\353\271\204\353\260\200\354\247\200\353\217\204.java" @@ -0,0 +1,69 @@ +/** + * PackageName : week19.이상억.progarmmers; + * FileName : 비밀지도 + * Author : sangeok + * Date : 2025. 09. 03. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 03. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public String[] solution(int n, int[] arr1, int[] arr2) { + String[] answer = new String[n]; + + for (int i = 0; i < n; i++) { + String binary1 = number_binary(arr1[i], n); + String binary2 = number_binary(arr2[i], n); + + String map1 = binary_Map(binary1); + String map2 = binary_Map(binary2); + + answer[i] = merge(map1, map2); + } + return answer; + } + + public String number_binary(int num, int length) { + StringBuilder sb = new StringBuilder(); + if (num == 0) sb.append("0"); + + while (num > 0) { + sb.append(num % 2); + num /= 2; + } + sb.reverse(); + + while (sb.length() < length) { + sb.insert(0, "0"); + } + + return sb.toString(); + } + + public String merge(String s1, String s2) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < s1.length(); i++) { + if (s1.charAt(i) == '#' || s2.charAt(i) == '#') { + sb.append('#'); + } else { + sb.append(' '); + } + } + return sb.toString(); + } + + public String binary_Map(String binary) { + StringBuilder sb = new StringBuilder(); + for (char c : binary.toCharArray()) { + if (c == '1') sb.append('#'); + else sb.append(' '); + } + return sb.toString(); + } +} diff --git "a/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\354\206\214\354\210\230_\353\247\214\353\223\244\352\270\260.java" "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\354\206\214\354\210\230_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..8daadb2 --- /dev/null +++ "b/week19/\354\235\264\354\203\201\354\226\265/progarmmers/\354\206\214\354\210\230_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,44 @@ +/** + * PackageName : week19.이상억.progarmmers; + * FileName : 소수_만들기 + * Author : sangeok + * Date : 2025. 09. 01. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 01. sangeok Initial creation + */ + + + +class Solution { + public int solution(int[] nums) { + int answer = -1; + int len = nums.length; + int count = 0; + for(int i = 0; i < len - 2; i++){ + for(int j = i+1 ; j < len -1; j++){ + for(int k = j+1; k < len; k ++){ + int sum = nums[i] + nums[j] + nums[k]; + + if(is_valid(sum)) count ++; + } + } + } + + return count; + } + + public boolean is_valid(int sum){ + + int count = 0; + for(int i = 1; i toRemove = checkSameBlock(m, n, map); + + if (toRemove.isEmpty()) break; + + removedCount += removeBlock(toRemove, map); + + dropBlock(m, n, map); + } + + return removedCount; + } + + // 2x2 같은 블록 찾기 + private Set checkSameBlock(int m, int n, char[][] map) { + Set toRemove = new HashSet<>(); + + for (int i = 0; i < m - 1; i++) { + for (int j = 0; j < n - 1; j++) { + char c = map[i][j]; + if (c != '-' && + c == map[i][j+1] && + c == map[i+1][j] && + c == map[i+1][j+1]) { + toRemove.add(i + "," + j); + toRemove.add(i + "," + (j+1)); + toRemove.add((i+1) + "," + j); + toRemove.add((i+1) + "," + (j+1)); + } + } + } + return toRemove; + } + + // 블록 지우기 + private int removeBlock(Set toRemove, char[][] map) { + for (String pos : toRemove) { + String[] parts = pos.split(","); + int x = Integer.parseInt(parts[0]); + int y = Integer.parseInt(parts[1]); + map[x][y] = '-'; + } + return toRemove.size(); + } + + // 중력 처리 + private void dropBlock(int m, int n, char[][] map) { + for (int j = 0; j < n; j++) { + int emptyRow = m - 1; + for (int i = m - 1; i >= 0; i--) { + if (map[i][j] != '-') { + char temp = map[i][j]; + map[i][j] = '-'; + map[emptyRow][j] = temp; + emptyRow--; + } + } + } + } +} diff --git "a/week19_a/\352\271\200\353\210\204\353\246\254/baekjoon/\352\264\204\355\230\270\354\235\230_\352\260\222.java" "b/week19_a/\352\271\200\353\210\204\353\246\254/baekjoon/\352\264\204\355\230\270\354\235\230_\352\260\222.java" new file mode 100644 index 0000000..65942b3 --- /dev/null +++ "b/week19_a/\352\271\200\353\210\204\353\246\254/baekjoon/\352\264\204\355\230\270\354\235\230_\352\260\222.java" @@ -0,0 +1,97 @@ +package week19_a.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.ArrayDeque; +import java.util.Deque; + +/** + * PackageName : week19_a.김누리.baekjoon + * FileName : 괄호의_값 + * Author : 김누리(NRKim) + * Date : 2025-09-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 05. 김누리(NRKim) Initial creation + */ + +/* + +() == > 2 +[] ==> 3 + +()[] ==> 2+3 +([]) ==> 2*3 + +고로 + +(()[[]]) ==> (2+(3*3)) ==> 2*(2+(3*3)) ===> 2*(2+9) ====> 2*11 =====> 22 + + + +*/ + +public class 괄호의_값 { + public static void main(String[] args) throws Exception{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + String s = br.readLine(); + Deque dq = new ArrayDeque<>(); + int result = 0; + int temp = 1; + char prev = 0; + + for(char c : s.toCharArray()) { + if(c == '(') { + dq.push(c); + temp *= 2; + } else if (c == '[') { + dq.push(c); + temp *= 3; + } else if ( c == ')') { + if(dq.isEmpty() || dq.peek() != '(') { + bw.write("0"); // 잘못된 괄호면 0 출력 + bw.flush(); + bw.close(); + return; + } + if(prev == '(') { + result += temp; + } + dq.pop(); + temp /= 2; + } else if ( c == ']') { + if(dq.isEmpty() || dq.peek() != '[') { + bw.write("0"); // 잘못된 괄호면 0 출력 + bw.flush(); + bw.close(); + return; + } + if(prev == '[') { + result += temp; + } + dq.pop(); + temp /= 3; + } else { + return; + } + + prev = c; + } + + if(!dq.isEmpty()) { + bw.write("0"); + bw.flush(); + bw.close(); + } else { + bw.write(String.valueOf(result)); // 문자열로 변환 후 출력 + bw.flush(); + bw.close(); + } + + } +} diff --git "a/week19_a/\352\271\200\353\210\204\353\246\254/baekjoon/\355\217\211\353\262\224\355\225\234_\353\260\260\353\202\255.java" "b/week19_a/\352\271\200\353\210\204\353\246\254/baekjoon/\355\217\211\353\262\224\355\225\234_\353\260\260\353\202\255.java" new file mode 100644 index 0000000..8cfaf02 --- /dev/null +++ "b/week19_a/\352\271\200\353\210\204\353\246\254/baekjoon/\355\217\211\353\262\224\355\225\234_\353\260\260\353\202\255.java" @@ -0,0 +1,75 @@ +package week19_a.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.StringTokenizer; + +/** + * PackageName : week19_a.김누리.baekjoon + * FileName : 평범한_배낭 + * Author : 김누리(NRKim) + * Date : 2025-09-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 05. 김누리(NRKim) Initial creation + */ + +/* + +1번째 줄 : 물품 수_무게 >> 4_7 (물품 4개, 총 무게 7) +2~N번째 줄 : 물건의 무게_가치 >> 6_13 (N-1번의 물건의 무게: 6, 가치: 13) + +그러면 물건을 담을 수 있는 가치의 최대는? + +dp 써야 겠네... + +max = 1번째줄의 2번째(무게값) + +for(int i = 0; i < 무게; i++) { + dp[i] = 가치; + if(i > max) continue; + + sum += dp[무게] + +} + +*/ + +public class 평범한_배낭 { + public static void main(String[] args) throws Exception{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + StringTokenizer tk = new StringTokenizer(br.readLine()); // 첫번째 줄 + int n = Integer.parseInt(tk.nextToken()); // 물품 수 + int m = Integer.parseInt(tk.nextToken()); // 베낭이 버틸 수 있는 무게 + + int[] w = new int[n]; // 무게 계산용 배열 + int[] v = new int[n]; // 무게 별 가치 측정용 배열 + + // 물품수 만큼 배열 정렬하며 무게, 가치 배열 채우기 + for(int i = 0; i < n; i++) { + tk = new StringTokenizer(br.readLine()); + w[i] = Integer.parseInt(tk.nextToken()); + v[i] = Integer.parseInt(tk.nextToken()); + } + + int[] dp = new int[m+1]; // dp 배열은 가치 확인용으로 + + for(int i = 0; i < n; i++) { + int wgt = w[i], val = v[i]; + + // 역방향 순회 + for(int j = m; j >= wgt; j--) { + dp[j] = Math.max(dp[j], dp[j-wgt] + val); + } + } + + bw.write(dp[m] + "\n"); + bw.flush(); + bw.close(); + } +} 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/week2/\352\260\225\354\204\261\354\232\261/baekjoon/\354\230\201\355\231\224\352\260\220\353\217\205_\354\210\214.java" "b/week2/\352\260\225\354\204\261\354\232\261/baekjoon/\354\230\201\355\231\224\352\260\220\353\217\205_\354\210\214.java" new file mode 100644 index 0000000..547272d --- /dev/null +++ "b/week2/\352\260\225\354\204\261\354\232\261/baekjoon/\354\230\201\355\231\224\352\260\220\353\217\205_\354\210\214.java" @@ -0,0 +1,24 @@ +package week2.강성욱.baekjoon; + +import java.util.Scanner; + +public class 영화감독_숌 { + + private static final String CODE = String.valueOf(666); + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + int cnt = sc.nextInt(); + int result = 665; + + for (int i = 1; i <= cnt; i++) { + result++; + while (!Integer.toString(result).contains(CODE)) { + result++; + } + } + + System.out.println(result); + } +} \ No newline at end of file diff --git "a/week2/\352\260\225\354\204\261\354\232\261/baekjoon/\355\201\2202.java" "b/week2/\352\260\225\354\204\261\354\232\261/baekjoon/\355\201\2202.java" new file mode 100644 index 0000000..88855aa --- /dev/null +++ "b/week2/\352\260\225\354\204\261\354\232\261/baekjoon/\355\201\2202.java" @@ -0,0 +1,48 @@ +// Scanner 로 했다가 시간초과 떠서 bufferdReader 로 변경 + +import java.util.LinkedList; +import java.io.*; + +public class 큐2 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + LinkedList q = new LinkedList<>(); + int cnt = Integer.parseInt(br.readLine()); + + for (int i = 0; i < cnt; i++) { + String order = br.readLine(); + + Integer pushValue = 0; + //order 에서, push 가 있는 경우에는, 값을 빼놔야됨. + if(order.contains("push")) { + String[] orderSpec = order.split(" "); + order = orderSpec[0]; + pushValue = Integer.valueOf(orderSpec[1]); + } + + switch (order) { + case "push": + q.offer(pushValue); + break; + case "pop": + sb.append(q.isEmpty() ? -1 : q.poll()).append("\n"); + break; + case "size": + sb.append(q.size()).append("\n"); + break; + case "empty": + sb.append(q.isEmpty() ? 1 : 0).append("\n"); + break; + case "front": + sb.append(q.isEmpty() ? -1 : q.peekFirst()).append("\n"); + break; + case "back": + sb.append(q.isEmpty() ? -1 : q.peekLast()).append("\n"); + break; + } + } + + System.out.print(sb.toString()); + } +} diff --git "a/week2/\352\260\225\354\204\261\354\232\261/programmers/\352\260\231\354\235\200_\354\210\253\354\236\220\353\212\224_\354\213\253\354\226\264.java" "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\352\260\231\354\235\200_\354\210\253\354\236\220\353\212\224_\354\213\253\354\226\264.java" new file mode 100644 index 0000000..4ff684a --- /dev/null +++ "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\352\260\231\354\235\200_\354\210\253\354\236\220\353\212\224_\354\213\253\354\226\264.java" @@ -0,0 +1,22 @@ +package week2.강성욱.programmers; + +import java.util.*; + +public class 같은_숫자는_싫어 { + public class Solution { + public int[] solution(int []arr) { + Deque dq = new ArrayDeque<>(); + + for(int ar : arr) { + + if(!dq.isEmpty()) { + Integer temp = dq.peekLast(); + if(temp.equals(ar)) continue; + } + dq.addLast(ar); + } + + return dq.stream().mapToInt(i -> i.intValue()).toArray(); + } + } +} diff --git "a/week2/\352\260\225\354\204\261\354\232\261/programmers/\352\270\260\353\212\245\352\260\234\353\260\234.java" "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\352\270\260\353\212\245\352\260\234\353\260\234.java" new file mode 100644 index 0000000..573214d --- /dev/null +++ "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\352\270\260\353\212\245\352\260\234\353\260\234.java" @@ -0,0 +1,43 @@ +package week2.강성욱.programmers; + +import java.util.*; + +public class 기능개발 { + // 결국, 제일 맨앞에 작업 기준으로, 뒤에꺼가 더 큰거가 나올떄까지 전부 한번에 처리가 가능. + // 그럼 작업이 끝나는걸 배열로 만들어두면 될듯? + // 이거 나누기로 계산할때 올림처리 반드시 해야됨. + // 95펀데, 3퍼씩 작업 가능하면, 2일임. 나누기하면 1.666 나올껀데, 2일 걸리는거임. + // 그러고, 반복문으로 start-end 로부터 새로운 배열을 copy 떠서, copy 할게 없을때까지 반복하면 될듯? + + class Solution { + public int[] solution(int[] progresses, int[] speeds) { + List result = new ArrayList<>(); + + // 완료 일자 계산. + int[] days = new int[progresses.length]; + for (int i = 0; i < progresses.length; i++) { + int remain = 100 - progresses[i]; + int day = (int) Math.ceil((double) remain / speeds[i]); + days[i] = day; + } + + // 앞에서 부터 배포 진행. + int current = days[0]; + int count = 1; + + // 어짜피 0 배열은 무조건이니, 1부터 시작 + for (int i = 1; i < days.length; i++) { + if (days[i] <= current) { + count++; + } else { + result.add(count); + current = days[i]; + count = 1; + } + } + result.add(count); + + return result.stream().mapToInt(i -> i).toArray(); + } + } +} diff --git "a/week2/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\240\234_2016\353\205\204.java" "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\240\234_2016\353\205\204.java" new file mode 100644 index 0000000..762ee76 --- /dev/null +++ "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\353\254\270\354\240\234_2016\353\205\204.java" @@ -0,0 +1,16 @@ +package week2.강성욱.programmers; + +import java.time.LocalDate; + +public class 문제_2016년 { + class Solution { + public String solution(int a, int b) { + //enum 은 1부터 시작. + // date.getDayOfWeek().getValue() 로 꺼내온 값은 Monday 부터 1로 시작. + // https://docs.oracle.com/javase/8/docs/api/ + String[] days = {"", "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; + LocalDate date = LocalDate.of(2016, a, b); + return days[date.getDayOfWeek().getValue()]; + } + } +} diff --git "a/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\230\254\353\260\224\353\245\270_\352\264\204\355\230\270.java" "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\230\254\353\260\224\353\245\270_\352\264\204\355\230\270.java" new file mode 100644 index 0000000..b42afa5 --- /dev/null +++ "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\230\254\353\260\224\353\245\270_\352\264\204\355\230\270.java" @@ -0,0 +1,22 @@ +package week2.강성욱.programmers; + +import java.util.*; + +public class 올바른_괄호 { + class Solution { + boolean solution(String s) { + Deque dq = new ArrayDeque<>(); + + for(char c : s.toCharArray()) { + if (c == '(') { + dq.push(c); + } else { + if (dq.isEmpty()) return false; + dq.pop(); + } + } + + return dq.isEmpty() ? true : false; + } + } +} diff --git "a/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\231\204\354\243\274\355\225\230\354\247\200_\353\252\273\355\225\234_\354\204\240\354\210\230.java" "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\231\204\354\243\274\355\225\230\354\247\200_\353\252\273\355\225\234_\354\204\240\354\210\230.java" new file mode 100644 index 0000000..fa1ce69 --- /dev/null +++ "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\231\204\354\243\274\355\225\230\354\247\200_\353\252\273\355\225\234_\354\204\240\354\210\230.java" @@ -0,0 +1,39 @@ +package week2.강성욱.programmers; + +import java.util.*; + +public class 완주하지_못한_선수 { + // List 에 담아두고, remove 로 처리 하면 될듯? + // 근데, 100_000 까지니깐, 시간 복잡도가 맨끝에 있는거부터 처리한다고 치면.. + // o(100_000) + o(99_999) + .... o(1) 이렇게 걸릴 수도 있음. + // 결국 보수적으로 보면, o(n^2) 시간복잡도. + // 너무 큼. + // Set은 안되고. (중복 이름이 있으니), Hash 로 해결 + + class Solution { + public String solution(String[] participant, String[] completion) { + + Map map = new HashMap<>();//key : 이름, value : 몇명인지. 동명이인 있어서 이렇게.,, + // 참가자 Map 에 저장. 만약, 동명이인 있으면, value 가 증가함. + for(String name : participant) { + map.put(name, map.getOrDefault(name, 0) + 1); + } + + // 참가자 Map 에서, 완주자 삭제 + for(String name : completion) { + map.put(name, map.getOrDefault(name, 0) - 1); + } + + // map 에서 미완주자 찾기. + // 1 이상이면 참가는 했는데, 완주 못한거. + for (Map.Entry entry : map.entrySet()) { + if(entry.getValue() >= 1) { + return entry.getKey(); + } + } + + // 그럴일은 없지만, 모두 완주한 경우. 케이스 없음. + return ""; + } + } +} diff --git "a/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" new file mode 100644 index 0000000..3c89431 --- /dev/null +++ "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" @@ -0,0 +1,32 @@ +package week2.강성욱.programmers; + +public class 최소직사각형 { + //가장 기본적인 조건은, 가로길이, 세로 길이 중, 가장 큰걸 x, y 로 잡는것 +// 근데 이러면 눕히는 경우 계산이 안되니 패스 + +// 그럼 명함1번부터, 가로 <-> 세로를 뒤집고, +// 이중 가로 길이, 세로 길이 중 가장 큰걸 x, y 로 구해서 구하면? +// 최대 명함은 10_000 개가 들어올 수 있음 +// O(10_000) 마다, 가장 큰걸 구해야하니? 괜찮나? + +// 하나씩 집어넣는다고 가정하고 +// 가로로 넣을래? 세로로 넣을래 체크하고, 되면 넣고 안되면 늘리고? +// 그럼 긴걸 가로로, 짧은걸 세로로 변경하고 집어넣으면 되잖아. + + class Solution { + public int solution(int[][] sizes) { + int maxW = 0; + int maxH = 0; + + for (int[] size : sizes) { + int w = Math.max(size[0], size[1]); + int h = Math.min(size[0], size[1]); + + maxW = Math.max(maxW, w); + maxH = Math.max(maxH, h); + } + + return maxW * maxH; + } + } +} diff --git "a/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\354\206\237\352\260\222_\353\247\214\353\223\244\352\270\260.java" "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\354\206\237\352\260\222_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..b3c123a --- /dev/null +++ "b/week2/\352\260\225\354\204\261\354\232\261/programmers/\354\265\234\354\206\237\352\260\222_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,31 @@ +package week2.강성욱.programmers; + +import java.util.*; + +public class 최솟값_만들기 { + // 가장 작은 곱셈을 구하는건? + // 가장 작은거 x 가장 큰값? + + // [1, 4, 2], [5, 4, 4] + // 이거 정렬하면, [1, 2, 4], [4, 4, 5] + // 1*5, 2*4, 4*4 + // 5 + 8 + 16 + // 29 + + class Solution + { + public int solution(int []A, int []B) + { + //오름 차순 정리 + Arrays.sort(A); + Arrays.sort(B); + + int sum = 0; + for(int i=0; i buffer = new Stack<>(); + int count = 0; + + //재료 쌓기 + for(int now : ingredient) { + buffer.push(now); + + //4개가 가득 차면, 마지막 위에꺼 4개 확인 + int nowCount = buffer.size(); + if(nowCount >= 4) { + if( + buffer.get(nowCount-1) == 1 && //빵 + buffer.get(nowCount-2) == 3 && //고기 + buffer.get(nowCount-3) == 2 && //야채 + buffer.get(nowCount-4) == 1 //빵 + ) { + count++; + for(int i=0; i<4; i++) buffer.pop(); + } + } + } + //마지막에 한번더 쳌? 할필요없음. 구조상 + + return count; + } + } +} diff --git "a/week2/\352\271\200\353\202\230\354\235\200/baekjoon/\354\230\201\355\231\224\352\260\220\353\217\205 \354\210\214.java" "b/week2/\352\271\200\353\202\230\354\235\200/baekjoon/\354\230\201\355\231\224\352\260\220\353\217\205 \354\210\214.java" new file mode 100644 index 0000000..5e68555 --- /dev/null +++ "b/week2/\352\271\200\353\202\230\354\235\200/baekjoon/\354\230\201\355\231\224\352\260\220\353\217\205 \354\210\214.java" @@ -0,0 +1,30 @@ +package week2.김나은.bakejoon; + +import java.io.*; +import java.util.StringTokenizer; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + int N = Integer.parseInt(br.readLine()); + br.close(); + + int movieName = 666; + int count = 1; + + while(N > count){ + movieName++; + + if(String.valueOf(movieName).contains("666")){ + count++; + } + } + + bw.write(movieName+""); + bw.flush(); + bw.close(); + + } +} \ No newline at end of file diff --git "a/week2/\352\271\200\353\202\230\354\235\200/baekjoon/\355\201\220 2.java" "b/week2/\352\271\200\353\202\230\354\235\200/baekjoon/\355\201\220 2.java" new file mode 100644 index 0000000..370fb11 --- /dev/null +++ "b/week2/\352\271\200\353\202\230\354\235\200/baekjoon/\355\201\220 2.java" @@ -0,0 +1,78 @@ +package week2.김나은.bakejoon; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.IOException; +import java.util.StringTokenizer; +import java.util.Deque; +import java.util.LinkedList; + +public class Main { + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + Deque q = new LinkedList<>(); + + int N = Integer.parseInt(br.readLine()); + + StringTokenizer command; + + while(N-- > 0) { + command = new StringTokenizer(br.readLine(), " "); + + switch(command.nextToken()) { + + case "push": + q.offer(Integer.parseInt(command.nextToken())); + break; + + case "pop" : + Integer item = q.poll(); + if(item == null) { + sb.append(-1).append('\n'); + } + else { + sb.append(item).append('\n'); + } + break; + + case "size": + sb.append(q.size()).append('\n'); + break; + + case "empty": + if(q.isEmpty()) { + sb.append(1).append('\n'); + } + else { + sb.append(0).append('\n'); + } + break; + + case "front": + Integer ite = q.peek(); + if(ite == null) { + sb.append(-1).append('\n'); + } + else { + sb.append(ite).append('\n'); + } + break; + + case "back": + Integer it = q.peekLast(); + if(it == null) { + sb.append(-1).append('\n'); + } + else { + sb.append(it).append('\n'); + } + break; + } + } + System.out.println(sb); + } +} \ No newline at end of file diff --git "a/week2/\352\271\200\353\202\230\354\235\200/programmers/2016\353\205\204.java" "b/week2/\352\271\200\353\202\230\354\235\200/programmers/2016\353\205\204.java" new file mode 100644 index 0000000..eb26671 --- /dev/null +++ "b/week2/\352\271\200\353\202\230\354\235\200/programmers/2016\353\205\204.java" @@ -0,0 +1,19 @@ +package week2.김나은.programmers; + +class Solution { + public String solution(int a, int b) { + String[] day = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"}; + + int[] month = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 30}; + + int answer = 0; + + for (int i = 0; i < a - 1; i++) { + answer += month[i]; + } + + answer += b - 1; + + return day[answer % 7]; + } +} \ No newline at end of file diff --git "a/week2/\352\271\200\353\202\230\354\235\200/programmers/\352\260\231\354\235\200 \354\210\253\354\236\220\353\212\224 \354\213\253\354\226\264.java" "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\352\260\231\354\235\200 \354\210\253\354\236\220\353\212\224 \354\213\253\354\226\264.java" new file mode 100644 index 0000000..acf481c --- /dev/null +++ "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\352\260\231\354\235\200 \354\210\253\354\236\220\353\212\224 \354\213\253\354\226\264.java" @@ -0,0 +1,19 @@ +package week2.김나은.programmers; + +import java.util.*; + +public class Solution { + public int[] solution(int []arr) { + int[] answer = {}; + + Stack stack = new Stack<>(); + + for(int i : arr) { + if(stack.empty() || !stack.peek().equals(i)) { + stack.push(i); + } + } + + return stack.stream().mapToInt(i -> i).toArray(); + } +} \ No newline at end of file diff --git "a/week2/\352\271\200\353\202\230\354\235\200/programmers/\352\270\260\353\212\245\352\260\234\353\260\234.java" "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\352\270\260\353\212\245\352\260\234\353\260\234.java" new file mode 100644 index 0000000..b12fb18 --- /dev/null +++ "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\352\270\260\353\212\245\352\260\234\353\260\234.java" @@ -0,0 +1,29 @@ +package week2.김나은.programmers; + +import java.util.*; + +class Solution { + public ArrayList solution(int[] progresses, int[] speeds) { + + ArrayList answer = new ArrayList(); + Queue queue = new LinkedList(); + + for(int i = 0; i < progresses.length; i++) { + + queue.add((int)Math.ceil((100.0 - progresses[i]) / speeds[i])); + } + + while(!queue.isEmpty()) { + int minDays = queue.poll(); + int count = 1; + + while(!queue.isEmpty() && queue.peek() <= minDays){ + queue.poll(); + count++; + } + answer.add(count); + } + + return answer; + } +} \ No newline at end of file diff --git "a/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\230\254\353\260\224\353\245\270 \352\264\204\355\230\270.java" "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\230\254\353\260\224\353\245\270 \352\264\204\355\230\270.java" new file mode 100644 index 0000000..7bfb0f5 --- /dev/null +++ "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\230\254\353\260\224\353\245\270 \352\264\204\355\230\270.java" @@ -0,0 +1,25 @@ +package week2.김나은.programmers; + +import java.util.*; + +class Solution { + boolean solution(String s) { + boolean answer = true; + + Stack stack = new Stack<>(); + + for (char item : s.toCharArray()) { + if (item == '(') { + stack.push('('); + } else { + if (!stack.isEmpty()) { + stack.pop(); + } else { + return false; + } + } + } + + return stack.isEmpty() ? true : false; + } +} \ No newline at end of file diff --git "a/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\231\204\354\243\274\355\225\230\354\247\200 \353\252\273\355\225\234 \354\204\240\354\210\230.java" "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\231\204\354\243\274\355\225\230\354\247\200 \353\252\273\355\225\234 \354\204\240\354\210\230.java" new file mode 100644 index 0000000..c4dfa4e --- /dev/null +++ "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\231\204\354\243\274\355\225\230\354\247\200 \353\252\273\355\225\234 \354\204\240\354\210\230.java" @@ -0,0 +1,28 @@ +package week2.김나은.programmers; + +import java.util.*; + +class Solution { + public String solution(String[] participant, String[] completion) { + String answer = ""; + + HashMap map = new HashMap<>(); + + for(String player : participant) { + map.put(player, map.getOrDefault(player, 0) + 1); + } + + for(String player : completion) { + map.put(player, map.get(player) - 1); + } + + for(Map.Entry entry : map.entrySet()) { + if(entry.getValue() != 0) { + answer = entry.getKey(); + break; + } + } + + return answer; + } +} \ No newline at end of file diff --git "a/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" new file mode 100644 index 0000000..838fb38 --- /dev/null +++ "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" @@ -0,0 +1,13 @@ +package week2.김나은.programmers; + +class Solution { + public int solution(int[][] sizes) { + int length = 0, height = 0; + for (int[] card : sizes) { + length = Math.max(length, Math.max(card[0], card[1])); + height = Math.max(height, Math.min(card[0], card[1])); + } + int answer = length * height; + return answer; + } +} \ No newline at end of file diff --git "a/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\354\206\237\352\260\222 \353\247\214\353\223\244\352\270\260.java" "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\354\206\237\352\260\222 \353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..bd30f71 --- /dev/null +++ "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\354\265\234\354\206\237\352\260\222 \353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,18 @@ +package week2.김나은.programmers; + +import java.util.Arrays; + +class Solution { + public int solution(int []A, int []B) { + int answer = 0; + + Arrays.sort(A); + Arrays.sort(B); + + for(int i = 0; i < A.length; i++) { + answer+= A[i] * B[B.length - i - 1]; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week2/\352\271\200\353\202\230\354\235\200/programmers/\355\226\204\353\262\204\352\261\260 \353\247\214\353\223\244\352\270\260.java" "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\355\226\204\353\262\204\352\261\260 \353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..268e9b5 --- /dev/null +++ "b/week2/\352\271\200\353\202\230\354\235\200/programmers/\355\226\204\353\262\204\352\261\260 \353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,30 @@ +package week2.김나은.programmers; + +import java.util.*; + +class Solution { + public int solution(int[] ingredient) { + int answer = 0; + + Stack stack = new Stack<>(); + + for(int i : ingredient) { + stack.push(i); + + if(stack.size() >= 4) { + + if(stack.get(stack.size() - 4) == 1 && + stack.get(stack.size() - 3) == 2 && + stack.get(stack.size() - 2) == 3 && + stack.get(stack.size() - 1) == 1) { + + answer++; + stack.pop(); stack.pop(); stack.pop(); stack.pop(); + + } + } + } + + return answer; + } +} \ No newline at end of file diff --git "a/week2/\352\271\200\353\210\204\353\246\254/baekjoon/\354\230\201\355\231\224\352\260\220\353\217\205_\354\210\214.java" "b/week2/\352\271\200\353\210\204\353\246\254/baekjoon/\354\230\201\355\231\224\352\260\220\353\217\205_\354\210\214.java" new file mode 100644 index 0000000..de18000 --- /dev/null +++ "b/week2/\352\271\200\353\210\204\353\246\254/baekjoon/\354\230\201\355\231\224\352\260\220\353\217\205_\354\210\214.java" @@ -0,0 +1,40 @@ +package week2.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; + +/** + * PackageName : week2.김누리.baekjoon + * FileName : 영화감독_숌 + * Author : 김누리(NRKim) + * Date : 2025-05-06 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 06. 김누리(NRKim) Initial creation + */ + +public class 영화감독_숌 { + public static void solution() throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + StringBuilder sb = new StringBuilder(); + int n = Integer.parseInt(br.readLine()); // n번째 수 받아오기 위한 코드 + int num = 666; // 타겟 수 + int cnt = 0; + + // n번 동안 반복 + while(cnt < n) { + if(String.valueOf(num).contains("666")) cnt++; + num++; + } + + bw.write(String.valueOf(num-1)+"\n"); + br.close(); + bw.close(); + } +} + diff --git "a/week2/\352\271\200\353\210\204\353\246\254/baekjoon/\355\201\220_2.java" "b/week2/\352\271\200\353\210\204\353\246\254/baekjoon/\355\201\220_2.java" new file mode 100644 index 0000000..469df21 --- /dev/null +++ "b/week2/\352\271\200\353\210\204\353\246\254/baekjoon/\355\201\220_2.java" @@ -0,0 +1,77 @@ +package week2.김누리.baekjoon; + +import java.io.*; +import java.util.Deque; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +/** + * PackageName : week2.김누리.baekjoon + * FileName : 큐_2 + * Author : 김누리 + * Date : 2025-05-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 05. 김누리 Initial creation + * 2025. 05. 06. 김누리 1차 풀이 완료 + */ +public class 큐_2 { + public void solution() throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + StringBuilder sb = new StringBuilder(); + StringTokenizer st = null; + int n = Integer.parseInt(br.readLine()); + + // front, back 명령어 때문에 인덱스를 신경써야 해서 일반적인 Queue가 아닌 Deque 이용 + Deque que = new LinkedList<>(); + + // 읽어온 명령어 만큼 반복문 진행 + for(int i = 0; i < n; i++) { + String cmd = br.readLine(); + st = new StringTokenizer(cmd, " "); + + switch(st.nextToken()) { + case "push": + que.offer(Integer.parseInt(st.nextToken())); + break; + + case "pop": + if(que.isEmpty()) sb.append("-1\n"); + else sb.append(que.poll()+"\n"); + break; + + case "size": + sb.append(que.size()+"\n"); + break; + + case "empty": + if(que.isEmpty()) sb.append("1\n"); + else sb.append("0\n"); + break; + + case "front": + if(que.isEmpty()) sb.append("-1\n"); + else sb.append(que.peekFirst()+"\n"); + break; + + case "back": + if(que.isEmpty()) sb.append("-1\n"); + else sb.append(que.peekLast()+"\n"); + break; + + default: + break; + } + + } + + bw.write(sb.toString()); + bw.flush(); + br.close(); + bw.close(); + } +} diff --git "a/week2/\352\271\200\353\210\204\353\246\254/programmers/\352\260\231\354\235\200_\354\210\253\354\236\220\353\212\224_\354\213\253\354\226\264.java" "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\352\260\231\354\235\200_\354\210\253\354\236\220\353\212\224_\354\213\253\354\226\264.java" new file mode 100644 index 0000000..16261d1 --- /dev/null +++ "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\352\260\231\354\235\200_\354\210\253\354\236\220\353\212\224_\354\213\253\354\226\264.java" @@ -0,0 +1,33 @@ +package week2.김누리.programmers; + +import java.util.Stack; + +/** + * PackageName : week2.김누리.programmers + * FileName : 같은_숫자는_싫어 + * Author : 김누리 + * Date : 2025-05-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 05. 김누리 Initial creation + * 2025. 05. 05. 김누리 스택을 통한 초기 개발 완료 + */ +public class 같은_숫자는_싫어 { + public int[] solution(int []arr) { + Stack stk = new Stack<>(); + + for(int i : arr) { + if ( stk.isEmpty() || stk.peek() != i ) stk.push(i); + } + + int[] answer = new int[stk.size()]; + + for(int i = 0; i < stk.size(); i++) { + answer[i] = stk.get(i); + } + + return answer; + } +} diff --git "a/week2/\352\271\200\353\210\204\353\246\254/programmers/\352\270\260\353\212\245\352\260\234\353\260\234.java" "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\352\270\260\353\212\245\352\260\234\353\260\234.java" new file mode 100644 index 0000000..a338b48 --- /dev/null +++ "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\352\270\260\353\212\245\352\260\234\353\260\234.java" @@ -0,0 +1,65 @@ +package week2.김누리.programmers; + +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + * PackageName : week2.김누리.programmers + * FileName : 기능개발 + * Author : 김누리 + * Date : 2025-05-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 05. 김누리 Initial creation + * 2025. 05. 05. 김누리 챗GPT 도움 받아 1차적인 코딩을 진행하였기 때문에, + * 2025-05-07에 다시 풀어 볼 예정 + * 2025. 05. 07. 김누리 Queue를 통한 풀이 완료 + */ +public class 기능개발 { + public int[] solution(int[] progresses, int[] speeds) { + Queue progQue = new LinkedList<>(); // 작업 진도가 들어갈 큐 + Queue speedQue = new LinkedList<>(); // 작업 속도가 들어갈 큐 + List comp = new LinkedList<>(); // 작업 결과가 들어갈 큐 + + for (int progresse : progresses) progQue.offer(progresse); // 작업 진도 큐 구성 + for (int speed : speeds) speedQue.offer(speed); // 작업 속도 구성 + + // 작업 진도를 계속 진행 + while(!progQue.isEmpty()) { + int size = progQue.size(); + + for(int i = 0; i < size; i++) { + int spent = speedQue.poll(); + int current_prog = progQue.poll() + spent; + + progQue.offer(current_prog); + speedQue.offer(spent); + } + + int deploy = 0; // 배포 가능 갯수 + + while(!progQue.isEmpty() && progQue.peek() >= 100) { + progQue.poll(); + speedQue.poll(); + deploy++; + } + + // 배포 가능한 갯수 만큼 + if(deploy > 0) { + comp.add(deploy); + } + } + + int[] answer = new int[comp.size()]; + int idx = 0; + + for(int i : comp) { + answer[idx++] = i; + } + + return answer; + } +} diff --git "a/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\230\254\353\260\224\353\245\270_\352\264\204\355\230\270.java" "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\230\254\353\260\224\353\245\270_\352\264\204\355\230\270.java" new file mode 100644 index 0000000..64061db --- /dev/null +++ "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\230\254\353\260\224\353\245\270_\352\264\204\355\230\270.java" @@ -0,0 +1,42 @@ +package week2.김누리.programmers; + +import java.util.Stack; + +/** + * PackageName : week2.김누리.programmers + * FileName : 올바른_괄호 + * Author : 김누리 + * Date : 2025-05-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 05. 김누리 Initial creation + * 2025. 05. 05. 김누리 풀이 완료 + */ +public class 올바른_괄호 { + boolean solution(String s) { + boolean answer = true; + Stack stk = new Stack<>(); + + String[] arr = s.split(""); + + for(String s2 : arr) { + String tmp = s2; + + if(stk.isEmpty()) { + stk.push(tmp); + } else if(stk.peek().equals("(") && tmp.equals(")")) { + stk.pop(); + } else { + stk.push(tmp); + } + } + + if(!stk.isEmpty()) { + answer = false; + } + + return answer; + } +} diff --git "a/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\231\204\354\243\274\355\225\230\354\247\200_\353\252\273\355\225\234_\354\204\240\354\210\230.java" "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\231\204\354\243\274\355\225\230\354\247\200_\353\252\273\355\225\234_\354\204\240\354\210\230.java" new file mode 100644 index 0000000..f99af83 --- /dev/null +++ "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\231\204\354\243\274\355\225\230\354\247\200_\353\252\273\355\225\234_\354\204\240\354\210\230.java" @@ -0,0 +1,57 @@ +package week2.김누리.programmers; + +import java.util.*; + +/** + * PackageName : week2.김누리.programmers + * FileName : 완주하지_못한_선수 + * Author : 김누리 + * Date : 2025-05-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 03. 김누리 Initial creation + * 2025. 05. 03. 김누리 HashMap을 이용한 버전 풀이 + * 2025. 05. 03. 김누리 HashMap을 이용하지 않은 버전 풀이 + */ +public class 완주하지_못한_선수 { + // HashMap 이용 버전 +/* public String solution(String[] participant, String[] completion) { + String answer = ""; + Map map = new HashMap<>(); + + // map에 참여자 정보 ++ + for (String participants : participant) { + map.put(participants,map.getOrDefault(participants,0)+1); + } + + // map에서 완주자 정보 -- + for (String completions : completion) { + map.put(completions,map.getOrDefault(completions,0)-1); + } + + // map에 0이 아닌 값을 answer로 제출 + for (String participants : participant) { + if (map.get(participants) != 0) answer = participants; + } + + return answer; + }*/ + + public String solution(String[] participant, String[] completion) { + Arrays.sort(participant); // 참여자 배열 정렬. 예 : [eden, kiki, leo] // [ana, mislav, mislav, stanko] + Arrays.sort(completion); // 완주자 배열 정렬 예 : [eden, kiki] // [ana, mislav, stanko] + + // 참여자 배열과 완주자 배열의 인덱스 값 비교. + for(int i = 0; i < completion.length; i++) { + if(!participant[i].equals(completion[i])){ + return participant[i]; // 동명 이인의 경우 대상 유저 return + } + } + + return participant[participant.length-1]; // 동명이인이 없는 경우 참여자 배열의 맨 마지막 인덱스 값 return + } + + +} diff --git "a/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\262\234\354\213\255\354\234\241\353\205\204.java" "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\262\234\354\213\255\354\234\241\353\205\204.java" new file mode 100644 index 0000000..0ae224a --- /dev/null +++ "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\262\234\354\213\255\354\234\241\353\205\204.java" @@ -0,0 +1,28 @@ +package week2.김누리.programmers; + +import java.time.DayOfWeek; +import java.time.LocalDate; + +/** + * PackageName : week2.김누리.programmers + * FileName : 이천십육년 + * Author : 김누리 + * Date : 2025-05-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 05. 김누리 Initial creation + * 2025. 05. 05. 김누리 1차 풀이 완료 + */ +public class 이천십육년 { + public String solution(int a, int b) { + String answer = ""; + LocalDate date = LocalDate.of(2016,a,b); + DayOfWeek d = date.getDayOfWeek(); + + answer = (d.toString()).substring(0,3); + + return answer; + } +} diff --git "a/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" new file mode 100644 index 0000000..d05b00a --- /dev/null +++ "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" @@ -0,0 +1,30 @@ +package week2.김누리.programmers; + +/** + * PackageName : week2.김누리.programmers + * FileName : 최소직사각형 + * Author : 김누리 + * Date : 2025-05-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 05. 김누리 Initial creation + * 2025. 05. 05. 김누리 최초 풀이 완료 + */ +public class 최소직사각형 { + public int solution(int[][] sizes) { + int answer = 0; + int w = 0; + int h = 0; + + for(int[] size : sizes) { + w = Math.max(w,Math.max(size[0],size[1])); + h = Math.max(h,Math.min(size[0],size[1])); + } + + answer = w*h; + + return answer; + } +} diff --git "a/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\354\206\237\352\260\222_\353\247\214\353\223\244\352\270\260.java" "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\354\206\237\352\260\222_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..f4b9c24 --- /dev/null +++ "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\354\265\234\354\206\237\352\260\222_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,33 @@ +package week2.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week2.김누리.programmers + * FileName : 최솟값_만들기 + * Author : 김누리 + * Date : 2025-05-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 05. 김누리 Initial creation + * 2025. 05. 05. 김누리 초기 풀이 완료 + */ +public class 최솟값_만들기 { + public int solution(int []A, int []B) + { + int answer = 0; + int l = B.length-1; + + // A랑 B 를 asc + Arrays.sort(A); // 1 2 4 + Arrays.sort(B); // 4 4 5 + + for(int i = 0; i < A.length; i++) { + answer += A[i] * B[l--]; // A에서는 idx가 0부터 B에서는 맨 마지막 idx 부터 가져와서 곱샘 진행 + } + + return answer; + } +} diff --git "a/week2/\352\271\200\353\210\204\353\246\254/programmers/\355\226\204\353\262\204\352\261\260_\353\247\214\353\223\244\352\270\260.java" "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\355\226\204\353\262\204\352\261\260_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..00bae67 --- /dev/null +++ "b/week2/\352\271\200\353\210\204\353\246\254/programmers/\355\226\204\353\262\204\352\261\260_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,51 @@ +package week2.김누리.programmers; + +import java.util.Stack; + +/** + * PackageName : week2.김누리.programmers + * FileName : 햄버거_만들기 + * Author : 김누리 + * Date : 2025-05-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 05. 김누리 Initial creation + * 2025. 05. 05. 김누리 Stack 이용해서 문제 풀이 + */ +public class 햄버거_만들기 { + public int solution(int[] ingredient) { + int answer = 0; + Stack stk = new Stack<>(); + + for(int i : ingredient) { + stk.push(i); // 햄버거 재료 입력 + + // 쌓아올린 재료가 4개 이상일 때 판정 시작 (빵(아래) > 야채 > 고기 > 빵(위)) + if (stk.size() >= 4) { + int a = stk.get(stk.size()-4); // idx 0 + int b = stk.get(stk.size()-3); // idx 1 + int c = stk.get(stk.size()-2); // idx 2 + int d = stk.get(stk.size()-1); // idx 3 + + // (빵(아래) > 야채 > 고기 > 빵(위)) 순번대로 쌓였는지 확인 + if( + a == 1 && + b == 2 && + c == 3 && + d == 1 + ) { + // 사용한 재료들 예외 처리 + for (int j = 0; j < 4; j++) { + stk.pop(); + } + + answer++; + } + } + } + + return answer; + } +} diff --git "a/week2/\354\235\264\354\203\201\354\226\265/backjoon/\354\230\201\355\231\224\352\260\220\353\217\205_\354\210\214.java" "b/week2/\354\235\264\354\203\201\354\226\265/backjoon/\354\230\201\355\231\224\352\260\220\353\217\205_\354\210\214.java" new file mode 100644 index 0000000..a8d8ef8 --- /dev/null +++ "b/week2/\354\235\264\354\203\201\354\226\265/backjoon/\354\230\201\355\231\224\352\260\220\353\217\205_\354\210\214.java" @@ -0,0 +1,38 @@ +package week2.이상억.backjoon; + +/** + * PackageName : week2.이상억.backjoon + * FileName : 영화감독_숌 + * Author : sangeok + * Date : 2025. 5. 8. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 8. sangeok Initial creation + */ + +import java.io.*; +import java.util.*; +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + + int count = 0; + int number = 666; + + while(true){ + if (String.valueOf(number).contains("666")) { + count ++; + if (count == n) { + System.out.println(number); + break; + } + } + number++; + } + } +} diff --git "a/week2/\354\235\264\354\203\201\354\226\265/backjoon/\355\201\220_2.java" "b/week2/\354\235\264\354\203\201\354\226\265/backjoon/\355\201\220_2.java" new file mode 100644 index 0000000..5a59091 --- /dev/null +++ "b/week2/\354\235\264\354\203\201\354\226\265/backjoon/\355\201\220_2.java" @@ -0,0 +1,49 @@ +package week2.이상억.backjoon; + +/** + * PackageName : week2.이상억.backjoon + * FileName : 큐_2 + * Author : sangeok + * Date : 2025. 5. 7. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 7. sangeok Initial creation + */ + +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()); + + LinkedList queue = new LinkedList<>(); + int last = -1; + for (int i = 0; i < n; i++) { + String cmd = br.readLine(); + + if (cmd.startsWith("push")) { + int x = Integer.parseInt(cmd.split(" ")[1]); + queue.addLast(x); + last = x; + } else if (cmd.equals("pop")) { + sb.append(queue.isEmpty() ? -1 : queue.removeFirst()).append('\n'); + } else if (cmd.equals("size")) { + sb.append(queue.size()).append('\n'); + } else if (cmd.equals("empty")) { + sb.append(queue.isEmpty() ? 1 : 0).append('\n'); + } else if (cmd.equals("front")) { + sb.append(queue.isEmpty() ? -1 : queue.getFirst()).append('\n'); + } else if (cmd.equals("back")) { + sb.append(queue.isEmpty() ? -1 : last).append('\n'); + } + } + System.out.print(sb); + } +} diff --git "a/week2/\354\235\264\354\203\201\354\226\265/progarmmers/2016\353\205\204.java" "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/2016\353\205\204.java" new file mode 100644 index 0000000..d339e7b --- /dev/null +++ "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/2016\353\205\204.java" @@ -0,0 +1,30 @@ +package week2.이상억.progarmmers; + +/** + * PackageName : week2.이상억.programmers + * FileName : 2016년 + * Author : sangeok + * Date : 2025. 5. 8. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 8. sangeok Initial creation + */ + + +class Solution { + public String solution(int a, int b) { + String answer = ""; + + + String[] weekday = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"}; + int[] days = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + + int totaldays = -1; + for(int i = 0 ; i < a - 1 ; i ++) totaldays += days[i]; + + return weekday[((totaldays+b)%7)]; + + } +} \ No newline at end of file diff --git "a/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\231\354\235\200_\354\210\253\354\236\220\353\212\224_\354\213\253\354\226\264.java" "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\231\354\235\200_\354\210\253\354\236\220\353\212\224_\354\213\253\354\226\264.java" new file mode 100644 index 0000000..90a574d --- /dev/null +++ "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\231\354\235\200_\354\210\253\354\236\220\353\212\224_\354\213\253\354\226\264.java" @@ -0,0 +1,29 @@ +package week2.이상억.progarmmers; + +/** + * PackageName : week2.이상억.programmers + * FileName : 같은_숫자는_싫어 + * Author : sangeok + * Date : 2025. 5. 6. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 6. sangeok Initial creation + */ + +import java.util.*; + +public class Solution { + public ArrayList solution(int []arr) { + ArrayList answer = new ArrayList<>(); + + for(int i = 0; i solution(int[] progresses, int[] speeds) { + ArrayList answer = new ArrayList<>(); + int len = speeds.length; + int[] days = new int[len]; + + for(int i = 0; imaxday){ + answer.add(count); + count = 1; + maxday = days[i]; + } + else { + count ++; + } + } + + answer.add(count); + return answer; + } +} \ No newline at end of file diff --git "a/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\254\353\260\224\353\245\270_\352\264\204\355\230\270.java" "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\254\353\260\224\353\245\270_\352\264\204\355\230\270.java" new file mode 100644 index 0000000..24bff5c --- /dev/null +++ "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\254\353\260\224\353\245\270_\352\264\204\355\230\270.java" @@ -0,0 +1,25 @@ +package week2.이상억.progarmmers; + +/** + * PackageName : week2.이상억.programmers + * FileName : 올바른_괄호 + * Author : sangeok + * Date : 2025. 5. 6. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 6. sangeok Initial creation + */ + + +class Solution { + boolean solution(String s) { + int x = 0; + for (char a : s.toCharArray()) { + x += (a == '(') ? 1 : -1; + if (x < 0) return false; + } + return (x==0) ? true : false ; + } +} diff --git "a/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\231\204\354\243\274\355\225\230\354\247\200_\353\252\273\355\225\234_\354\204\240\354\210\230.java" "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\231\204\354\243\274\355\225\230\354\247\200_\353\252\273\355\225\234_\354\204\240\354\210\230.java" new file mode 100644 index 0000000..d58e1d0 --- /dev/null +++ "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\231\204\354\243\274\355\225\230\354\247\200_\353\252\273\355\225\234_\354\204\240\354\210\230.java" @@ -0,0 +1,35 @@ +package week2.이상억.progarmmers; + +/** + * PackageName : week2.이상억.programmers + * FileName : 완주하지_못한_선수 + * Author : sangeok + * Date : 2025. 5. 8. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 8. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public String solution(String[] participant, String[] completion) { + String answer = ""; + Map map = new HashMap<>(); + + for (String p : participant) { + map.put(p, map.getOrDefault(p, 0) + 1); + } + + for (String c : completion) { + map.put(c, map.get(c) - 1); + } + + for (String key : map.keySet()) { + if (map.get(key) != 0) return key; + } + return answer; + } +} diff --git "a/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" new file mode 100644 index 0000000..e2067c6 --- /dev/null +++ "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225.java" @@ -0,0 +1,37 @@ +package week2.이상억.progarmmers; + +/** + * PackageName : week2.이상억.programmers + * FileName : 최소직사각형 + * Author : sangeok + * Date : 2025. 5. 8. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 8. sangeok Initial creation + */ + +class Solution { + public int solution(int[][] sizes) { + int answer = 0; + + for(int i = 0; i sizes[i][0] ? one : sizes[i][0]; + two = two > sizes[i][1] ? two : sizes[i][1]; + } + + return one * two; + + } +} \ No newline at end of file diff --git "a/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\354\206\237\352\260\222_\353\247\214\353\223\244\352\270\260.java" "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\354\206\237\352\260\222_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..58cfe14 --- /dev/null +++ "b/week2/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\354\206\237\352\260\222_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,32 @@ +package week2.이상억.progarmmers; + +/** + * PackageName : week2.이상억.programmers + * FileName : 최솟값_만들기 + * Author : sangeok + * Date : 2025. 5. 6. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 6. sangeok Initial creation + */ + +import java.util.Arrays; + +class Solution +{ + public int solution(int []a, int []b) + { + + int answer = 0; + Arrays.sort(a); + Arrays.sort(b); + + for(int i = 0; i stack = new Stack<>(); + int answer = 0; + + for (int i : ingredient) { + stack.push(i); + + if (stack.size() >= 4) { + int size = stack.size(); + if (stack.get(size-4) == 1 && + stack.get(size-3) == 2 && + stack.get(size-2) == 3 && + stack.get(size-1) == 1) { + + for (int j = 0; j < 4; j++) stack.pop(); + answer++; + } + } + } + + return answer; + } +} 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/\352\271\200\353\210\204\353\246\254/baekjoon/\354\225\214\353\236\214_\354\213\234\352\263\204.java" "b/week20/\352\271\200\353\210\204\353\246\254/baekjoon/\354\225\214\353\236\214_\354\213\234\352\263\204.java" new file mode 100644 index 0000000..c968c22 --- /dev/null +++ "b/week20/\352\271\200\353\210\204\353\246\254/baekjoon/\354\225\214\353\236\214_\354\213\234\352\263\204.java" @@ -0,0 +1,57 @@ +package week20.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; + +/** + * PackageName : week20.김누리.baekjoon + * FileName : 알람_시계 + * Author : 김누리(NRKim) + * Date : 2025-09-10 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 10. 김누리(NRKim) Initial creation + */ + +/* + +첫번째 줄 : H_M >> 10 10 >> 10:10 + +그러면 H : M 을 M단위로 변경 후 45를 - + +이후 다시 H M 형태로 반환 + +*/ + +public class 알람_시계 { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + String[] hm = br.readLine().split(" "); + int h = Integer.parseInt(hm[0]); + int m = Integer.parseInt(hm[1]); + + int min = toMin(h, m); + + min = (min - 45 + 24*60) % (24 * 60); + + bw.write(toHM(min)); + bw.flush(); + bw.close(); + } + + private static int toMin(int h, int m) { + return h * 60 + m; + } + + private static String toHM (int min) { + int h = min / 60; + int m = min % 60; + + return Integer.toString(h) + " " + Integer.toString(m); + } +} diff --git "a/week20/\352\271\200\353\210\204\353\246\254/baekjoon/\354\235\274_\354\235\264_\354\202\274_\353\215\224\355\225\230\352\270\260.java" "b/week20/\352\271\200\353\210\204\353\246\254/baekjoon/\354\235\274_\354\235\264_\354\202\274_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..236fcdd --- /dev/null +++ "b/week20/\352\271\200\353\210\204\353\246\254/baekjoon/\354\235\274_\354\235\264_\354\202\274_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,70 @@ +package week20.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.StringTokenizer; + +/** + * PackageName : week20.김누리.baekjoon + * FileName : 일_이_삼_더하기 + * Author : 김누리(NRKim) + * Date : 2025-09-07 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 07. 김누리(NRKim) Initial creation + */ + +/* + +예 ) +3 -> 테스트 케이스의 건수 +4 --> 4를 1, 2, 3의 합으로 나타낼 것 => (1,3)/ (2,2)/ (3,1)/ (1,1,2)/ (1,2,1)/ (2,1,1)/ (1,1,1,1) ==> 7건 +7 --> 7를 1, 2, 3의 합으로 나타낼 것 => (1, 3, 3)/ (2, 2, 3)/ (3, 1, 3)/ (1, 1, 2, 3)/ (1, 2, 2, 2)/ (2, 1, 2, 2)/ (1, 1, 1, 2, 2)/ (1, 2, 1, 1, 2)/ (2, 1, 1, 1, 2)/ (1, 1, 1, 1, 1, 2)/ (1, 2, 1, 1, 1, 1)/ (2, 1, 1, 1, 1, 1)/ (1, 1, 1, 1, 1, 1, 1) ==> 44건 +10 --> 10를 1, 2, 3의 합으로 나타낼 것 => 274건 + +그러면 + +1 2 3 4 5 6 7 8 9 10 +1 2 4 7 13 24 44 81 149 274 + +dp[1] = 1 +dp[2] = 2 +dp[3] = 4 +dp[4] = 7 +dp[5] = 13 +dp[6] = 24 + +※ dp[i] = dp[i-1] + dp[i-2] + dp[i-3] + +*/ + +public class 일_이_삼_더하기 { + public static void main(String[] args) throws Exception{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + int size = Integer.parseInt(br.readLine().trim()); // 정답 배열 크기 + int[] answer = new int[11]; + + // 1의 경우 = 1, 2의 경우 = 2 , 3의 경우 = 4로 fix + answer[0] = 1; + answer[1] = 2; + answer[2] = 4; + + // dp[i] = dp[i-1] + dp[i-2] + dp[i-3], 실제 패턴은 위 주석 확인 ㄱㄱ + for(int i = 3; i < 11; i++) answer[i] = answer[i-1] + answer[i-2] + answer[i-3]; + + // 출력 처리 + for(int i = 0; i < size; i++) { + int n = Integer.parseInt(br.readLine().trim()); + bw.write(answer[n-1] + "\n"); + } + + bw.flush(); + bw.close(); + } +} diff --git "a/week20/\352\271\200\353\210\204\353\246\254/baekjoon/\354\271\264\353\223\234_\352\265\254\353\247\244\355\225\230\352\270\260.java" "b/week20/\352\271\200\353\210\204\353\246\254/baekjoon/\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..49edec9 --- /dev/null +++ "b/week20/\352\271\200\353\210\204\353\246\254/baekjoon/\354\271\264\353\223\234_\352\265\254\353\247\244\355\225\230\352\270\260.java" @@ -0,0 +1,65 @@ +package week20.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.StringTokenizer; + +/** + * PackageName : week20.김누리.baekjoon + * FileName : 카드_구매하기 + * Author : 김누리(NRKim) + * Date : 2025-09-07 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 07. 김누리(NRKim) Initial creation + */ + +/* + +4 ==> 구매 갯수 (카드 갯수) +1 5 6 7 + +그러면 +카드 1개가 든 카드팩은 1원, 이걸 4팩을 사야 카드를 4개 구매하게 됨. 그럼 소비액 ==> 4원 +카드 2개가 든 카드팩은 5원, 이걸 2팩을 사야 카드를 4개 구매하게 됨. 그럼 소비액 ==> 10원 +카드 3개가 든 카드팩은 6원, 이걸 1팩, 그리고 1개가 든 카드팩 1팩을 사야 카드를 4개 구매하게 됨. 그럼 소비액 ==> 7원 +카드 4개가 든 카드팩은 7원, 이걸 1팩을 사야 카드를 4개 구매하게 됨. 그럼 소비액 ==> 7원 + + +*/ + +public class 카드_구매하기 { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + int size = Integer.parseInt(br.readLine()); // 카드 갯수 + int[] price = new int[size+1]; + StringTokenizer tk = new StringTokenizer(br.readLine()); + + // 카드팩 당 카드팩 가격 (1개입 팩 : 1원, 2개입 팩 : 5원 등등) + for(int i = 1; i < size;i++) price[i] = Integer.parseInt(tk.nextToken()); + + int[] dp = new int[size+1]; + + for(int i = 1; i <= size; i++) { + int tmp = 0; + + for(int j = 1; j <= i; j++) { + // 최댓값 구하기 + tmp = Math.max(tmp, price[j] + dp[i-j]); + } + + dp[i] = tmp; + } + + bw.write(String.valueOf(dp[size])); + bw.flush(); + bw.close(); + } +} diff --git "a/week20/\352\271\200\353\210\204\353\246\254/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\271\200\353\210\204\353\246\254/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..95e9e91 --- /dev/null +++ "b/week20/\352\271\200\353\210\204\353\246\254/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,65 @@ +package week20.김누리.programmers; + +/** + * PackageName : week20.김누리.programmers + * FileName : 가장_큰_정사각형_찾기 + * Author : 김누리(NRKim) + * Date : 2025-09-06 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 06. 김누리(NRKim) Initial creation + */ + +/* + +dp 채택하면 될듯, +1 = 1*1의 정사각형, 0 빈칸 + +n = 높이, m = 가로 + +dp[n][m] 돌리며 가장 큰 정사각형의 한 변을 구한 뒤 + +제곱 해서(정사각형의 넓이니) 반환 하면 될 듯 + +*/ + +public class 가장_큰_정사각형_찾기 { + public int solution(int [][]board) + { + int n = board.length; + int m = board[0].length; + int answer = 0; + int[][] dp = new int[n][m]; + + // 첫번째 행/ 열은 cp -p + for(int i = 0; i < n; i++) { + dp[i][0] = board[i][0]; + + if(dp[i][0] > answer) answer = dp[i][0]; + } + + for(int i = 0; i < m; i++) { + dp[0][i] = board[0][i]; + + if(dp[0][i] > answer) answer = dp[0][i]; + } + + // dp 알고리즘 처리 + for(int i = 1; i < n; i++) { + for(int j = 1; j < m; j++) { + if(board[i][j] == 1) { + dp[i][j] = 1 + Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1])); + + if(dp[i][j] > answer) answer = dp[i][j]; // 정사각형의 한 선의 길이 + } else { + dp[i][j] = 0; + } + } + } + + // dp 알고리즘에서 한 변의 길이만 구한 것이기 때문에 반환시 제곱을 해야 함. + return answer*answer; + } +} diff --git "a/week20/\352\271\200\353\210\204\353\246\254/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\271\200\353\210\204\353\246\254/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..2b393c7 --- /dev/null +++ "b/week20/\352\271\200\353\210\204\353\246\254/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,75 @@ +package week20.김누리.programmers; + +import java.util.ArrayList; +import java.util.List; + +/** + * PackageName : week20.김누리.programmers + * FileName : 우박수열_정적분 + * Author : 김누리(NRKim) + * Date : 2025-09-06 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 06. 김누리(NRKim) Initial creation + */ + +/* + +GPT 도움 받은 부분 : + 1. 정적분 시, idx 구하는 공식 + +1. list에 콜라츠 공식으로 값 설정 +2. 구간 별로 1에서 구한 넓이 계산 +3. 이후 누적 합 계산 +4. 결과값 정리 + +특별한 알고리즘은 불필요, 단순 구현이지만 정적분 공식 및 index 계산 공식에서 해맴.. +*/ + +public class 우박수열_정적분 { + public double[] solution(int k, int[][] ranges) { + List temp = new ArrayList<>(); + long val = k; + temp.add(val); + + // 콜라츠 추측 연산 + while( val > 1 ){ + if((val & 1L) == 1L) val = (val * 3) + 1; // 홀수의 경우 + else val /= 2; // 짝수의 경우 + + temp.add(val); + } + + int len = temp.size() - 1; + double[] prev = new double[len]; + + // 구간별 넓이 계산 + for(int i = 0; i < len; i++) { + prev[i] = (double)(temp.get(i) + temp.get(i+1)) / 2.0; + } + + // 누적 합 계산 + double[] pref = new double[len + 1]; + for(int i = 0; i < len; i++) { + pref[i+1] = pref[i] + prev[i]; + } + + // 결과값 정리 + double[] answer = new double[ranges.length]; + + for(int i = 0; i < ranges.length; i++) { + int s = ranges[i][0]; + int eOff = ranges[i][1]; // 마지막 인덱스의 offset + int e = len + eOff; // 마지막 인덱스 + + // 인덱스 보정 + if(s < 0 || s > len || e < 0 || e > len || e < s) answer[i] = -1.0; + else answer[i] = pref[e] - pref[s]; + + } + + return answer; + } +} diff --git "a/week20/\352\271\200\353\210\204\353\246\254/programmers/\355\212\234\355\224\214.java" "b/week20/\352\271\200\353\210\204\353\246\254/programmers/\355\212\234\355\224\214.java" new file mode 100644 index 0000000..91ac1dd --- /dev/null +++ "b/week20/\352\271\200\353\210\204\353\246\254/programmers/\355\212\234\355\224\214.java" @@ -0,0 +1,37 @@ +package week20.김누리.programmers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week20.김누리.programmers + * FileName : 튜플 + * Author : 김누리(NRKim) + * Date : 2025-09-10 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 10. 김누리(NRKim) Initial creation + */ + +public class 튜플 { + public int[] solution(String s) { + Map map = new HashMap<>(); + + String tmp = s.replace("{","").replace("}",""); + + for(String s1 : tmp.split(",")) map.put(Integer.parseInt(s1),map.getOrDefault(Integer.parseInt(s1),0)+1); + + List list = new ArrayList<>(map.keySet()); + list.sort((a,b) -> map.get(b) - map.get(a)); + + int[] answer = new int[list.size()]; + + for(int i = 0; i < list.size(); i++) answer[i] = list.get(i); + + return answer; + } +} diff --git "a/week20/\352\271\200\353\210\204\353\246\254/programmers/\355\231\200\354\247\235\355\212\270\353\246\254.java" "b/week20/\352\271\200\353\210\204\353\246\254/programmers/\355\231\200\354\247\235\355\212\270\353\246\254.java" new file mode 100644 index 0000000..8e89c54 --- /dev/null +++ "b/week20/\352\271\200\353\210\204\353\246\254/programmers/\355\231\200\354\247\235\355\212\270\353\246\254.java" @@ -0,0 +1,121 @@ +package week20.김누리.programmers; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week20.김누리.programmers + * FileName : 홀짝트리 + * Author : 김누리(NRKim) + * Date : 2025-09-12 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 09. 12. 김누리(NRKim) Initial creation + */ + +/* + +홀수 노드 : 노드의 번호 홀수, 자식노드 개수 홀수인 노드 +짝수 노드 : 노드의 번호 짝수, 자식노드 개수 짝수인 노드 + +역홀수 노드 : 노드의 번호 홀수, 자식노드 개수 짝수인 노드 +역짝수 노드 : 노드의 번호 짝수, 자식노드 개수 홀수인 노드 + +nodes = 노드 정보가 저장된 배열 +edges = 노드간 연결 정보 + +case 1 : +nodes = {11,9,3,2,4,6} +edges = [[9,11],[2,3],[6,3],[3,4]] + +그러면 그래프화 한다면? 아래와 같음 + + 9 3 + / / | \ +11 2 4 6 + +9 - 11 : 홀수 노드 +11 - 9 : 역홀수 노드 + + 3 + / | \ +2 4 6 + +홀짝트리 + + 6 + | + 3 + / \ +2 4 + +해당 ㄴㄴ + + + +*/ + +public class 홀짝트리 { + public int[] solution(int[] nodes, int[][] edges) { + int[] answer = new int[2]; + + // 노드별 인덱스로 묶기 + Map map = new HashMap<>(); + + for(int i = 0; i < nodes.length; i++) map.put(nodes[i],i); + + // 노드당 인접 차수 노드 계산용 리스트 + List[] g = new ArrayList[nodes.length]; + + for(int i = 0; i < nodes.length; i++) g[i] = new ArrayList<>(); + for(int[] e : edges) { + int u = map.get(e[0]), v = map.get(e[1]); + g[u].add(v); g[v].add(u); + } + + int[] deg = new int[nodes.length]; + for(int i = 0; i < nodes.length; i++) deg[i] = g[i].size(); + + boolean[] visited = new boolean[nodes.length]; + int hol = 0, rev = 0; + + // 노드를 순회하며 홀짝트리, 역홀짝 트리 계산 + for(int i = 0; i < nodes.length; i++) { + // 방문한 공역이면 스킵 + if(visited[i]) continue; + + Listcomp = new ArrayList<>(); + Deque st = new ArrayDeque<>(); + st.push(i); visited[i] = true; + + while (!st.isEmpty()) { + int u = st.pop(); + comp.add(u); + + for(int v : g[u]) { + if(!visited[v]) { + visited[v] = true; + st.push(v); + } + } + } + + int eq = 0; + for(int v : comp) if ((nodes[v] & 1) == (deg[v] & 1)) eq++; + int size = comp.size(),neq = size - eq; + + if(eq == 1) hol++; + if(neq == 1) rev++; + } + + + + return new int[] {hol,rev}; + } +} 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\260\225\354\204\261\354\232\261/baekjoon/\353\270\224\353\236\231\354\236\255.java" "b/week3/\352\260\225\354\204\261\354\232\261/baekjoon/\353\270\224\353\236\231\354\236\255.java" new file mode 100644 index 0000000..5984781 --- /dev/null +++ "b/week3/\352\260\225\354\204\261\354\232\261/baekjoon/\353\270\224\353\236\231\354\236\255.java" @@ -0,0 +1,41 @@ +package week3.강성욱.baekjoon; + +//음 일딴 정렬해두면 생각이 편할꺼같기도? +//10 500 +//93 181 245 214 315 36 185 138 216 295 => +//36, 93, 138, 181, 185, 214, 216, 245, 295, 315 +//? 역순 정렬하고, 만약 안터지는게 발생되면, 그게 가장 작은 합 아냐? +// 이건 논리적으로 안되네; +// 그냥 전부다 3단 반복문ㅇ로 전체 반복 +// O(n^3), n=100, O(1_000_000) 이니 할만함. + +import java.util.*; + +public class 블랙잭 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + int maxCount = sc.nextInt(); + int target = sc.nextInt(); + int[] cards = new int[maxCount]; + + for (int i = 0; i < maxCount; i++) { + cards[i] = sc.nextInt(); + } + + int max = 0; + + for (int i = 0; i < maxCount - 2; i++) { + for (int j = i + 1; j < maxCount - 1; j++) { + for (int k = j + 1; k < maxCount; k++) { + int sum = cards[i] + cards[j] + cards[k]; + if (sum <= target && sum > max) { + max = sum; + } + } + } + } + + System.out.println(max); + } +} \ No newline at end of file diff --git "a/week3/\352\260\225\354\204\261\354\232\261/baekjoon/\353\270\224\353\241\234\352\267\270.java" "b/week3/\352\260\225\354\204\261\354\232\261/baekjoon/\353\270\224\353\241\234\352\267\270.java" new file mode 100644 index 0000000..d79a3d9 --- /dev/null +++ "b/week3/\352\260\225\354\204\261\354\232\261/baekjoon/\353\270\224\353\241\234\352\267\270.java" @@ -0,0 +1,50 @@ +package week3.강성욱.baekjoon; + +//시간복잡도가 그냥 반복문 돌려도될듯? +//제일 오래 걸리는게, N = 250,000, X = 1 일때인데, 이때도 250,000 만 계산하면 되니..? +//처음 0, 1, ... X-1 까지 계산하고 슬라이딩 +// 즉, now = list[0] + list[1] 일때 +// 다음은, now - list[0] + list[2] 임 +// 이걸 쭉 반복해서 이어가면 될듯. 가면서 조건확인 + +import java.util.Scanner; + +public class 블로그 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int N = sc.nextInt(); + int X = sc.nextInt(); + int[] list = new int[N]; + + for (int i = 0; i < N; i++) { + list[i] = sc.nextInt(); + } + + int sum = 0; + for (int i = 0; i < X; i++) { + sum += list[i]; + } + + int max = sum; + int count = 1; + + for (int i = X; i < N; i++) { + sum = sum - list[i - X] + list[i]; + + if (sum > max) { + max = sum; + count = 1; + } else if (sum == max) { + count++; + } + } + + if (max == 0) { + System.out.println("SAD"); + } else { + System.out.println(max); + System.out.println(count); + } + } +} + diff --git "a/week3/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\254\352\267\200\355\225\250\354\210\230\352\260\200_\353\255\224\352\260\200\354\232\224.java" "b/week3/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\254\352\267\200\355\225\250\354\210\230\352\260\200_\353\255\224\352\260\200\354\232\224.java" new file mode 100644 index 0000000..58b0649 --- /dev/null +++ "b/week3/\352\260\225\354\204\261\354\232\261/baekjoon/\354\236\254\352\267\200\355\225\250\354\210\230\352\260\200_\353\255\224\352\260\200\354\232\224.java" @@ -0,0 +1,54 @@ +package week3.강성욱.baekjoon; + +/** 이건 맨첨에 한번만 + * 어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다. + */ + +/** 이게 반복 시작 + * "재귀함수가 뭔가요?" + * "잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어. + * 마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지. + * 그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어." + */ + +/** 이게 반복 끝 + * 라고 답변하였지. + */ + +//단, 마지막 뎁스에서는 반복 끝나기전에 아래 내용으로 변경 +//"재귀함수는 자기 자신을 호출하는 함수라네" + +//각각의 반복문은 ____ 로 뎁스 구분 + +import java.util.Scanner; + +public class 재귀함수가_뭔가요 { + static StringBuilder sb = new StringBuilder(); + static String spaceUnit = "____"; + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + + sb.append("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n"); + newQuestion(n, 0); + System.out.println(sb.toString()); + } + + static void newQuestion(int n, int depth) { + String indent = spaceUnit.repeat(depth); + + sb.append(indent).append("\"재귀함수가 뭔가요?\"\n"); + + if (depth == n) { + sb.append(indent).append("\"재귀함수는 자기 자신을 호출하는 함수라네\"\n"); + } else { + sb.append(indent).append("\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n"); + sb.append(indent).append("마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n"); + sb.append(indent).append("그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n"); + newQuestion(n, depth + 1); + } + + sb.append(indent).append("라고 답변하였지.\n"); + } +} diff --git "a/week3/\352\260\225\354\204\261\354\232\261/programmers/K\353\262\210\354\247\270\354\210\230.java" "b/week3/\352\260\225\354\204\261\354\232\261/programmers/K\353\262\210\354\247\270\354\210\230.java" new file mode 100644 index 0000000..59f75fc --- /dev/null +++ "b/week3/\352\260\225\354\204\261\354\232\261/programmers/K\353\262\210\354\247\270\354\210\230.java" @@ -0,0 +1,36 @@ +package week3.강성욱.programmers; + +import java.util.Arrays; + +public class K번째수 { + class Solution { + public int[] solution(int[] array, int[][] commands) { + int max = commands.length; + int[] result = new int[max]; + + for (int index = 0; index < max; index++) { + int start = commands[index][0]; + int end = commands[index][1]; + int target = commands[index][2]; + + int[] newArray = splitAndSort(array, start, end); + result[index] = newArray[target - 1]; + } + + return result; + } + + public int[] splitAndSort(int[] array, int start, int end) { + int size = end - start + 1; + int[] sliced = new int[size]; + + for (int i = 0; i < size; i++) { + sliced[i] = array[start - 1 + i]; + } + + Arrays.sort(sliced); + + return sliced; + } + } +} diff --git "a/week3/\352\260\225\354\204\261\354\232\261/programmers/PCCE_\352\270\260\354\266\234\353\254\270\354\240\234_9\353\262\210_\354\235\264\354\233\203\355\225\234_\354\271\270.java" "b/week3/\352\260\225\354\204\261\354\232\261/programmers/PCCE_\352\270\260\354\266\234\353\254\270\354\240\234_9\353\262\210_\354\235\264\354\233\203\355\225\234_\354\271\270.java" new file mode 100644 index 0000000..9703014 --- /dev/null +++ "b/week3/\352\260\225\354\204\261\354\232\261/programmers/PCCE_\352\270\260\354\266\234\353\254\270\354\240\234_9\353\262\210_\354\235\264\354\233\203\355\225\234_\354\271\270.java" @@ -0,0 +1,31 @@ +package week3.강성욱.programmers; + +//흠. 문제에 h, w 로 나왔는데, x, y 로 바꿔서 괜히 복잡하게 생각하는듯 +//나쁜습관 고칠것! +//디버깅 없이 한번에 통과 굳 + +public class PCCE_기출문제_9번_이웃한_칸 { + class Solution { + public static int[] dx = {-1, 0, 1, 0}; + public static int[] dy = {0, -1, 0, 1}; + + public int solution(String[][] board, int h, int w) { + //h == y; + //w == x; + //board[h][w]; + //정사각형임 + int count = 0; + int maxXY = board.length; + String color = board[h][w]; + for(int i=0; i<4; i++) { + int nx = dx[i] + w; + int ny = dy[i] + h; + + //underflow, overflow 확인 + if(nx < 0 || ny < 0 || nx >= maxXY || ny >= maxXY) continue; + if(color.equals(board[ny][nx])) count++; + } + return count; + } + } +} diff --git "a/week3/\352\260\225\354\204\261\354\232\261/programmers/PCCE_\352\270\260\354\266\234\353\254\270\354\240\234_9\353\262\210_\354\247\200\355\216\230_\354\240\221\352\270\260.java" "b/week3/\352\260\225\354\204\261\354\232\261/programmers/PCCE_\352\270\260\354\266\234\353\254\270\354\240\234_9\353\262\210_\354\247\200\355\216\230_\354\240\221\352\270\260.java" new file mode 100644 index 0000000..18b504c --- /dev/null +++ "b/week3/\352\260\225\354\204\261\354\232\261/programmers/PCCE_\352\270\260\354\266\234\353\254\270\354\240\234_9\353\262\210_\354\247\200\355\216\230_\354\240\221\352\270\260.java" @@ -0,0 +1,34 @@ +package week3.강성욱.programmers; + +public class PCCE_기출문제_9번_지페_접기 { + //반복! + //반으로 접는건, 큰쪽을 접으면 됨. + //while 로 반복을 도면서 아래처럼 생각할것 + //1. 현재 지갑에 들어가니? (그대로 혹은 90도 돌려서?) + //2. 안되는구나.. 그럼 반으로 접자. (큰쪽을 접자) + //3. 접었으면 count++ + //4. 1번부터 다시 반복해~ + + class Solution { + public int solution(int[] wallet, int[] bill) { + int count = 0; + + while (!isPossible(wallet, bill)) { + // 긴 쪽을 반으로 접음 + if (bill[0] >= bill[1]) { + bill[0] /= 2; + } else { + bill[1] /= 2; + } + count++; + } + + return count; + } + + private boolean isPossible(int[] wallet, int[] bill) { + return (bill[0] <= wallet[0] && bill[1] <= wallet[1]) || + (bill[1] <= wallet[0] && bill[0] <= wallet[1]); + } + } +} diff --git "a/week3/\352\260\225\354\204\261\354\232\261/programmers/\353\213\244\354\235\214_\355\201\260_\354\210\253\354\236\220.java" "b/week3/\352\260\225\354\204\261\354\232\261/programmers/\353\213\244\354\235\214_\355\201\260_\354\210\253\354\236\220.java" new file mode 100644 index 0000000..bc3ab3f --- /dev/null +++ "b/week3/\352\260\225\354\204\261\354\232\261/programmers/\353\213\244\354\235\214_\355\201\260_\354\210\253\354\236\220.java" @@ -0,0 +1,31 @@ +package week3.강성욱.programmers; + +public class 다음_큰_숫자 { + //2진수로 변환하고 + //그걸 2진수로 바꾸고, 배열로 변환한뒤 1의 개수를 count 한다? + class Solution { + public int solution(int n) { + int count = oneCount(n); + int next = n + 1; + + while (oneCount(next) != count) { + next++; + } + + return next; + } + + private int oneCount(int n) { + String binary = Integer.toBinaryString(n); + int count = 0; + + for (char c : binary.toCharArray()) { + if (c == '1') { + count++; + } + } + + return count; + } + } +} diff --git "a/week3/\352\260\225\354\204\261\354\232\261/programmers/\353\213\254\353\246\254\352\270\260_\352\262\275\354\243\274.java" "b/week3/\352\260\225\354\204\261\354\232\261/programmers/\353\213\254\353\246\254\352\270\260_\352\262\275\354\243\274.java" new file mode 100644 index 0000000..eb26439 --- /dev/null +++ "b/week3/\352\260\225\354\204\261\354\232\261/programmers/\353\213\254\353\246\254\352\270\260_\352\262\275\354\243\274.java" @@ -0,0 +1,41 @@ +package week3.강성욱.programmers; + +import java.util.*; + +public class 달리기_경주 { + class Solution { + + public String[] solution(String[] players, String[] callings) { + Map mp = new HashMap<>(); + + int i = 0; + for(String a : players){ + //현재 등수를 map으로 저장. + mp.put(a, i); + i++; + } + + //불린 횟수만큼 반복할꺼임. + for(String called : callings){ + int calledGrade = mp.get(called); + if(calledGrade == 0){ + continue; + //이미 1등이면 아무것도 할 필요 없음. + } + int nextGrade = calledGrade - 1; + + //map 에도 swap된 데이터로 value 최신화 필요 + mp.put(players[calledGrade], nextGrade); + mp.put(players[nextGrade], calledGrade); + + //이제 둘이 swap 시킬것. + String temp = null; + temp = players[calledGrade]; + players[calledGrade] = players[nextGrade]; + players[nextGrade] = temp; + } + + return players; + } + } +} diff --git "a/week3/\352\260\225\354\204\261\354\232\261/programmers/\353\251\200\353\246\254_\353\233\260\352\270\260.java" "b/week3/\352\260\225\354\204\261\354\232\261/programmers/\353\251\200\353\246\254_\353\233\260\352\270\260.java" new file mode 100644 index 0000000..70529a5 --- /dev/null +++ "b/week3/\352\260\225\354\204\261\354\232\261/programmers/\353\251\200\353\246\254_\353\233\260\352\270\260.java" @@ -0,0 +1,41 @@ +package week3.강성욱.programmers; + +public class 멀리_뛰기 { + //dp? + //n == 1 || 1가지 + //n == 2 || 2가지 + //n == 3 || 3가지 + // (1, 1, 1), (1, 2), (2, 1) + //n == 4 || 5가지 + // (1, 1, 1, 1), (1, 1, 2), (1, 2, 1), (2, 1, 1), (2, 2) + //n == 5 || 8가지 + // (1, 1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 2, 1), (1, 2, 1, 1), (1, 2, 2) + // (2, 1, 1, 1), (2, 1, 2), (2, 2, 1)) + + //이거 dp(n) == dp(n-1) + dp(n-2) 인듯? + //아 이거 테스트 7번부터, overflow 나오는듯? long도 감당 안되는듯 + //모듈러 한걸 메모이제이션 해야됨 + + class Solution { + public long solution(int n) { + if (n == 1) return 1; + if (n == 2) return 2; + if (n == 3) return 3; + if (n == 4) return 5; + if (n == 5) return 8; + + long[] dp = new long[2001]; + dp[1] = 1; + dp[2] = 2; + dp[3] = 3; + dp[4] = 5; + dp[5] = 8; + + for (int i = 6; i <= n; i++) { + dp[i] = (dp[i - 1] + dp[i - 2]) % 1234567; + } + + return dp[n]; + } + } +} diff --git "a/week3/\352\260\225\354\204\261\354\232\261/programmers/\355\224\204\353\241\234\354\204\270\354\212\244.java" "b/week3/\352\260\225\354\204\261\354\232\261/programmers/\355\224\204\353\241\234\354\204\270\354\212\244.java" new file mode 100644 index 0000000..0f06660 --- /dev/null +++ "b/week3/\352\260\225\354\204\261\354\232\261/programmers/\355\224\204\353\241\234\354\204\270\354\212\244.java" @@ -0,0 +1,61 @@ +package week3.강성욱.programmers; + +import java.util.*; + +public class 프로세스 { + //[A:2, B:1, C:3, D:2] + //1step + //A를 꺼냈으나, 뒤에 우선순위가 더 높은 C가 있으니, 다시 맨뒤로 빠꾸 + //[B:1, C:3, D:2, A:2] + //2step + //B를 꺼냈으나, 뒤에 우선순위가 더 높은 C가 있으니, 다시 맨뒤로 빠꾸 + //[C:3, D:2, A:2, B:1] + //3step + //C꺼냈을때, 이게 제일 우선순위 높으니, 이거 실행 + //[D:2, A:2, B:1] + //실행완료 : C, + //4step + //D 꺼냈는데, 이게 젤 높음. 실행 + //[A:2, B:1] + //실행 완료 : C, D + //... 이렇게 c d a b 인건가? + //어짜피 실행 순서는 숫자가 높은순서인데, 문제는 같은 실행 순서가 있다면, 먼저 어떤 프로세스가 처리될지 엄격하게 관리해야됨. + // 즉, 모든걸 pq 로 처리할 수는 없음. + // 복합적으로 pq 도 관리하고 일반 queue 도 관리해야됨. + + class Solution { + public int solution(int[] priorities, int location) { + Queue queue = new LinkedList<>(); + PriorityQueue pq = new PriorityQueue<>(Collections.reverseOrder()); + + for (int i = 0; i < priorities.length; i++) { + queue.add(new int[]{i, priorities[i]}); + pq.add(priorities[i]); + } + + int count = 0; + + while (!queue.isEmpty()) { + int[] current = queue.poll(); + int currentIndex = current[0]; + int currentPriorites = current[1]; + + // 현재 프로세스의 우선순위가 제일 높은 우선순위가 아니면 다시뒤로빠꾸 + if (currentPriorites < pq.peek()) { + queue.add(new int[]{currentIndex, currentPriorites}); + } else { + // 만약 현재 프로세스의 우선순위가 젤 높은 우선순위일경우. + count++; //실행 count ++ + pq.poll(); + + // 만약 이번에 실행된게 찾는 프로세스면 return + if (currentIndex == location) { + return count; + } + } + } + + return -1; + } + } +} 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/week3/\352\271\200\353\202\230\354\235\200/programmers/\353\213\244\354\235\214 \355\201\260 \354\210\253\354\236\220.java" "b/week3/\352\271\200\353\202\230\354\235\200/programmers/\353\213\244\354\235\214 \355\201\260 \354\210\253\354\236\220.java" new file mode 100644 index 0000000..f9d6c74 --- /dev/null +++ "b/week3/\352\271\200\353\202\230\354\235\200/programmers/\353\213\244\354\235\214 \355\201\260 \354\210\253\354\236\220.java" @@ -0,0 +1,21 @@ +package week3.김나은.programmers; + +class Solution { + public int solution(int n) { + // n의 이진수에서 1의 개수를 구함 + int nowCount = Integer.bitCount(n); + + // 다음 숫자를 찾기 위한 반복문 + while(true) { + n++; + int nextCount = Integer.bitCount(n); // 증가된 n의 이진수에서 1의 개수를 구함 + + // n++의 이진수 1의 개수와 원래 n의 1의 개수가 같으면 루프 종료 + if(nowCount == nextCount) { + break; + } + } + + return n; + } +} \ No newline at end of file diff --git "a/week3/\352\271\200\353\210\204\353\246\254/baekjoon/\353\270\224\353\236\231\354\236\255.java" "b/week3/\352\271\200\353\210\204\353\246\254/baekjoon/\353\270\224\353\236\231\354\236\255.java" new file mode 100644 index 0000000..4c71717 --- /dev/null +++ "b/week3/\352\271\200\353\210\204\353\246\254/baekjoon/\353\270\224\353\236\231\354\236\255.java" @@ -0,0 +1,55 @@ +package week3.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.StringTokenizer; + +/** + * PackageName : week3.김누리.baekjoon + * FileName : 블랙잭 + * Author : 김누리(NRKim) + * Date : 2025-05-14 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 14. 김누리(NRKim) Initial creation + */ + +public class 블랙잭 { + public static void solution() throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + StringBuilder sb = new StringBuilder(); + StringTokenizer st = new StringTokenizer(br.readLine()," "); + + int l = Integer.parseInt(st.nextToken()); // 덱에 들어갈 카드 갯수 + int target = Integer.parseInt(st.nextToken()); // 타겟 숫자 + + int[] cards = new int[l]; // 덱에 들어갈 만큼 카드 갯수 지정 + st = new StringTokenizer(br.readLine()," "); // 카드 입력 + for(int i = 0 ; i < l ; i++) cards[i] = Integer.parseInt(st.nextToken()); // 덱에 카드 입력 + + int max = 0; // 3장의 카드를 더해질 변수 + + for(int i =0 ; i < l-2 ; i++) { + for(int j = i+1 ; j < l-1 ; j++) { + for(int k = j+1 ; k < l ; k++) { + int comb = cards[i] + cards[j] + cards[k]; + + if(comb <= target) { + if (comb > max) { + max = comb; + } + } + } + } + } + bw.write(String.valueOf(max)+"\n"); + bw.flush(); + bw.close(); + br.close(); + } +} diff --git "a/week3/\352\271\200\353\210\204\353\246\254/baekjoon/\353\270\224\353\241\234\352\267\270.java" "b/week3/\352\271\200\353\210\204\353\246\254/baekjoon/\353\270\224\353\241\234\352\267\270.java" new file mode 100644 index 0000000..6b8ca8e --- /dev/null +++ "b/week3/\352\271\200\353\210\204\353\246\254/baekjoon/\353\270\224\353\241\234\352\267\270.java" @@ -0,0 +1,137 @@ +package week3.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.StringTokenizer; + +/** + * PackageName : week3.김누리.baekjoon + * FileName : 블로그 + * Author : 김누리(NRKim) + * Date : 2025-05-14 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 14. 김누리(NRKim) Initial creation + */ + +/* +입력 분석 +N과 X +N은 블로그 시작한지 N일이 지남. +X는 N일 중 연속된 X 일 + +예 ) +1번 케이스 +5 2 +1 4 2 5 1 + +1번째 명령어에서 N = 5, X = 2 +2번째 명령어 방문자 = {1,4,2,5,1} + +방문자[0] + 방문자[1] = 1 + 4 = 5 +방문자[1] + 방문자[2] = 4 + 2 = 6 +방문자[2] + 방문자[3] = 2 + 5 = 7 +방문자[3] + 방문자[4] = 5 + 1 = 6 + +max 값은 7, 이는 1번 반복되니 출력은 + +7 +1 + + +2번 케이스 +7 5 +1 1 1 1 1 5 1 + +1번째 명령어에서 N = 7, X = 5 +2번째 명령어 방문자 = {1,1,1,1,1,5,1} + +방문자[0] + 방문자[1] + 방문자[2] + 방문자[3] + 방문자[4]= 1 + 1 + 1 + 1 + 1 = 5 +방문자[1] + 방문자[2] + 방문자[3] + 방문자[4] + 방문자[5]= 1 + 1 + 1 + 1 + 5 = 9 +방문자[1] + 방문자[2] + 방문자[3] + 방문자[4] + 방문자[5]= 1 + 1 + 1 + 5 + 1 = 9 + +max 값은 9, 이는 2번 반복되니 출력은 + +9 +2 + +3번 케이스 +5 3 +0 0 0 0 0 + +1번째 명령어에서 N = 5, X = 3 +2번째 명령어 방문자 = {0,0,0,0,0} + +방문자[0] + 방문자[1] + 방문자[2] = 0 +방문자[1] + 방문자[2] + 방문자[3] = 0 +방문자[2] + 방문자[3] + 방문자[4] = 0 + +max는 0이니 SAD 출력 + +*/ + +public class 블로그 { + public void solution() throws Exception { + // + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + StringTokenizer st = new StringTokenizer(br.readLine(), " "); + + int n = Integer.parseInt(st.nextToken()); // N 값 + int x = Integer.parseInt(st.nextToken()); // X 값 + + int[] arr = new int[n]; // N사이즈 만큼 배열 생성 + st = new StringTokenizer(br.readLine(), " "); + + // 배열에 값 입력 + for(int i = 0; i < n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + int sum = 0; + + for(int i = 0; i < x; i++) { + // x번째 까지 미리 합을 구함 예 ) x가 2일 때 : sum = arr[0] + arr[1] + sum += arr[i]; // sum += sum[0]:1 > sum += sum[1]:4 = 5 + } + + int max = sum; // 더한 값이 최대일 때 // 현재 : 5 + int cnt = 1; // max 값 지속 일자 + + // x =< i < n // i = 2 3 4 + for(int i = x; i < n; i++) { + // sum에 현재 idx - x 번째의 인덱스 값을 빼고, 현재 인덱스 값 더하기 + // sum = sum - arr[2-2] + arr[2] > sum = sum - arr[0] + arr[2] + // sum = 5 - 1 + 2 + // 5-1 = (4 == arr[1]) + // 4 + 2 = arr[1] + arr[2] = 6 + + // sum = sum - arr[3-2] + arr[3] > sum = sum - arr[1] + arr[3] + // sum = 6 - 4 + 5 + // 6 - 4 = (2 == arr[2]) + // 2 + 5 = arr[2] + arr[3] = 7 + sum = sum - arr[i-x] + arr[i]; + + if(sum > max) { + max = sum; // 최고 수치 갱신 + cnt = 1; // max 지속일 갱신 + } else if (sum == max){ + cnt++; // max 값 ++ + } + } + + if(max == 0) { + bw.write("SAD" + "\n"); + } else { + bw.write(max+"\n"+cnt+"\n"); + } + + bw.flush(); + bw.close(); + br.close(); + } +} diff --git "a/week3/\352\271\200\353\210\204\353\246\254/baekjoon/\354\236\254\352\267\200\355\225\250\354\210\230\352\260\200_\353\255\224\352\260\200\354\232\224.java" "b/week3/\352\271\200\353\210\204\353\246\254/baekjoon/\354\236\254\352\267\200\355\225\250\354\210\230\352\260\200_\353\255\224\352\260\200\354\232\224.java" new file mode 100644 index 0000000..a73cdda --- /dev/null +++ "b/week3/\352\271\200\353\210\204\353\246\254/baekjoon/\354\236\254\352\267\200\355\225\250\354\210\230\352\260\200_\353\255\224\352\260\200\354\232\224.java" @@ -0,0 +1,67 @@ +package week3.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; + +/** + * PackageName : week3.김누리.baekjoon + * FileName : 재귀함수가_뭔가요 + * Author : 김누리(NRKim) + * Date : 2025-05-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 13. 김누리(NRKim) Initial creation + */ + +/* +* 반복 구호 : +* +* "재귀함수가 뭔가요?" +* "잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어. +* 마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지. + * 그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어." +* +*/ + +public class 재귀함수가_뭔가요 { + static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + static StringBuilder sb = new StringBuilder(); + + public static void solution() throws Exception{ + int n = Integer.parseInt(br.readLine()); // 출력 반복 수 + bw.write("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n"); // 초기 대사 + dfs(0,n); // for(int i = 0; i < n; i++) + bw.write(sb.toString()); + bw.flush(); + bw.close(); + br.close(); + + } + + public static void dfs(int start, int end){ + String indent = "____".repeat(start); + + sb.append(indent).append("\"재귀함수가 뭔가요?\"").append("\n"); + + if(start == end) { + // 마지막 호출일 때 출력 대사 + sb.append(indent).append("\"재귀함수는 자기 자신을 호출하는 함수라네\"\n"); + } else { + // 대사 반복. 1번째 호출일 경우 '____'는 안붙음, 2번째일때는 '____'가 붙고 등등등 + sb.append(indent).append("\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.").append("\n"); + sb.append(indent).append("마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.").append("\n"); + sb.append(indent).append("그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"").append("\n"); + + // 호출 카운트 증가 + dfs(start+1,end); + } + + // 맺음말 + sb.append(indent).append("라고 답변하였지.\n"); + } +} diff --git "a/week3/\352\271\200\353\210\204\353\246\254/programmers/K_\353\262\210\354\250\260\354\210\230.java" "b/week3/\352\271\200\353\210\204\353\246\254/programmers/K_\353\262\210\354\250\260\354\210\230.java" new file mode 100644 index 0000000..382343c --- /dev/null +++ "b/week3/\352\271\200\353\210\204\353\246\254/programmers/K_\353\262\210\354\250\260\354\210\230.java" @@ -0,0 +1,45 @@ +package week3.김누리.programmers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week3.김누리.programmers + * FileName : K_번쨰수 + * Author : 김누리(NRKim) + * Date : 2025-05-12 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 12. 김누리(NRKim) Initial creation + */ + +public class K_번쨰수 { + public int[] solution(int[] array, int[][] commands) { + int[] answer = new int[commands.length]; + int idx = 0; + + for(int[] command : commands) { + List tmp = new ArrayList<>(); // i 번에서 j 번 까지 채집한 값들을 넣을 임시 list, array로 해도 되지만, 길이가 유동적일테니 array보다 list 채용 + int i = command[0]-1; // i(시작점)에 해당 하는 값 [2,5,3] 중 2번째 수는 idx 상으로는 1이여야 함 + int j = command[1]-1; // j(끝점)에 해당 하는 값 [2,5,3] 중 5번째 수는 idx 상으로는 4이여야 함 + int k = command[2]-1; // k(타겟 번호)에 해당 하는 값 [2,5,3] 중 3번째 수는 idx 상으로는 2이여야 함 + + // i부터 j 까지 배열 생성 + for(int a = i; a <= j; a++) { + tmp.add(array[a]); + } + + // i부터 j 까지 추출 한 값 정렬 + Collections.sort(tmp); + + // answer에 k번째 값 적재 + answer[idx++] = tmp.get(k); + + } + + return answer; + } +} diff --git "a/week3/\352\271\200\353\210\204\353\246\254/programmers/\353\213\244\354\235\214_\355\201\260_\354\210\253\354\236\220.java" "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\353\213\244\354\235\214_\355\201\260_\354\210\253\354\236\220.java" new file mode 100644 index 0000000..8fc4ce7 --- /dev/null +++ "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\353\213\244\354\235\214_\355\201\260_\354\210\253\354\236\220.java" @@ -0,0 +1,42 @@ +package week3.김누리.programmers; + +/** + * PackageName : week3.김누리.programmers + * FileName : 다음_큰_숫자 + * Author : 김누리(NRKim) + * Date : 2025-05-10 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 10. 김누리(NRKim) Initial creation + */ + +/* +case 1 : +78 (1001110) => 1*2^6 + 0*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 1 * 2 + => 64 + 8 + 4 + 2 + => 72 + 6 + => 8 +79 (1001111) +80 (1010000) +81 (1010001) +82 (1010010) +83 (1010011) +그래서 정답은 83 +*/ + +public class 다음_큰_숫자 { + public int solution(int n) { + int answer = 0; + int bin = Integer.bitCount(n); // n을 이진변환 완료한 타겟 값 + + // n을 이진변환 했을 때 1의 수 == bin 값일 때 까지 + while (Integer.bitCount(++n) != bin); + + // 변환 완료한 n값 answer로 + answer = n; + + return answer; + } +} diff --git "a/week3/\352\271\200\353\210\204\353\246\254/programmers/\353\213\254\353\246\254\352\270\260_\352\262\275\354\243\274.java" "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\353\213\254\353\246\254\352\270\260_\352\262\275\354\243\274.java" new file mode 100644 index 0000000..48090ab --- /dev/null +++ "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\353\213\254\353\246\254\352\270\260_\352\262\275\354\243\274.java" @@ -0,0 +1,113 @@ +package week3.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week3.김누리.programmers + * FileName : 달리기_경주 + * Author : 김누리(NRKim) + * Date : 2025-05-12 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 12. 김누리(NRKim) Initial creation + * 2025. 05. 12. 김누리(NRKim) 1차 풀이 실패. 사유 : + * 로직에는 NG 없음. 그러나 players 배열을 순회하면서 2중 for문 + * 을 이용하다보니, 시간 복잡도가 늘어나 시간초과가 발생하여 + * NG 케이스가 되어버림 + * + * 2025. 05. 12. 김누리(NRKim) 2차 풀이 성공. 바뀐 내용 : + * 2중 for문이 아니라, hash map을 이용 + * 호명된 선수의 idx를 가지고 앞번 선수 구하고 이를 통해 + * players 배열의 idx랑 map의 인덱스값을 갱신하는 방식으로 + * 문제풀이 방식 변경 + */ + +/* +case 1 : + callings ["kai", "kai", "mine", "mine"] + players ["mumu", "soe", "poe", "kai", "mine"] + + step 1 : callings[0] kai + players ["mumu", "soe", "kai", "poe", "mine"] + + step 2 : callings[1] kai + players ["mumu", "kai", "soe", "poe", "mine"] + + step 3 : callings[2] mine + players ["mumu", "kai", "soe", "mine", "poe"] + + step 4 : callings[0] kai + players ["mumu", "kai", "mine", "soe", "poe"] + + result : ["mumu", "kai", "mine", "soe", "poe"] +*/ + +public class 달리기_경주 { + // 실패 사유 2중for문 사용 +/* public String[] solution(String[] players, String[] callings) { + String[] answer = new String [players.length]; + + // 선수 호명 + for(String calling : callings) { + + // player 배열 순회하며 호명된 선수 찾기, + for(int i = 0; i < players.length; i++) { + // 로테이션용 임시 변수 + String tmp = ""; + + // players 배열에서 호명 된 선수 발견 + if(players[i].equals(calling)) { + tmp = players[i-1]; // 호명된 선수 바로 앞에 있는 사람을 tmp로 + players[i-1] = players[i]; // 호명된 선수와 바로 앞에 있던 사람의 순번 변경 + players[i] = tmp; + } + } + } + + int idx = 0; + + for(String player : players) { + answer[idx++] = player; + } + + return answer; + }*/ + + // HashMap 이용 + public String[] solution(String[] players, String[] callings) { + String[] answer = new String [players.length]; + Map map = new HashMap<>(); + + // 선수들 셋팅 + for(int i = 0; i < players.length; i++) { + map.put(players[i],i); + } + + // 선수 호명 + for(String calling : callings) { + // 선수 위치 확인 + int idx = map.get(calling); + + // 호명된 선수 앞에 있는 선수 확인 + String frontPlayer = players[idx-1]; + + // player 테이블에서 idx 동기화 + players[idx - 1] = calling; + players[idx] = frontPlayer; + + // map에서 idx 동기화 + map.put(calling,idx-1); + map.put(frontPlayer,idx); + } + + for(int i = 0; i < players.length; i++) { + answer[i] = players[i]; + } + + return answer; + } + +} diff --git "a/week3/\352\271\200\353\210\204\353\246\254/programmers/\353\251\200\353\246\254_\353\233\260\352\270\260.java" "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\353\251\200\353\246\254_\353\233\260\352\270\260.java" new file mode 100644 index 0000000..ef1c825 --- /dev/null +++ "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\353\251\200\353\246\254_\353\233\260\352\270\260.java" @@ -0,0 +1,48 @@ +package week3.김누리.programmers; + +/** + * PackageName : week3.김누리.programmers + * FileName : 멀리_뛰기 + * Author : 김누리(NRKim) + * Date : 2025-05-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 13. 김누리(NRKim) Initial creation + */ + +/* +효찬이가 한번에 뛸 수 있는거리 : 1칸 혹은 2칸 +n이 1이면 걍 1칸만 뛰면 되니 1을 return +n이 2이면 1,1 / 2 만 뛰면 되니 2를 return +n이 3이면 1,1,1 / 1,2 / 2,1 ==> 3을 return +n이 4이면 1,1,1,1 / 1,1,2 / 1,2,1 / 2,1,1 / 2,2 ==> 5를 리턴 +n이 5이면 1,1,1,1,1 / 1,1,1,2 / 1,1,2,1 / 1,2,1,1/ 2,1,1,1/ 1,2,2 / 2,1,2 / 2,2,1 =>8을 리턴 + +※ +n| 1 | 2 | 3 | 4 | 5 +r| 1 | 2 | 3 | 5 | 8 + +즉, n이 커질수록 전번차 r(n-2) + r(n-1) = rn 이되기 때문에, 피보나치 수열로 진행하면 된다. +*/ + +public class 멀리_뛰기 { + public long solution(int n) { + long answer = 0; + long x = 1234567; + long a = 1; // r(n-2) 값 + long b = 2; // r(n-1) 값 + + if(n == 1) return answer = 1%x; // n = 1인 경우는 r = 1이므로 1을 리턴 + if(n == 2) return answer = 2%x; // n = 2인 경우는 r = 2이므로 2를 리턴 + + for(long i = 3; i <= n; i++) { + answer = (a+b) % x; // r = r(n-2) + r(n-1) % 1234567 + a = b; // r(n-1) 값을 r(n-2) 값으로 + b = answer; // r 값을 r(n-1) 값으로 + } + + return answer; + } +} diff --git "a/week3/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\233\203\355\225\234_\354\271\270.java" "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\233\203\355\225\234_\354\271\270.java" new file mode 100644 index 0000000..6262323 --- /dev/null +++ "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\233\203\355\225\234_\354\271\270.java" @@ -0,0 +1,72 @@ +package week3.김누리.programmers; + +/** + * PackageName : week3.김누리.programmers + * FileName : 이웃한_칸 + * Author : 김누리(NRKim) + * Date : 2025-05-12 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 12. 김누리(NRKim) Initial creation + */ + + +/* +case 1 : + +[ + ["blue", "red", "orange", "red"], + ["red", "red", "blue", "orange"], + ["blue", "orange", "red", "red"], + ["orange", "orange", "red", "blue"] +] + + h : 1, w : 1 == > + board[1][1] ==> + 참조 가능 좌표 : + x [0,1] x + [1,0] [1,1] [1,2] + x [2,1] x + +target[1,1] ==> red +[0,1] ==> red ==> answer++ +[1,0] ==> red ==> answer++ +[1,2] ==> blue +[2,1] ==> orange + + +case 2 : +[ + ["yellow", "green", "blue"], + ["blue", "green", "yellow"], + ["yellow", "blue", "blue"] +] +h : 0, w : 1 + +board[0][1] ==> green + +[0,0] [0,1] [0,2] + x [1,1] x + + 0,0 ==> yellow + 0,2 ==> blue + 1,1 ==> green ==> answer++ +*/ +public class 이웃한_칸 { + public int solution(String[][] board, int h, int w) { + int answer = 0; + String color = board[h][w]; // 타겟 색상 + int a = board.length; // x축 길이 + int b = board[0].length; // y축 길이 + + // 체크 가능한 좌표 [w-1][h], [w+1][h], [w][h-1], [w][h+1] + if(h > 0 && board[h-1][w].equals(color)) answer++; // 바로 위에 있는 색상 측정 + if(h < a-1 && board[h+1][w].equals(color)) answer++; // 바로 아래에 있는 색상 측정 + if(w > 0 && board[h][w-1].equals(color)) answer++; // 바로 왼쪽에 있는 색상 측정 + if(w < b-1 && board[h][w+1].equals(color)) answer++; // 바로 오른쪽에 있는 색상 측정 + + return answer; + } +} diff --git "a/week3/\352\271\200\353\210\204\353\246\254/programmers/\354\247\200\355\217\220_\354\240\221\352\270\260.java" "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\354\247\200\355\217\220_\354\240\221\352\270\260.java" new file mode 100644 index 0000000..a28a2f1 --- /dev/null +++ "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\354\247\200\355\217\220_\354\240\221\352\270\260.java" @@ -0,0 +1,43 @@ +package week3.김누리.programmers; + +/** + * PackageName : week3.김누리.programmers + * FileName : 지폐_접기 + * Author : 김누리(NRKim) + * Date : 2025-05-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 13. 김누리(NRKim) Initial creation + */ + +public class 지폐_접기 { + public int solution(int[] wallet, int[] bill) { + int answer = 0; + int bill_w = bill[0]; // 지폐의 가로 + int bill_h = bill[1]; // 지폐의 세로 + int wallet_w = wallet[0]; // 지갑의 가로 + int wallet_h = wallet[1]; // 지갑의 세로 + + while( + !( + // 지폐의 가로가 지갑의 가로 보다 작을 때 충족 && 지폐의 세로가 지갑의 세로 이하일때 충족 + (bill_w <= wallet_w && bill_h <= wallet_h) || + // 또는 지폐의 세로가 지갑의 가로 보다 작을 때 충족 && 지폐의 가로가 지갑의 세로 이하일때 충족 + (bill_h <= wallet_w && bill_w <= wallet_h) + ) + ) { + // 지폐의 가로가 세로보다 크면 가로를 반으로 접는다 + if(bill_w >= bill_h) { + bill_w = bill_w/2; + } else { + bill_h = bill_h/2; + } + + answer++; + } + + return answer; + } +} diff --git "a/week3/\352\271\200\353\210\204\353\246\254/programmers/\355\224\204\353\241\234\354\204\270\354\212\244.java" "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\355\224\204\353\241\234\354\204\270\354\212\244.java" new file mode 100644 index 0000000..502e6c8 --- /dev/null +++ "b/week3/\352\271\200\353\210\204\353\246\254/programmers/\355\224\204\353\241\234\354\204\270\354\212\244.java" @@ -0,0 +1,88 @@ +package week3.김누리.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week3.김누리.programmers + * FileName : 프로세스 + * Author : 김누리(NRKim) + * Date : 2025-05-14 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 14. 김누리(NRKim) Initial creation + */ + +/* +case 1 : +priorities [2,1,3,2], 위치 2가 입력 +숫자가 클 수록 우선순위도 높음 +위치가 2 idx = 2 +그럼 priorities[2]인 값이 언제 실행되냐? + +프로세스 실행은 아래와 같이 진행 +큐에서 프로세스를 poll >> 현재 poll 한 프로세스가 가장 우선순위가 큰가? >> 해당 프로세스 offer() 안함 : 해당 프로세스 offer() + +진행 +2,1,3,2 ==> poll() == 2, max치 아님 ==> 다시 offer() ==> 1,3,2,2 +1,3,2,2 ==> poll() == 1, max치 아님 ==> 다시 offer() ==> 3,2,2,1 +1,3,2,2 ==> poll() == 3, max치 ==> 다시 offer() 하지 않음 ==> 3,2,2,1 + +순번적으로 poll 하면서 answer++, 이 때 초창기에 priorities[2]인 3과 현재 다시 poll 한 값이 일치하면 answer값 리턴. + +case 2 : +priorities [1,1,9,1,1,1], 위치 0가 입력 +위치가 0 idx = 0 +그럼 priorities[0]인 값이 언제 실행되냐? + +프로세스 실행은 아래와 같이 진행 +큐에서 프로세스를 poll >> 현재 poll 한 프로세스가 가장 우선순위가 큰가? >> 해당 프로세스 offer() 안함 : 해당 프로세스 offer() + +진행 +1,1,9,1,1,1 ==> poll() == 1, max치 아님 ==> 다시 offer() ==> 1,9,1,1,1,1 +1,9,1,1,1,1 ==> poll() == 1, max치 아님 ==> 다시 offer() ==> 9,1,1,1,1,1 +9,1,1,1,1,1 ==> poll() == 9, max치 ==> 다시 offer() 하지 않음 ==> 9,1,1,1,1,1 + +순번적으로 poll 하면서 answer++, 이 때 초창기에 priorities[0]인 1과 현재 다시 poll 한 값이 일치하면 answer값 리턴. +*/ + +public class 프로세스 { + public int solution(int[] priorities, int location) { + int answer = 0; + int target = priorities[location]; + Queue prior = new LinkedList<>(); // 단지 Queue로만 하면 idx 값을 놓칠 수 있음 + + for(int i = 0 ; i < priorities.length; i++) { + prior.offer(new int[] {i,priorities[i]}); + } + + while(!prior.isEmpty()) { + int[] tmp = prior.poll(); // [0,2] + boolean max = false; // 지금 tmp에 있는 값의 우선순위가 가장 높나? + + for(int[] i : prior) { + // Queue에 남아있는 우선순위 판정 + if (i[1] > tmp[1]) { // [0,2] : [1,1],[2,3],[3,2] >> [0,1] : [1,3],[2,2],[3,2] >> [0,3] : [1,2],[2,2],[3,1] + max = true; // [0,3] 일 때 max + break; + } + } + + if(max) { + // 현재 tmp[1] 값이 max치가 아니므로 다시 큐에 offer() + prior.offer(tmp); + } else { + answer++; + + if(tmp[0] == location) { + return answer; + } + } + } + + // 실제 여기로 올 확률은 0%, 그러나 없으면 에러가 나기 때문에 남겨둔 return + return answer; + } +} diff --git "a/week3/\354\235\264\354\203\201\354\226\265/backjoon/\353\270\224\353\236\231\354\236\255.java" "b/week3/\354\235\264\354\203\201\354\226\265/backjoon/\353\270\224\353\236\231\354\236\255.java" new file mode 100644 index 0000000..70ea915 --- /dev/null +++ "b/week3/\354\235\264\354\203\201\354\226\265/backjoon/\353\270\224\353\236\231\354\236\255.java" @@ -0,0 +1,54 @@ +package week3.이상억.backjoon; +/** + * PackageName : week3.이상억.backjoon + * FileName : 블랙잭 + * Author : sangeok + * Date : 2025. 5. 14. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 14. sangeok Initial creation + */ + + +// 문제 요구사항 : 카드 개수 -> N , 넘지 않아야 하며 가장 가까이 만들어야 하는 숫자 -> M + +// 접근방법 : (1) 그냥 삼중 반복문 때려서 하면 될 거 같은데 + +// 회고 : 근데 삼중 반복문은 뭔가 좀 그렇다.. 효율적인 방법을 추가로 생각해야 할 것 같다. + +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()); + + int[] cardnumber = new int[N]; + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + cardnumber[i] = Integer.parseInt(st.nextToken()); + } + + int maxsum = 0; + for(int i = 0 ; i < N - 2; i++){ + for(int j = i+1; j < N - 1; j++){ + for(int k = j+1; k < N; k++){ + int sum = cardnumber[i] + cardnumber[j] + cardnumber[k]; + if(( sum <= M ) && ( sum > maxsum )){ + maxsum = sum; + } + } + } + } + + System.out.println(maxsum); + } +} \ No newline at end of file diff --git "a/week3/\354\235\264\354\203\201\354\226\265/backjoon/\353\270\224\353\241\234\352\267\270.java" "b/week3/\354\235\264\354\203\201\354\226\265/backjoon/\353\270\224\353\241\234\352\267\270.java" new file mode 100644 index 0000000..5a4d558 --- /dev/null +++ "b/week3/\354\235\264\354\203\201\354\226\265/backjoon/\353\270\224\353\241\234\352\267\270.java" @@ -0,0 +1,66 @@ +package week3.이상억.backjoon; +/** + * PackageName : week3.이상억.backjoon + * FileName : 블로그 + * Author : sangeok + * Date : 2025. 5. 14. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 14. sangeok Initial creation + */ + +// 문제 요구사항 : 첫째 줄 시작하고 지난 일수 N , 알고 싶은 일수 X +// 두번째 줄 1일차부터 N일차까지 하루 방문자 수 공백 구분 + +// 최대 방문자 수 0 => SAD 출력 +// 최대 방문자 수 0 아니면 => 최대 일수가 몇 번인 지 두번째 줄 출력 + +// 회고 : sum = sum - visits[i-X] + visits[i]; +// 이 로직을 생각하는데 뇌사가 와서 꽤 많은 고민을 했던 것 같다. +// 그리고 이 문제를 푸는데 있어서 뭔가 생각이 잘 정리 되지 않아. +// 보통 접근방식에 대한 생각을 하고 코딩을 하는데 이 문제는 그러한 부분이 잘 되지 않아 오래 걸렸던 것 같다. +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 X = Integer.parseInt(st.nextToken()); + + int[] visits = new int[N]; + st = new StringTokenizer(br.readLine()); + + for (int i = 0; i < N; i++) { + visits[i] = Integer.parseInt(st.nextToken()); + } + + int sum = 0; + int count = 1; + + for(int i = 0; i < X; i++){ + sum += visits[i]; + } + int maxvisit = sum; + + for(int i = X; i < N; i++){ + sum = sum - visits[i-X] + visits[i]; // [i-X] + [i]는 => 가장 왼쪽 값 지우고 오른쪽 값 더하기, 즉 한칸 옆으로 이동 + if(sum > maxvisit) { + maxvisit = sum; + count = 1; + } else if(sum == maxvisit) count ++; + } + + if (maxvisit == 0) { + System.out.println("SAD"); + } else { + System.out.println(maxvisit); + System.out.println(count); + } + } +} \ No newline at end of file diff --git "a/week3/\354\235\264\354\203\201\354\226\265/backjoon/\354\236\254\352\267\200\355\225\250\354\210\230\352\260\200_\353\255\224\352\260\200\354\232\224.java" "b/week3/\354\235\264\354\203\201\354\226\265/backjoon/\354\236\254\352\267\200\355\225\250\354\210\230\352\260\200_\353\255\224\352\260\200\354\232\224.java" new file mode 100644 index 0000000..afdbfc0 --- /dev/null +++ "b/week3/\354\235\264\354\203\201\354\226\265/backjoon/\354\236\254\352\267\200\355\225\250\354\210\230\352\260\200_\353\255\224\352\260\200\354\232\224.java" @@ -0,0 +1,64 @@ +package week3.이상억.backjoon; + +/** + * PackageName : week3.이상억.backjoon + * FileName : 재귀함수가_뭔가요 ? + * Author : sangeok + * Date : 2025. 5. 14. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 14. sangeok Initial creation + */ + +// 문제 요구사항 : 저 위의 문장을 반복 출력 +// 마지막에 재귀함수가 뭔지 말해줌 +// 나올 때 마다 ---- 붙여서 나옴 + + +// 접근 방법 : (1) 1) 반복되는 문장 출력 +// 2) 깊이 별로 ____ pattern 추가 +// 3) 깊이가 같을 때 재귀함수에 대한 답변 출력 +// 4) 마무리 하면서 "라고 하였지"라는 문장 출력 + +// 회고 : 간만에 풀어보는 재귀함수 문제라 얼 좀 탔던 것 같다. 특히 백준 문제를 풀 때 유독 심한거 같다. + + +import java.util.Scanner; + +public class Main { + static int n; + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + n = sc.nextInt(); + System.out.println("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다."); + Recursive(0); + } + + static void Recursive(int depth) { + String pattern = makeparttern(depth); + + System.out.println(pattern + "\"재귀함수가 뭔가요?\""); + + if (depth == n) { + System.out.println(pattern + "\"재귀함수는 자기 자신을 호출하는 함수라네\""); + } else { + System.out.println(pattern + "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어."); + System.out.println(pattern + "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지."); + System.out.println(pattern + "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\""); + + Recursive(depth + 1); + } + System.out.println(pattern + "라고 답변하였지."); + } + + static String makeparttern(int depth) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < depth; i++) { + sb.append("____"); + } + return sb.toString(); + } +} diff --git "a/week3/\354\235\264\354\203\201\354\226\265/progarmmers/k\353\262\210\354\247\270_\354\210\230.java" "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/k\353\262\210\354\247\270_\354\210\230.java" new file mode 100644 index 0000000..a750854 --- /dev/null +++ "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/k\353\262\210\354\247\270_\354\210\230.java" @@ -0,0 +1,49 @@ +package week3.이상억.progarmmers; + +/** + * PackageName : week3.이상억.progarmmers; + * FileName : k번째_수 + * Author : sangeok + * Date : 2025. 5. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 12. sangeok Initial creation + */ + +// 문제 요구사항 : +// i = a , j = b , k = 3 -> array a-b 까지 자름 => 자른 array의 [c]의 인덱스 + +// 접근 방식 : (1) +// 1) commands 배열을 순회하면서 각 명령어 [i, j, k]에 접근 +// 2) 주어진 i ~ j 구간을 array에서 잘라 ArrayList에 저장 +// 3) list를 정렬한 후 k번째 값을 answer[i]에 저장 + + +// 회고 : Arrays.copyOfRange() -> 쓰면 코드 더 간단 해짐 +// int[] newArray = Arrays.copyOfRange(originalArray, from, to); + +import java.util.*; + +class Solution { + public int[] solution(int[] array, int[][] commands) { + int[] answer = new int[commands.length]; + + // 배열 값 순회 + for (int i = 0; i < commands.length; i++) { + ArrayList list = new ArrayList<>(); + + // commands[i][0] - commands[i][1] 값으로 array 잘라 arraylist에 저장 + for (int j = commands[i][0] - 1; j <= commands[i][1] - 1; j++) { + list.add(array[j]); + } + + // list 정렬 후 k 번째 값 answer에 저장 + Collections.sort(list); + answer[i] = list.get(commands[i][2] - 1); + } + + return answer; + } +} diff --git "a/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\244\354\235\214_\355\201\260_\354\210\253\354\236\220.java" "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\244\354\235\214_\355\201\260_\354\210\253\354\236\220.java" new file mode 100644 index 0000000..4a1f65b --- /dev/null +++ "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\244\354\235\214_\355\201\260_\354\210\253\354\236\220.java" @@ -0,0 +1,54 @@ +package week3.이상억.progarmmers; + +/** + * PackageName : week3.이상억.progarmmers; + * FileName : 다음_큰_숫자 + * Author : sangeok + * Date : 2025. 5. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 12. sangeok Initial creation + */ + +// 문제 요구사항 : +// 1) n보다 큰 자연수여야 함 +// 2) 2진수에서 1의 개수가 n과 같아야 함 + +// 접근 방식 : (1) +// 1) n을 2진법으로 바꾸는 과정에 1의 갯수 세기 +// 2) 그 다음 숫자 증가 +// 3) 증가 시키는 숫자의 1의 갯수가 n 과 똑같으면 반환 + +// 회고 : Integer.bitCount(int n) +// 이 함수는 주어진 정수 n을 2진수로 변환한 뒤, 1의 개수를 반환 +class Solution { + public int solution(int n) { + int n_bit = 0; + int number = n; + + // n의 1의 갯수 세기 + while (number > 0) { + if (number % 2 == 1) n_bit++; + number /= 2; + } + // n 보다 큰 다음 숫자 + int next = n + 1; + + // n 다음 숫자 찾기 위한 반복문 + while (true) { + int next_bit = 0; + int t = next; + // n 보다 큰 다음 숫자 1의 갯수 구하기 + while (t > 0) { + if (t % 2 == 1) next_bit++; + t /= 2; + } + + if (next_bit == n_bit) return next; + + next++; + } + } +} diff --git "a/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\254\353\246\254\352\270\260_\352\262\275\354\243\274.java" "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\254\353\246\254\352\270\260_\352\262\275\354\243\274.java" new file mode 100644 index 0000000..42261c2 --- /dev/null +++ "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\353\213\254\353\246\254\352\270\260_\352\262\275\354\243\274.java" @@ -0,0 +1,51 @@ +package week3.이상억.progarmmers; + +/** + * PackageName : week3.이상억.progarmmers; + * FileName : 달리기_경주 + * Author : sangeok + * Date : 2025. 5. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 12. sangeok Initial creation + */ + + +// 문제 요구사항 : 이름이 한번 불리면 앞 사람 추월 + +// 접근 방식 : (1) +// 1) players의 value : index 저장 +// 2) callings 시 앞 players와 인덱스 변경 + +// 회고 : Hash 관련 메소드 아직 익숙하지 않음 + +import java.util.*; + +class Solution { + public String[] solution(String[] players, String[] callings) { + + Map players_list = new HashMap<>(); + + // 등록 + for (int i = 0; i < players.length; i++) { + players_list.put(players[i], i); + } + + // 불린 플레이어와 그 앞 플레이어 이름 및 등수 교환 + for(String calledplayers : callings){ + int current_rank = players_list.get(calledplayers); + + String front_players = players[current_rank-1]; + players[current_rank-1] = calledplayers; + players[current_rank] = front_players; + + players_list.put(calledplayers,current_rank -1); + players_list.put(front_players,current_rank); + + } + return players; + } +} + diff --git "a/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\353\251\200\353\246\254_\353\233\260\352\270\260.java" "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\353\251\200\353\246\254_\353\233\260\352\270\260.java" new file mode 100644 index 0000000..500cd70 --- /dev/null +++ "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\353\251\200\353\246\254_\353\233\260\352\270\260.java" @@ -0,0 +1,32 @@ +package week3.이상억.progarmmers; + +/** + * PackageName : week3.이상억.progarmmers; + * FileName : 멀리_뛰기 + * Author : sangeok + * Date : 2025. 5. 15. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 15. sangeok Initial creation + */ + + + +class Solution { + public long solution(int n) { + if (n == 1) return 1; + if (n == 2) return 2; + + long[] a = new long[n]; + a[0] = 1; + a[1] = 2; + + for (int i = 2; i < n; i++) { + a[i] = (a[i - 1] + a[i - 2]) % 1234567; + } + + return a[n - 1]; + } +} diff --git "a/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\233\203\355\225\234_\354\271\270.java" "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\233\203\355\225\234_\354\271\270.java" new file mode 100644 index 0000000..93dd1bb --- /dev/null +++ "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\233\203\355\225\234_\354\271\270.java" @@ -0,0 +1,39 @@ +package week3.이상억.progarmmers; + +/** + * PackageName : week3.이상억.progarmmers; + * FileName : 이웃한_칸 + * Author : sangeok + * Date : 2025. 5. 13. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 13. sangeok Initial creation + */ + +// 문제 요구사항 ) 위치 [i][j] 가 주어졌을 때 [i-1][j] / [i+1][j] => h / [i][j-1] / [i][j+1] => w 을 구함 + +// 접근 방식 : (1) +// 1) 주어진 h, w 인덱스에 -1/ +1 비교 +// 2) 배열에 주어진 범위를 넘지 않게 조건문 추가 후 같을 시 answer ++ + +// 회고 : 처음에 h > 0 부분에서만 범위를 넘지 않게만 조건문을 추가했어서 런타임 에러 났었음 +// 추후 h / w < row - 1 , col -1 부분도 추가해서 해결 +// 문제가 어렵게 생겨서 쫄았었는데 막상 읽어보니 별거 없었음 + + +class Solution { + public int solution(String[][] board, int h, int w) { + int answer = 0; + int row = board.length; + int col = board[0].length; + + if (h > 0 && board[h - 1][w].equals(board[h][w])) answer++; + if (h < row - 1 && board[h + 1][w].equals(board[h][w])) answer++; + if (w > 0 && board[h][w - 1].equals(board[h][w])) answer++; + if (w < col - 1 && board[h][w + 1].equals(board[h][w])) answer++; + + return answer; + } +} diff --git "a/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\200\355\217\220_\354\240\221\352\270\260.java" "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\200\355\217\220_\354\240\221\352\270\260.java" new file mode 100644 index 0000000..9d5e16d --- /dev/null +++ "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\200\355\217\220_\354\240\221\352\270\260.java" @@ -0,0 +1,77 @@ +package week3.이상억.progarmmers; + +/** + * PackageName : week3.이상억.progarmmers; + * FileName : 지폐_접기 + * Author : sangeok + * Date : 2025. 5. 13. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 13. sangeok Initial creation + */ + +// 문제 요구사항 ) 긴 쪽으로 반 접음 +// 길이가 홀 수 였다면 소수점 버림 +// 접힌 지폐가 그대로 90 도 돌려서 넣을 수 있음 그만 접음 + +// 접근 방식 : (1) 지폐가 담길 때 까지 반복문 +// 크기 비교 후 큰쪽이 왼쪽 작은 쪽이 오른쪽 +// 안담기면 왼쪽 / 2 + +// 회고 : 무식하게 값 변경하지 말고 Math.min / Math.max 사용하기 +// 처음보자마자 그 2주차에 했던 최소직사각형 문제 생각났음 + +class Solution { + public int solution(int[] wallet, int[] bill) { + int answer = 0; + int tmp = 0; + + // 큰값 왼쪽으로 변경 + if(wallet[0] < wallet[1]){ + tmp = wallet[0]; + wallet[0] = wallet[1]; + wallet[1] = tmp; + } + + while(true){ + if(bill[0] < bill[1]){ + tmp = bill[0]; + bill[0] = bill[1]; + bill[1] = tmp; + } + if( wallet[0] >= bill[0] && wallet[1] >= bill[1]){ + return answer; + } + + bill[0] = bill[0]/2; + answer ++; + } + } +} + +// Math max/min 함수 사용 해봄 => 익숙하지 않아서 자꾸 생각이 안나고 안사용하는 거 같아 사용함 +//class Solution { +// public int solution(int[] wallet, int[] bill) { +// int answer = 0; +// +// int wmax = Math.max(wallet[0],wallet[1]); +// int wmin = Math.min(wallet[0],wallet[1]); +// +// while(true){ +// int bmax = Math.max(bill[0],bill[1]); +// int bmin = Math.min(bill[0],bill[1]); +// +// if(bmax <= wmax && bmin <= wmin) return answer; +// +// if (bill[0] >= bill[1]) { +// bill[0] /= 2; +// } else { +// bill[1] /= 2; +// } +// answer ++; +// +// } +// } +//} \ No newline at end of file diff --git "a/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\355\224\204\353\241\234\354\204\270\354\212\244.java" "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\355\224\204\353\241\234\354\204\270\354\212\244.java" new file mode 100644 index 0000000..9be61b7 --- /dev/null +++ "b/week3/\354\235\264\354\203\201\354\226\265/progarmmers/\355\224\204\353\241\234\354\204\270\354\212\244.java" @@ -0,0 +1,44 @@ +package week3.이상억.progarmmers; + +/** + * PackageName : week3.이상억.progarmmers; + * FileName : 프로세스 + * Author : sangeok + * Date : 2025. 5. 15. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 15. sangeok Initial creation + */ + + +import java.util.*; + +class Solution { + public int solution(int[] priorities, int location) { + int answer = 0; + + Queue queue = new LinkedList<>(); + + PriorityQueue pq = new PriorityQueue<>(Collections.reverseOrder()); + + for (int i = 0; i < priorities.length; i++) { + queue.add(new int[]{i, priorities[i]}); // 인덱스, 우선순위 + pq.add(priorities[i]); + } + + while(!pq.isEmpty()){ + int[] current = queue.poll(); + + // 가장 큰 우선 순위면 꺼냄 + if(current[1] == pq.peek()){ + pq.poll(); + answer ++; + if(current[0] == location) break; + } else queue.add(current); + + } + return answer; + } +} \ No newline at end of file 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/week4/\352\260\225\354\204\261\354\232\261/programmers/_2xn\355\203\200\354\235\274\353\247\201.java" "b/week4/\352\260\225\354\204\261\354\232\261/programmers/_2xn\355\203\200\354\235\274\353\247\201.java" new file mode 100644 index 0000000..907c848 --- /dev/null +++ "b/week4/\352\260\225\354\204\261\354\232\261/programmers/_2xn\355\203\200\354\235\274\353\247\201.java" @@ -0,0 +1,29 @@ +package week4.강성욱.programmers; + +public class _2xn타일링 { + //전형적인 dp 문제 + //n = 1, 1 (세로) + //n = 2, 1 (세로, 세로) + //n = 3, 2 (가로x2, 세로), (세로, 가로x2) + //n = 4, 4 + //이거 사실 피보나치임 + class Solution { + private static final int DIV = 1_000_000_007; + + public int solution(int n) { + int[] dp = new int[n+1]; + dp[0] = 0; + dp[1] = 1; if(n == 1) return 1; + dp[2] = 2; if(n == 2) return 2; + dp[3] = 3; if(n == 3) return 3; + dp[4] = 5; if(n == 4) return 5; + dp[5] = 8; if(n == 5) return 8; + + for(int i=6; i<=n; i++) { + dp[i] = (dp[i-2] + dp[i-1]) % DIV; + } + + return dp[n]; + } + } +} diff --git "a/week4/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\355\201\260_\354\210\230.java" "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\355\201\260_\354\210\230.java" new file mode 100644 index 0000000..9d466de --- /dev/null +++ "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\355\201\260_\354\210\230.java" @@ -0,0 +1,39 @@ +package week4.강성욱.programmers; + +import java.util.*; + +public class 가장_큰_수 { + //순열을 만들면? + //O(n!) 인데, 너무 큼 + //음 + //가장 큰 수만 구하면 되는거 + //맨앞에 오는게, 가장 큰수이면 됨. + //근데, 11 과 12를 어떻게 구별할것인가? 111, 114 이런것도. + + //해결되지 않아서 검색으로 해결함. + // [30, 3] 의 우선순위는, 3 부터 나와야함. + // 정렬 조건을, [a, b] 일 때, 303 vs 330 으로 정렬을 해서 결정 + // 다음으로 하나씩 builder 로 붙이면 됨. + + class Solution { + public String solution(int[] numbers) { + // 1. 문자열 배열로 변환 + String[] strs = new String[numbers.length]; + for (int i = 0; i < numbers.length; i++) { + strs[i] = String.valueOf(numbers[i]); + } + + // 2. 정렬: (b + a)가 큰 순서로 + Arrays.sort(strs, (a, b) -> (b + a).compareTo(a + b)); + + // 3. "0000..." 예외 처리 + if (strs[0].equals("0")) return "0"; + + // 4. 결과 이어붙이기 + StringBuilder sb = new StringBuilder(); + for (String s : strs) sb.append(s); + + return sb.toString(); + } + } +} diff --git "a/week4/\352\260\225\354\204\261\354\232\261/programmers/\352\263\274\354\235\274\354\236\245\354\210\230.java" "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\352\263\274\354\235\274\354\236\245\354\210\230.java" new file mode 100644 index 0000000..b266b50 --- /dev/null +++ "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\352\263\274\354\235\274\354\236\245\354\210\230.java" @@ -0,0 +1,29 @@ +package week4.강성욱.programmers; + +import java.util.*; + +public class 과일장수 { + //정렬 때려서 가장 큰순서대로 묶으면 되는거 아닌가? + + class Solution { + public int solution(int k, int m, int[] score) { + List list = new ArrayList<>(); + for (int s : score) { + list.add(s); + } + + list.sort((a, b) -> b - a); // 내림차순 + + int total = 0; + int boxCount = list.size() / m; + + for (int i = 0; i < boxCount; i++) { + int startIdx = i * m; + int minScore = list.get(startIdx + m - 1); + total += minScore * m; + } + + return total; + } + } +} diff --git "a/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\206\214\354\210\230\354\260\276\352\270\260.java" "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\206\214\354\210\230\354\260\276\352\270\260.java" new file mode 100644 index 0000000..5df1183 --- /dev/null +++ "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\206\214\354\210\230\354\260\276\352\270\260.java" @@ -0,0 +1,58 @@ +package week4.강성욱.programmers; + +import java.util.*; +public class 소수찾기 { + //소수인지 아닌지 판별이 필요. + //미리, 소수를 구해놓고, 배열로 check[1] = true 이면 소수 이런식으로 해두면 빨리 찾을 수 있을듯. + //그럼 소수 찾는 범위는? + //numbers 가 7개까지 들어올 수 있음. 중복? 999 도 들어올 수 있음. + //그럼 최대 9,999,999 까지 확인을 미리 해놔야 한다. 라는 점? + + class Solution { + private static final int MAX = 9_999_999; + private static final boolean[] isPrime = getPrimeTable(); + private Set numberSet = new HashSet<>(); + + public int solution(String numbers) { + boolean[] visited = new boolean[numbers.length()]; + dfs("", numbers, visited); + + int count = 0; + for (int num : numberSet) { + if (isPrime[num]) count++; + } + return count; + } + + private void dfs(String current, String numbers, boolean[] visited) { + if (!current.isEmpty()) { + numberSet.add(Integer.parseInt(current)); + } + + for (int i = 0; i < numbers.length(); i++) { + if (!visited[i]) { + visited[i] = true; + dfs(current + numbers.charAt(i), numbers, visited); + visited[i] = false; + } + } + } + + // 소수 미리 구하기 + private static boolean[] getPrimeTable() { + boolean[] prime = new boolean[MAX + 1]; + Arrays.fill(prime, true); + prime[0] = prime[1] = false; + + for (int i = 2; i * i <= MAX; i++) { + if (prime[i]) { + for (int j = i * i; j <= MAX; j += i) { + prime[j] = false; + } + } + } + + return prime; + } + } +} diff --git "a/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220\354\235\230_\355\221\234\355\230\204.java" "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220\354\235\230_\355\221\234\355\230\204.java" new file mode 100644 index 0000000..97b0cb0 --- /dev/null +++ "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\210\253\354\236\220\354\235\230_\355\221\234\355\230\204.java" @@ -0,0 +1,32 @@ +package week4.강성욱.programmers; + +public class 숫자의_표현 { + //수학적 규칙..? 그건 모르겠음 + //그냥 단순히 1부터 쭈르륵 한다고 치면? + //10,000 일경우, 아무리 최악이라도 O^2 그 이하. + //중간에 절반 이상은 볼필요도 없음. + // ? + ? = 100 일때, 절반인 50 이후로는 절때 100이 나올수가 없음. + // 즉, n이 15면, 50까지만 반복 돌아도 되어서, ^2 보다는 훨신 적을것 + //그럼 100_000_000 1억이면, 해볼만 하긴 함. (이것도 최악의 조건 일경우) + class Solution { + public int solution(int n) { + + int count=1; //자기 자신 경우는 무조건 1개는 있음. + int target=n; + int end = (int) Math.ceil(target/2); + + for(int start=1; start <= end; start++) { + int sum = 0; + int next = start; + while(sum < target) { + sum += next; + next++; + } + + if(sum == target) count++; + } + + return count; + } + } +} diff --git "a/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..707d12f --- /dev/null +++ "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" @@ -0,0 +1,40 @@ +package week4.강성욱.programmers; + +import java.util.*; + +public class 짝지어_제거하기 { + //문자 출현 개수로 파악? + //a 2개, b 1개 면 짝짓기 실패 + //근데, 이경우, abab 도 짝짓기 성공이 됨. 결국 케이스를 확인해야됨. + //----------- + //한번에 빡 모든 문자열을 다 집어넣고, 모든 index 에 대해 앞뒤로 검사를 한다면 + //1,000,000 ^ 2 니깐, 너무 시간 복잡도 감당이 안됨. + //그냥 1,000,000 개를 하나씩 받아서 stack 처럼 pop 시키면 될듯? + //step1) a + //a + //step2) b + //ab + //step3) a + //aba + //step4) a + //ab + //step5) b + //a + //즉, 한번에 터지지 말고, 애니팡처럼 들어온 순서대로 터지게 하자. + + class Solution { + public int solution(String s) { + Deque stack = new ArrayDeque<>(); + + for (char c : s.toCharArray()) { + if (!stack.isEmpty() && stack.peekLast() == c) { + stack.pollLast(); + } else { + stack.addLast(c); + } + } + + return stack.isEmpty() ? 1 : 0; + } + } +} diff --git "a/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\262\264\354\234\241\353\263\265.java" "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\262\264\354\234\241\353\263\265.java" new file mode 100644 index 0000000..6813625 --- /dev/null +++ "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\354\262\264\354\234\241\353\263\265.java" @@ -0,0 +1,57 @@ +package week4.강성욱.programmers; + +import java.util.*; +public class 체육복 { + //기본 배열에서, lost 기반으로 true false, 배열을 관리 + //true 는 있음, false 는 없음. + //reserve 배열을 돌며 확인. + //reserve 는 정렬되서 들어온다는 말이 없으니, 정렬 먼저 처리. 오름차순으로 그냥 하자. + //EX) 1, 3, 5... + //그럼 확인을 하는데, 앞에서->뒤로 하기때문에, 앞, 뒤 확인 빌려줄 수 있는지 확인. + //만약 빌려 줄 수 있다면, 배열 true 처리 + //30명이 최대라, 시간복잡도는 어떻게 해도 2중for를 돌려도, 안전빵이니 그냥 구현하자. + + class Solution { + public int solution(int n, int[] lost, int[] reserve) { + boolean[] student = new boolean[n + 1]; // 1~n + Arrays.fill(student, true); + + Set lostSet = new HashSet<>(); + Set reserveSet = new HashSet<>(); + + for (int l : lost) { + lostSet.add(l); + } + + for (int r : reserve) { + // 여벌 있는데 도난도 당한 경우 → 자기만 입을 수 있음 + if (lostSet.contains(r)) { + lostSet.remove(r); // 둘 다에서 제거 + } else { + reserveSet.add(r); + } + } + + // 도난만 당한 학생들 false 처리 + for (int l : lostSet) { + student[l] = false; + } + + // 여벌만 있는 애들이 빌려줌 + for (int r : reserveSet) { + if (r > 1 && !student[r - 1]) { + student[r - 1] = true; + } else if (r < n && !student[r + 1]) { + student[r + 1] = true; + } + } + + int count = 0; + for (int i = 1; i <= n; i++) { + if (student[i]) count++; + } + + return count; + } + } +} diff --git "a/week4/\352\260\225\354\204\261\354\232\261/programmers/\355\205\214\354\235\264\355\204\260_\353\266\204\354\204\235.java" "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\355\205\214\354\235\264\355\204\260_\353\266\204\354\204\235.java" new file mode 100644 index 0000000..339f82e --- /dev/null +++ "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\355\205\214\354\235\264\355\204\260_\353\266\204\354\204\235.java" @@ -0,0 +1,47 @@ +package week4.강성욱.programmers; + +import java.util.*; + +public class 테이터_분석 { + class Solution { + private static final Map FILTER_MAP = Map.of( + "code", 0, + "date", 1, + "maximum", 2, + "remain", 3 + ); + + public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) { + List dataList = new ArrayList<>(Arrays.asList(data)); + List filtered = filterData(dataList, ext, val_ext); + sortData(filtered, sort_by); + return listToArray(filtered); + } + + private List filterData(List data, String ext, int val_ext) { + int index = FILTER_MAP.get(ext); + List result = new ArrayList<>(); + + for (int[] row : data) { + if (row[index] < val_ext) { + result.add(row); + } + } + + return result; + } + + private void sortData(List data, String sortBy) { + int index = FILTER_MAP.get(sortBy); + data.sort(Comparator.comparingInt(a -> a[index])); + } + + private int[][] listToArray(List list) { + int[][] result = new int[list.size()][]; + for (int i = 0; i < list.size(); i++) { + result[i] = list.get(i); + } + return result; + } + } +} diff --git "a/week4/\352\260\225\354\204\261\354\232\261/programmers/\355\217\260\354\274\223\353\252\254.java" "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\355\217\260\354\274\223\353\252\254.java" new file mode 100644 index 0000000..72c568a --- /dev/null +++ "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\355\217\260\354\274\223\353\252\254.java" @@ -0,0 +1,23 @@ +package week4.강성욱.programmers; + +public class 폰켓몬 { + //핵심은, 최대 N/2 마리가 정답임 + //가장 중복없이 많이 가져가는게 문제임 + //그럼 + class Solution { + public int solution(int[] nums) { + boolean[] visited = new boolean[200001]; + int count = 0; + + for (int num : nums) { + if (!visited[num]) { + visited[num] = true; + count++; + } + } + + int max = nums.length / 2; + return max > count ? count : max; + } + } +} diff --git "a/week4/\352\260\225\354\204\261\354\232\261/programmers/\355\224\274\353\263\264\353\202\230\354\271\230\354\210\230.java" "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\355\224\274\353\263\264\353\202\230\354\271\230\354\210\230.java" new file mode 100644 index 0000000..a5b4a5a --- /dev/null +++ "b/week4/\352\260\225\354\204\261\354\232\261/programmers/\355\224\274\353\263\264\353\202\230\354\271\230\354\210\230.java" @@ -0,0 +1,24 @@ +package week4.강성욱.programmers; + +public class 피보나치수 { + //피보나치 계산 + //DP 문제 + class Solution { + private static final int DIV = 1_234_567; + public int solution(int n) { + int[] dp = new int[n+1]; + dp[0] = 0; + dp[1] = 1; if(n == 1) return 1; + dp[2] = 1; if(n == 2) return 1; + dp[3] = 2; if(n == 3) return 2; + dp[4] = 3; if(n == 4) return 3; + dp[5] = 5; if(n == 5) return 5; + + for(int i=6; i<=n; i++) { + dp[i] = (dp[i-2] + dp[i-1]) % DIV; + } + + return dp[n]; + } + } +} diff --git "a/week4/\352\271\200\353\202\230\354\235\200/programmers/\352\260\200\354\236\245 \355\201\260 \354\210\230.java" "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\352\260\200\354\236\245 \355\201\260 \354\210\230.java" new file mode 100644 index 0000000..5889370 --- /dev/null +++ "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\352\260\200\354\236\245 \355\201\260 \354\210\230.java" @@ -0,0 +1,35 @@ +package week4.김나은.programmers; + +import java.util.*; + +class Solution { + public String solution(int[] numbers) { + String answer = ""; + + String[] number = new String[numbers.length]; + + // 문자열 배열로 변환 + for(int i = 0; i < numbers.length; i++) { + number[i] = String.valueOf(numbers[i]); + } + + // 내림차순 정렬 + Arrays.sort(number, new Comparator() { + public int compare(String a, String b) { + return (b + a).compareTo(a + b); + } + }); + + // 배열에 0 만 있는 경우(정렬배열 맨처음이 0) "0" 리턴 + if(number[0].equals("0")) { + return "0"; + } + + // 문자열 합치기 + for(String n : number) { + answer += n; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week4/\352\271\200\353\202\230\354\235\200/programmers/\352\263\274\354\235\274 \354\236\245\354\210\230.java" "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\352\263\274\354\235\274 \354\236\245\354\210\230.java" new file mode 100644 index 0000000..7003528 --- /dev/null +++ "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\352\263\274\354\235\274 \354\236\245\354\210\230.java" @@ -0,0 +1,23 @@ +package week4.김나은.programmers; + +import java.util.*; + +class Solution { + public int solution(int k, int m, int[] score) { + int answer = 0; // 최종 수익을 저장할 변수 + + // 점수 배열을 오름차순 정렬 + // 가장 비싼 가격을 받으려면 높은 점수끼리 묶어야 하므로, 정렬 후 뒤에서부터 묶음 처리 + Arrays.sort(score); + + // 가장 높은 점수부터 m개씩 묶어서 판매 + // score.length - m: 마지막으로 m개를 정확히 묶을 수 있는 시작 인덱스 + // i -= m: m개씩 뒤로 이동하면서 그룹 처리 + for(int i = score.length - m; i >= 0; i -= m) { + // 묶은 그룹 중 가장 낮은 점수(score[i]) * 사과 개수(m) = 해당 묶음의 가격 + answer += score[i] * m; + } + + return answer; // 총 수익 반환 + } +} \ No newline at end of file diff --git "a/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\206\214\354\210\230 \354\260\276\352\270\260.java" "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\206\214\354\210\230 \354\260\276\352\270\260.java" new file mode 100644 index 0000000..8658872 --- /dev/null +++ "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\206\214\354\210\230 \354\260\276\352\270\260.java" @@ -0,0 +1,52 @@ +package week4.김나은.programmers; + +import java.util.*; + +class Solution { + // 조합된 숫자의 중복을 피하기 위해 Set으로 구현 + HashSet numbersSet = new HashSet<>(); + + public int solution(String numbers) { + // DFS를 통해 가능한 모든 숫자 조합을 생성 + dfs("", numbers); + + int count = 0; + + // 생성된 숫자 조합 중 소수인 숫자의 개수를 셈 + Iterator it = numbersSet.iterator(); + + while (it.hasNext()) { + int number = it.next(); + if (isPrime(number)) // 소수인지 확인 + count++; + } + return count; + } + + // 소수 판별 메서드 + public boolean isPrime(int num) { + if (num == 0 || num == 1) + return false; // 0과 1은 소수가 아님 + + int lim = (int)Math.sqrt(num); // √num까지만 검사하면 됨 + + for (int i = 2; i <= lim; i++) + if (num % i == 0) // 나누어떨어지면 소수가 아님 + return false; + + return true; // 위 조건을 모두 통과하면 소수 + } + + // DFS를 사용하여 모든 가능한 숫자 조합 생성 + public void dfs(String str, String numbers) { + // 비어있지 않은 문자열이면 숫자로 변환 후 Set에 저장 + if (!str.equals("")) + numbersSet.add(Integer.valueOf(str)); + + // 남은 숫자들로 재귀 호출하여 모든 순열을 생성 + for (int i = 0; i < numbers.length(); i++) + // 현재 문자를 str에 추가하고, 해당 문자를 제외한 나머지로 dfs 재귀 호출 + dfs(str + numbers.charAt(i), numbers.substring(0, i) + numbers.substring(i + 1)); + + } +} \ No newline at end of file diff --git "a/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220\354\235\230 \355\221\234\355\230\204.java" "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220\354\235\230 \355\221\234\355\230\204.java" new file mode 100644 index 0000000..6095db4 --- /dev/null +++ "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220\354\235\230 \355\221\234\355\230\204.java" @@ -0,0 +1,15 @@ +package week4.김나은.programmers; + +// 정수론 정리 : 자연수 n을 연속된 자연수의 합으로 표현하는 방법의 수 = n의 홀수 약수의 개수 + +class Solution { + public int solution(int n) { + int answer = 0; + + for(int i = 1; i <= n; i+=2){ + if(n % i == 0) answer++; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\247\235\354\247\200\354\226\264 \354\240\234\352\261\260\355\225\230\352\270\260.java" "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\247\235\354\247\200\354\226\264 \354\240\234\352\261\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..e3faec1 --- /dev/null +++ "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\247\235\354\247\200\354\226\264 \354\240\234\352\261\260\355\225\230\352\270\260.java" @@ -0,0 +1,28 @@ +package week4.김나은.programmers; + +import java.util.*; + +class Solution { + public int solution(String s) { + // 문자 짝을 판별하기 위한 스택 생성 + Stack stack = new Stack<>(); + + // 입력 문자열 s를 문자 배열로 변환 후 한 글자씩 순회 + for(char c : s.toCharArray()) { + + // 스택이 비어있지 않고, 현재 문자가 스택의 top(가장 위) 문자와 같으면 + if(stack.size() > 0 && stack.peek() == c) { + + stack.pop(); // 같은 문자가 연속된 것이므로 쌍으로 제거 (pop) + + } else { + + stack.push(c); // 아니면 스택에 현재 문자 추가 + + } + } + + // 스택이 비어있으면 모든 문자가 짝지어 제거된 상태 + return stack.isEmpty() ? 1 : 0; + } +} \ No newline at end of file diff --git "a/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\262\264\354\234\241\353\263\265.java" "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\262\264\354\234\241\353\263\265.java" new file mode 100644 index 0000000..179e8ba --- /dev/null +++ "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\354\262\264\354\234\241\353\263\265.java" @@ -0,0 +1,44 @@ +package week4.김나은.programmers; + +import java.util.Arrays; + +public class Solution { + public int solution(int n, int[] lost, int[] reserve) { + // 기본적으로 체육복을 잃어버린 학생 수만큼 전체 학생 수에서 빼서 시작 + int answer = n - lost.length; + + // 체육복을 잃어버린 학생들과 여벌이 있는 학생들을 정렬 (순서대로 비교하기 위해) + Arrays.sort(lost); + Arrays.sort(reserve); + + // 1단계: 여벌 체육복이 있지만 본인이 도난당한 경우 처리 + // 이 경우 자기 체육복을 자기가 입는 거기 때문에 빌려줄 수 없음 + for(int i = 0; i < lost.length; i++) { + for(int j = 0; j < reserve.length; j++) { + if(lost[i] == reserve[j]) { + // 본인이 잃어버렸지만 여벌도 가진 경우 + answer++; // 체육수업 참여 가능하므로 +1 + lost[i] = -1; // 더 이상 도난당한 학생 아님 처리 (비교에서 제외) + reserve[j] = -1; // 여벌도 없어진 것으로 처리 (비교에서 제외) + break; // 더 이상 비교할 필요 없으므로 종료 + } + } + } + + // 2단계: 남은 lost 배열에 대해 여벌 체육복이 있는 학생이 앞뒤 번호면 빌려주는 로직 + for(int i = 0; i < lost.length; i++) { + if(lost[i] == -1) continue; // 이미 해결된 학생은 건너뜀 + for(int j = 0; j < reserve.length; j++) { + if(reserve[j] == -1) continue; // 이미 여벌 사용한 경우 건너뜀 + // 자기 앞번호 또는 뒷번호인 학생에게만 빌릴 수 있음 + if((lost[i]-1 == reserve[j]) || (lost[i]+1 == reserve[j])) { + answer++; // 체육수업 참여 가능하므로 +1 + reserve[j] = -1; // 해당 여벌 사용 처리 + break; // 현재 lost 학생은 해결됐으므로 종료 + } + } + } + + return answer; // 최종적으로 체육수업에 참여 가능한 학생 수 반환 + } +} \ No newline at end of file diff --git "a/week4/\352\271\200\353\202\230\354\235\200/programmers/\355\217\260\354\274\223\353\252\254.java" "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\355\217\260\354\274\223\353\252\254.java" new file mode 100644 index 0000000..6e3fcc9 --- /dev/null +++ "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\355\217\260\354\274\223\353\252\254.java" @@ -0,0 +1,30 @@ +package week4.김나은.programmers; + +import java.util.*; + +class Solution { + public int solution(int[] nums) { + + // 고를 수 있는 포켓몬 수는 전체의 절반 + int num = nums.length / 2; + + // Set을 사용해서 중복 제거된 포켓몬 번호를 저장 + Set hs = new HashSet(); + + // nums 배열을 순회하면서 HashSet에 넣기 → 중복 자동 제거됨 + for (int i = 0; i < nums.length; i++) { + hs.add(nums[i]); + } + + // 중복 제거된 포켓몬 종류 수 + int pokemon_nums = hs.size(); + + // 포켓몬 종류 수가 절반보다 적거나 같으면 전부 고를 수 있음 + // 포켓몬 종류 수가 절반보다 많으면 절반만큼만 골라야 함 + if (pokemon_nums <= num) { + return pokemon_nums; // 가능한 모든 종류 반환 + } else { + return num; // 절반만큼만 반환 + } + } +} \ No newline at end of file diff --git "a/week4/\352\271\200\353\202\230\354\235\200/programmers/\355\224\274\353\263\264\353\202\230\354\271\230 \354\210\230.java" "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\355\224\274\353\263\264\353\202\230\354\271\230 \354\210\230.java" new file mode 100644 index 0000000..acfaca0 --- /dev/null +++ "b/week4/\352\271\200\353\202\230\354\235\200/programmers/\355\224\274\353\263\264\353\202\230\354\271\230 \354\210\230.java" @@ -0,0 +1,20 @@ +package week4.김나은.programmers; + +class Solution { + public int solution(int n) { + // 피보나치수열 수식에서 사용할 배열을 선언해준다. + // 배열 선언 시 길이는 마지막 n번째 수를 1234567로 나눈 값을 return 해줘야 하므로 n + 1로 정한다. + int[] answer = new int[n + 1]; + + answer[0] = 0; + answer[1] = 1; + + // 반복문을 통해 F(n) = F(n-1) + F(n-2) 수식이 만족되도록 더해준다. + for(int i = 2; i <= n; i++) { + answer[i] = (answer[i - 1] + answer[i - 2]) % 1234567; + } + + // 2이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567로 나눈 값을 return 해준다. + return answer[n] % 1234567; + } +} \ No newline at end of file diff --git "a/week4/\352\271\200\353\210\204\353\246\254/programmers/n_X_2_\355\203\200\354\235\274\353\247\201.java" "b/week4/\352\271\200\353\210\204\353\246\254/programmers/n_X_2_\355\203\200\354\235\274\353\247\201.java" new file mode 100644 index 0000000..5bf6981 --- /dev/null +++ "b/week4/\352\271\200\353\210\204\353\246\254/programmers/n_X_2_\355\203\200\354\235\274\353\247\201.java" @@ -0,0 +1,76 @@ +package week4.김누리.programmers; + +/** + * PackageName : week4.김누리.programmers + * FileName : n_X_2_타일링 + * Author : 김누리(NRKim) + * Date : 2025-05-21 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 21. 김누리(NRKim) Initial creation + */ + +/* + n : 우리가 채워야 하는 타일의 가로 길이 + + 우리가 쓸수 있는 타일의 가로는 2, 세로는 1 + 이하 가로는 w =2, 세로는 h =1 + + if n = 1 인 경우 가능한 조합 + h + 1개의 조합 + + if n = 2 인 경우 + hh + w + 2개의 조합 + + if n = 3 인 경우 + hhh + hw + wh + 3개의 조합 + + if n = 4 인 경우 + hhhh + hhw + hwh + whh + ww + 5개의 조합 + + if n = 5인 경우 + hhhhh + hhhw + hhwh + hwhh + whhh + wwh + whw + hww + 8개의 조합 + + 피보나치 수열로 풀면 OK +*/ + +public class n_X_2_타일링 { + public int solution(int n) { + int answer = 0; + int x = 1000000007; + int a = 1; // n == 1 일때 결과 값 + int b = 2; // n == 2 일때 결과 값 + + if(n == 1) answer = a%x; + if(n == 2) answer = b%x; + + for(int i = 3; i <= n; i++) { + answer = (a+b) % x; + a = b; + b = answer; + } + + return answer; + } +} diff --git "a/week4/\352\271\200\353\210\204\353\246\254/programmers/\352\260\200\354\236\245_\355\201\260_\354\210\230.java" "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\352\260\200\354\236\245_\355\201\260_\354\210\230.java" new file mode 100644 index 0000000..f07f6ad --- /dev/null +++ "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\352\260\200\354\236\245_\355\201\260_\354\210\230.java" @@ -0,0 +1,45 @@ +package week4.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week4.김누리.programmers + * FileName : 가장_큰_수 + * Author : 김누리(NRKim) + * Date : 2025-05-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 19. 김누리(NRKim) Initial creation + */ + +public class 가장_큰_수 { + public String solution(int[] numbers) { + String answer = ""; + StringBuilder sb = new StringBuilder(); + String[] arr = new String[numbers.length]; + + // numbers 테이블을 복사하여 String 배열화 + for(int i = 0; i < numbers.length; i++) { + arr[i] = String.valueOf(numbers[i]); + } + + // 배열을 커스텀 하며 정렬 + Arrays.sort(arr,(s1,s2) -> (s2+s1).compareTo(s1+s2)); + + // 정렬된 배열순번대로 문자열 조합 + for(String s : arr) { + sb.append(s); + } + + // 조합한 문자열이 00 혹은 000등 0으로만 조합된 경우는 0 리턴 + if(sb.charAt(0) == '0') { + answer = "0"; + } else { + answer = sb.toString(); + } + + return answer; + } +} diff --git "a/week4/\352\271\200\353\210\204\353\246\254/programmers/\352\263\274\354\235\274_\354\236\245\354\210\230.java" "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\352\263\274\354\235\274_\354\236\245\354\210\230.java" new file mode 100644 index 0000000..9e5f895 --- /dev/null +++ "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\352\263\274\354\235\274_\354\236\245\354\210\230.java" @@ -0,0 +1,94 @@ +package week4.김누리.programmers; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.Stack; + +/** + * PackageName : week4.김누리.programmers + * FileName : 과일_장수 + * Author : 김누리(NRKim) + * Date : 2025-05-20 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 20. 김누리(NRKim) Initial creation + */ + + +/* +k = 최고점 +m = 1 상자에 들어가는 사과 수 + + +case 1 : + k = 3, m = 4 + 1 2 3 1 2 3 1 > 111 22 33 >> 3322 / 111 + { + {3,3,2,2}, + {1,1,1, } + } + + +case 2 : + 4 1 2 2 4 4 4 4 1 2 4 2 >> 11 2222 444444 > 444/ 444/ 222/ 211/ + { + {4,4,4} + {4,4,4} + {2,2,2} + {2,1,1} + } + +*/ + +public class 과일_장수 { + public int solution(int k, int m, int[] score) { + int answer = 0; + Queue desc = new LinkedList<>(); // 내림차순 정렬해서 저장용 큐 + Stack> stk = new Stack<>(); + + Arrays.sort(score); // 오름차순 정렬 + + for (int i = score.length-1; i >= 0; i--) { + desc.offer(score[i]); + } + + List tmp = new LinkedList<>(); + + + while(!desc.isEmpty()) { + tmp.add(desc.poll()); + + // 1상자 당 m개씩 사과 분배 + if(tmp.size() == m) { + stk.push(tmp); + + // 다음 상자 준비 + tmp = new LinkedList<>(); + } + } + + for(List apple : stk) { + int p = apple.get(0); + + for(int i = 1 ; i < apple.size(); i++) { + int tmpApple = apple.get(i); + if(tmpApple <= p) { + p = tmpApple; + } + } + + // 추후 Google링 해서 알아낸 결과로 + // Collections 함수 써서 아래 구문을 통해 간단히 해결 가능 + // int p = Collections.min(apple); + + answer += (p*m); + } + + return answer > 0 ? answer : 0; // 수익이 없는 경우 0을 던질 수 있도록 3항 조합 + } +} diff --git "a/week4/\352\271\200\353\210\204\353\246\254/programmers/\353\215\260\354\235\264\355\204\260_\353\266\204\354\204\235.java" "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\353\215\260\354\235\264\355\204\260_\353\266\204\354\204\235.java" new file mode 100644 index 0000000..e948914 --- /dev/null +++ "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\353\215\260\354\235\264\355\204\260_\353\266\204\354\204\235.java" @@ -0,0 +1,158 @@ +package week4.김누리.programmers; + +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; + +/** + * PackageName : week4.김누리.programmers + * FileName : 데이터_분석 + * Author : 김누리(NRKim) + * Date : 2025-05-21 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 21. 김누리(NRKim) Initial creation + */ + + +/* + List a이용 + + // 정렬 및 타겟 인덱스에서 이용 가능 idx + data[i][0] = code target_idx = 0; + data[i][1] = date target_idx = 1; + data[i][2] = maximum target_idx = 2; + data[i][3] = remain target_idx = 3; + + 입츨력 데이터 형태 + data = [ + [1, 20300104, 100, 80], + [2, 20300804, 847, 37], + [3, 20300401, 10, 8] + ] + + // 1. 타켓 인덱스 및 정렬 인덱스 셋팅 + switch(ext) + case "code" : + ext_idx = 0; + break; + + case "date" : + ext_idx = 1; + break; + + case "maximum" : + ext_idx = 2; + break; + + case "remain" : + ext_idx = 3; + break; + + default : + break; + + + switch(sort_by) + case "code" : + sorted_idx = 0; + break; + + case "date" : + sorted_idx = 1; + break; + + case "maximum" : + sorted_idx = 2; + break; + + case "remain" : + sorted_idx = 3; + break; + + default : + break; + + // 2. 인덱스 값에 맞춰 리스트 생성 + for(int[] d : data) { + if(d[ext_idx] <= val_ext) { + a에 d 입력 + } + } + + // 3. 정렬 후 답안 제출 + Collections.sort(a, Comparator.comparingInt(o -> o[sort_idx])); + +*/ +public class 데이터_분석 { + public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) { + int ext_idx = 0; // ext의 위치를 잡기 위한 idx + int sorted_idx = 0; // order by 대상 위치를 잡기 위한 idx + List a = new LinkedList<>(); + + // ext의 위치 setting + switch(ext) { + case "code" : + ext_idx = 0; + break; + + case "date" : + ext_idx = 1; + break; + + case "maximum" : + ext_idx = 2; + break; + + case "remain" : + ext_idx = 3; + break; + + default : + break; + } + + // order by 대상 위치의 위치 setting + switch(sort_by) { + case "code" : + sorted_idx = 0; + break; + + case "date" : + sorted_idx = 1; + break; + + case "maximum" : + sorted_idx = 2; + break; + + case "remain" : + sorted_idx = 3; + break; + + default : + break; + } + + // ext 대상에 맞는 데이터들만 List에 취합 + for (int[] d : data) { + if(d[ext_idx] <= val_ext) a.add(d); + } + + // idx를 고정해야, Collections 명령어 통해 정렬 가능 + final int sortIndex = sorted_idx; + Collections.sort(a, Comparator.comparingInt(o -> o[sortIndex])); + + int[][] answer = new int[a.size()][]; + int idx = 0; + + for(int[] av : a) { + answer[idx++] = av; + } + + return answer; + } +} diff --git "a/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\206\214\354\210\230_\354\260\276\352\270\260.java" "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\206\214\354\210\230_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..de17014 --- /dev/null +++ "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\206\214\354\210\230_\354\260\276\352\270\260.java" @@ -0,0 +1,78 @@ +package week4.김누리.programmers; + +import java.util.HashSet; +import java.util.Set; + +/** + * PackageName : week4.김누리.programmers + * FileName : 소수_찾기 + * Author : 김누리(NRKim) + * Date : 2025-05-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 19. 김누리(NRKim) Initial creation + */ + +/* +* +* 생각보다 어려운 문제였음. +* numbers = {1,2} 방식으로 오길래, 간단히 큐를 이용해서 넣고 빼고 하면서 하면 될 줄 알았으나 아님. +* 검색 결과 dfs 를 통해 진행 해야함을 파악, 단순 Queue 및 Stack 만으로는 진행 불가 +* +*/ + +public class 소수_찾기 { + Set result = new HashSet<>(); + String[] arr; + + // main 파트 + public int solution(String numbers) { + int answer = 0; + arr = numbers.split(""); + boolean[] visited = new boolean[arr.length]; + + // 방문 여부용 함수 재귀 + dfs("",visited); + + for(int num : result) { + // Hash result에 적재 된 사이즈 만큼 반복하여 isPrime함수 호출 + if (isPrime(num)) answer++; + } + + return answer; + } + + // 예 : {1,7}로 입력 되었을 때, 방문여부 체크용 dfs + void dfs(String current, boolean[] visited) { + // current 문자열이 NULL 및 ""의 경우 문자 추가 + if(!current.isEmpty()) { + result.add(Integer.parseInt(current)); + } + + // arr의 길이만큼 반복을 진행하며, 방문 여부 체크 + for(int i = 0; i < arr.length; i++) { + if(!visited[i]) { + visited[i] = true; + dfs(current + arr[i],visited); + visited[i] = false; + } + } + } + + boolean isPrime(int n) { + // n == 1인 경우 소수가 아니므로 false + if (n < 2) return false; + + // 2부터 n의 루트값 만큼 반복, 루트값(sqrt) 까지 반복하는 이유, 소수는 1과 자신으로만 나눠짐 + // 그러나 예를들어 n이 36인 경우 (1*36) /(2*18) /(3*12) /(4*9) /(6*6) /(9*4) /(12*3) /(18*) /(36*31) + // 이렇게 총 9건 정도 나옴 만약 이 케이스를 다 검사하게 되면? 최대 건수인 1만이 들어오면 터지기 때문에 + // n의 제곱근 만큼만 진행 + for (int i = 2; i <= Math.sqrt(n); i++) { + if (n % i == 0) return false; + } + + return true; + } +} diff --git "a/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\210\253\354\236\220\354\235\230_\355\221\234\355\230\204.java" "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\210\253\354\236\220\354\235\230_\355\221\234\355\230\204.java" new file mode 100644 index 0000000..b174006 --- /dev/null +++ "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\210\253\354\236\220\354\235\230_\355\221\234\355\230\204.java" @@ -0,0 +1,40 @@ +package week4.김누리.programmers; + +/** + * PackageName : week4.김누리.programmers + * FileName : 숫자의_표현 + * Author : 김누리(NRKim) + * Date : 2025-05-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 17. 김누리(NRKim) Initial creation + */ + +public class 숫자의_표현 { + public int solution(int n) { + int answer = 0; + + for(int i = 0; i < n; i++) { + int sum = 0; + + for(int j = i+1; j <= n; j++) { + sum += j; + + // sum의 값이 타겟 n 값이랑 같으면 answer++ + if(sum == n) { + answer++; + break; + } + + // sum이 타겟 n 값 보다 크면 2번째 for문은 종료 + if(sum > n) { + break; + } + } + } + + return answer; + } +} diff --git "a/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..cc4a89e --- /dev/null +++ "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" @@ -0,0 +1,44 @@ +package week4.김누리.programmers; + +import java.util.Stack; + +/** + * PackageName : week4.김누리.programmers + * FileName : 짝지어_제거하기 + * Author : 김누리(NRKim) + * Date : 2025-05-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 19. 김누리(NRKim) Initial creation + */ + +/* +Stack 문제. + +s를 문자열 배열로 만들고 Stack의 Peek와 s[i]와 값이 동일하지 않은 경우에만 +stack에 push하면 되는 간단한 문제 + +*/ + +public class 짝지어_제거하기 { + public int solution(String s) + { + int answer = -1; + String[] tmp = s.split(""); + Stack stk = new Stack<>(); + + for(String s2 : tmp) { + if(stk.isEmpty() || !stk.peek().equals(s2)) { + stk.push(s2); + } else if(stk.peek().equals(s2)) { + stk.pop(); + } + } + + answer = (stk.isEmpty()) ? 1 : 0; + + return answer; + } +} diff --git "a/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\262\264\354\234\241\353\263\265.java" "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\262\264\354\234\241\353\263\265.java" new file mode 100644 index 0000000..5c03e56 --- /dev/null +++ "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\354\262\264\354\234\241\353\263\265.java" @@ -0,0 +1,93 @@ +package week4.김누리.programmers; + +/** + * PackageName : week4.김누리.programmers + * FileName : 체육복 + * Author : 김누리(NRKim) + * Date : 2025-05-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 17. 김누리(NRKim) Initial creation + */ + +/* + case 1 : + 총원 5인(n == 5) + 체육복 = (1=1,2=1,3=1,4=1,5=1) // 1 ~ 5번 까지 + int[] idxs = new int[n]; + lost 학생 = 2,4 ==> 체육복 (1=1,2=0,3=1,4=0,5=1) + reserve idx = 1, 3, 5 ==> 체육복 (1=2,2=0,3=2,4=0,5=2) + + idx 배열 하나 생성 + for(int i = n; i > 0; i--) { + idxs[i] = n; // {1,2,3,4,5} + } + + 1번 째 반복문 n만큼 반복 + for(int i : idxs) { + // 타겟 idx의 학생의 체육복이 분실, 그리고 이전 idx의 학생이 여분의 체육복이 있는 경우 + if(i != 1 && 체육복.get(i) == 0 && 체육복.get(i-1) > 1 ) { + 체육복.put(i,체육복.getOrDefault(i,0)+1); + 체육복.put(i-1,체육복.getOrDefault(i-1,0)-1); + } + + // 타겟 idx의 학생의 체육복이 분실, 그리고 다음 idx의 학생이 여분의 체육복이 있는 경우 + if(i != n && 체육복.get(i) == 0 && 체육복.get(i+1) > 1 ) { + 체육복.put(i,체육복.getOrDefault(i,0)+1); + 체육복.put(i+1,체육복.getOrDefault(i+1,0)-1); + } + } +*/ + +import java.util.*; + +public class 체육복 { + public int solution(int n, int[] lost, int[] reserve) { + int answer = 0; + int[] idxs = new int[n]; // 학생 번호가 들어갈 배열 + Map clothes = new HashMap<>(); // 학생의 체육복을 관리하기 위함. + + // idxs 배열 초기화 + for(int i = 0; i < n; i++) { + idxs[i] = i+1; + } + + // 체육복 map 초기화 + for(int i : idxs) { + clothes.put(i,1); + } + + // 분실된 학생의 체육복은 -- + for (int l : lost) { + clothes.put(l,clothes.getOrDefault(l,0)-1); + } + + // 여분이 있는 학생의 체육복은 ++ + for (int r : reserve) { + clothes.put(r,clothes.getOrDefault(r,0)+1); + } + + // 체육복 빌리는 작업 진행 + for(int i : idxs) { + // 타겟 idx의 학생의 체육복이 분실, 그리고 이전 idx의 학생이 여분의 체육복이 있는 경우 + if (i !=1 && clothes.get(i) == 0 && clothes.getOrDefault(i-1, 0) > 1) { + clothes.put(i,clothes.getOrDefault(i,0)+1); + clothes.put(i-1,clothes.getOrDefault(i-1,0)-1); + } + + // 타겟 idx의 학생의 체육복이 분실, 그리고 다음 idx의 학생이 여분의 체육복이 있는 경우 + if (i !=n && clothes.get(i) == 0 && clothes.getOrDefault(i+1, 0) > 1) { + clothes.put(i,clothes.getOrDefault(i,0)+1); + clothes.put(i+1,clothes.getOrDefault(i+1,0)-1); + } + } + + for(int i : idxs) { + if (clothes.get(i) != 0) answer++; + } + + return answer; + } +} diff --git "a/week4/\352\271\200\353\210\204\353\246\254/programmers/\355\217\260\354\274\223\353\252\254.java" "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\355\217\260\354\274\223\353\252\254.java" new file mode 100644 index 0000000..d768793 --- /dev/null +++ "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\355\217\260\354\274\223\353\252\254.java" @@ -0,0 +1,43 @@ +package week4.김누리.programmers; + +import java.util.HashSet; +import java.util.Set; + +/** + * PackageName : week4.김누리.programmers + * FileName : 폰켓몬 + * Author : 김누리(NRKim) + * Date : 2025-05-20 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 20. 김누리(NRKim) Initial creation + */ + +/* +* +* nums 배열의 절반만 획득 가능 +* 그리고 가능한 중복없이 골라야함. >> HashSet 이용 +* 이후 Hash의 사이즈가 선택 가능한 수 보다 크면 ? >> 선택 가능한 수만 반환 +* 아니면 그냥 선택한 수 그대로 반환 +* +*/ + +public class 폰켓몬 { + public int solution(int[] nums) { + int answer = 0; + int get = nums.length/2; // 선택 가능한 수 + Set set = new HashSet<>(); + + for (int i : nums) { + set.add(i); + } + + if (set.size() > get) answer = get; + if (set.size() <= get) answer = set.size(); + + + return answer; + } +} diff --git "a/week4/\352\271\200\353\210\204\353\246\254/programmers/\355\224\274\353\263\264\353\202\230\354\271\230_\354\210\230.java" "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\355\224\274\353\263\264\353\202\230\354\271\230_\354\210\230.java" new file mode 100644 index 0000000..f31ce09 --- /dev/null +++ "b/week4/\352\271\200\353\210\204\353\246\254/programmers/\355\224\274\353\263\264\353\202\230\354\271\230_\354\210\230.java" @@ -0,0 +1,35 @@ +package week4.김누리.programmers; + +/** + * PackageName : week4.김누리.programmers + * FileName : 피보나치_수 + * Author : 김누리(NRKim) + * Date : 2025-05-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 17. 김누리(NRKim) Initial creation + */ + +public class 피보나치_수 { + public int solution(int n) { + int answer = 0; + int x = 1234567; + + int a = 0; + int b = 1; + + if (n == a) answer = a % x; + if (n == b) answer = b % x; + + for(int i = 2; i <= n; i++) { + int sum = (a + b) % x; + answer = sum; + a = b; + b = sum; + } + + return answer; + } +} diff --git "a/week4/\354\235\264\354\203\201\354\226\265/progarmmers/2xn_\355\203\200\354\235\274\353\247\201.java" "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/2xn_\355\203\200\354\235\274\353\247\201.java" new file mode 100644 index 0000000..9b661c7 --- /dev/null +++ "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/2xn_\355\203\200\354\235\274\353\247\201.java" @@ -0,0 +1,41 @@ +package week5.이상억.progarmmers; + +/** + * PackageName : week5.이상억.progarmmers; + * FileName : 예산 + * Author : sangeok + * Date : 2025. 5. 22. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 22. sangeok Initial creation + */ + + +// 문제 요구사항 : 가로 길이 => 2, 세로 길이 => 1 인 직사각형 모양 타일 +// 이 직사각형을 이용해 새로운 길이가 2이고 가로 길이 n 인 바닥을 가득 채우려고 함 + +// 접근 방식 : (1) 이거 피보나치 수열 아닌가 ? + +class Solution { + public int solution(int n) { + int answer = 0; + + int[] a = new int[n+1]; + + if(n==0) return 0; + if(n==1) return 1; + if(n==2) return 2; + + a[0] = 0; + a[1] = 1; + a[2] = 2; + for(int i = 3; i < n + 1; i++){ + a[i] = (a[i-1] + a[i-2]) % 1000000007 ; + + } + answer = a[n] ; + return answer; + } +} \ No newline at end of file diff --git "a/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\355\201\260_\354\210\230.java" "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\355\201\260_\354\210\230.java" new file mode 100644 index 0000000..4c96ffb --- /dev/null +++ "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\355\201\260_\354\210\230.java" @@ -0,0 +1,72 @@ +/** + * PackageName : week4.이상억.progarmmers; + * FileName : 가장_큰_수 + * Author : sangeok + * Date : 2025. 5. 23. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 23. sangeok Initial creation + */ + +// 문제 요구사항 : 배열 안 숫자들을 조합 해 가장 큰 수 만들기 + +// 접근 방법 : (1) 숫자를 붙여 if문으로 비교하려고 했는데 문제 조건에 정답이 넘 클 수도 있어 문자열로 반환한다고 하는 멘트와 제한 조건을 보니 무조건 오버플로우가 날 거같아 문자열로 비교해야할 거 같음 +// (2) 이중 for 문을 사용해 비교해서 덧붙여서 접근 해봤는데 시간초과가 남 +// (3) Arrays.sort(str, (a, b) -> (b + a).compareTo(a + b)) 사용 + +// 회고 : 라이브러리를 사용안하려고 하였지만 결국에 사용했다.. + +import java.util.*; + +class Solution { + public String solution(int[] numbers) { + String[] str = new String[numbers.length]; + + for (int i = 0; i < numbers.length; i++) { + str[i] = String.valueOf(numbers[i]); + } + + Arrays.sort(str, (a, b) -> (b + a).compareTo(a + b)); + + StringBuilder sb = new StringBuilder(); + for (String s : str) sb.append(s); + + if (sb.charAt(0) == '0') return "0"; + return sb.toString(); + } +} + +// 이 풀이 방식 시간 초과 남 + + +//import java.util.*; +// +//class Solution { +// public String solution(int[] numbers) { +// String[] str = new String[numbers.length]; +// +// for (int i = 0; i < numbers.length; i++) { +// str[i] = String.valueOf(numbers[i]); +// } +// +// for(int i = 0 ; i < str.length - 1; i++){ +// for(int j = 0; j < str.length -1 - i ; j++ ){ +// String ab = str[j] + str[j + 1]; +// String ba = str[j + 1] + str[j]; +// +// if (ab.compareTo(ba) < 0) { +// String temp = str[j]; +// str[j] = str[j + 1]; +// str[j + 1] = temp; +// } +// } +// } +// StringBuilder sb = new StringBuilder(); +// +// for(String s : str) sb.append(s); +// +// return sb.toString(); +// } +//} diff --git "a/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\274\354\235\274_\354\236\245\354\210\230.java" "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\274\354\235\274_\354\236\245\354\210\230.java" new file mode 100644 index 0000000..3721fa1 --- /dev/null +++ "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\274\354\235\274_\354\236\245\354\210\230.java" @@ -0,0 +1,34 @@ +package week4.이상억.progarmmers; + +/** + * PackageName : week4.이상억.progarmmers; + * FileName : 과일_장수 + * Author : sangeok + * Date : 2025. 5. 16. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 16. sangeok Initial creation + */ + +// 문제 요구사항 : 사과 상태에 따른 점수 1~k 점 / 한 상자 가격 : (1~k) * m ( 사과의 갯수 ) +// 최대 사과 점수 : k , 한 상자의 들어가는 사과 개수 : m , 사과의 점수 :score + +// 접근 방식 : (1) +// 1) 정렬하고 m 간격으로 해서 돌리면 되겠다. + + +import java.util.Arrays; +class Solution { + public int solution(int k, int m, int[] score) { + int answer = 0; + + Arrays.sort(score); + for(int i = score.length-m; i>=0; i-=m){ + answer += score[i] * m; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\353\215\260\354\235\264\355\204\260_\353\266\204\354\204\235.java" "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\353\215\260\354\235\264\355\204\260_\353\266\204\354\204\235.java" new file mode 100644 index 0000000..cdb978a --- /dev/null +++ "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\353\215\260\354\235\264\355\204\260_\353\266\204\354\204\235.java" @@ -0,0 +1,134 @@ +package week4.이상억.progarmmers; + +/** + * PackageName : week4.이상억.progarmmers; + * FileName : 과일_장수 + * Author : sangeok + * Date : 2025. 5. 20. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 20. sangeok Initial creation + */ + + +// 문제 요구사항 : [ "코드번호" , "제조일" , 최대 수량", "현재 수량"] 을 구성 +// 이 데이터들을 조건을 만족하는 데이터만 뽑아서 정렬 +// ext : 어떤 정보를 기준으로 데이터를 뽑아낼지를 의미하는 문자열 +// val_ext : 뽑아낼 정보의 기준값을 나타내는 정수 +// sort_by : 정보를 정렬할 기준이 되는 문자열 +// => data에서 ext 값이 val_ext 보다 작은 데이터만 뽑은 후 sort_by에 해당하는 값을 기준으로 오름차순 + +// 접근 방식 : (1) 그냥 별 생각 없이 저 위에 요구사항 하드 코딩 +// (2) hashmap 으로 string : integer 짝 지어서 작성 + +// 회고 : 이 방식으로 풀어서 제출 했는데 되긴 했는데 이건 좀 아닌거 같아서 다시 다른 방법 생각해서 풀기 +// list 정렬 하는 방식이 잘 기억나지 않아 검색하였다. +import java.util.*; + +class Solution { + public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) { + List list = new ArrayList<>(); + + Map column = Map.of( + "code" , 0, + "date" , 1, + "maximum", 2, + "remain", 3 + ); + + int col = column.getOrDefault(ext, -1); + int sortcol = column.getOrDefault(sort_by, -1); + + for (int[] row : data) { + if (row[col] < val_ext) { + list.add(row); + } + } + + list.sort(Comparator.comparingInt(row -> row[sortcol])); + + int[][] answer = new int[list.size()][]; + for (int i = 0; i < list.size(); i++) { + answer[i] = list.get(i); + } + + return answer; + } +} + + +//import java.util.*; +// +//class Solution { +// public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) { +// +// List list = new ArrayList<>(); +// +// switch (ext) { +// case "code": +// for(int i = 0; i list, int sortcol){ +// int n = list.size(); +// +// for(int i = 0; i < n - 1 ; i++){ +// for(int j = 0; j < n - 1 - i; j++){ +// if(list.get(j)[sortcol] > list.get(j+1)[sortcol]){ +// int[] temp = list.get(j); +// list.set(j, list.get(j+1)); +// list.set(j+1, temp); +// } +// } +// } +// } +//} \ No newline at end of file diff --git "a/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\206\214\354\210\230_\354\260\276\352\270\260.java" "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\206\214\354\210\230_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..8681b10 --- /dev/null +++ "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\206\214\354\210\230_\354\260\276\352\270\260.java" @@ -0,0 +1,58 @@ +package week4.이상억.progarmmers; + +/** + * PackageName : week4.이상억.progarmmers; + * FileName : 소수_찾기 + * Author : sangeok + * Date : 2025. 5. 23. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 23. sangeok Initial creation + */ +// 문제 요구사항 : 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇개 인지 + +// 회고 : 완전탐색에 대한 지식이 현저히 떨어져서 뭐 감이 오지 않아 찾아보면서 풀었지만 이게 내가 푼게 맞나 싶다 +// 구조가 이해가 가지만 이 문제는 추후 다시 풀어보고 완전탐색에 대해 공부를 해보며 알고리즘 자체를 구현해봐야 겠다. + +import java.util.*; + +class Solution { + Set set = new HashSet<>(); + + public int solution(String numbers) { + boolean[] visited = new boolean[numbers.length()]; + + dfs(numbers, "", visited); + + int count = 0; + for (int num : set) { + if (isPrime(num)) count++; + } + + return count; + } + + void dfs(String numbers, String current, boolean[] visited) { + if (!current.equals("")) { + set.add(Integer.parseInt(current)); + } + + for (int i = 0; i < numbers.length(); i++) { + if (!visited[i]) { + visited[i] = true; + dfs(numbers, current + numbers.charAt(i), visited); + visited[i] = false; + } + } + } + + boolean isPrime(int num) { + if (num < 2) return false; + for (int i = 2; i * i <= num; i++) { + if (num % i == 0) return false; + } + return true; + } +} diff --git "a/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220\354\235\230_\355\221\234\355\230\204.java" "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220\354\235\230_\355\221\234\355\230\204.java" new file mode 100644 index 0000000..08c487f --- /dev/null +++ "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\210\253\354\236\220\354\235\230_\355\221\234\355\230\204.java" @@ -0,0 +1,42 @@ +package week4.이상억.progarmmers; + +/** + * PackageName : week4.이상억.progarmmers; + * FileName : 숫자의 표현 + * Author : sangeok + * Date : 2025. 5. 16. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 16. sangeok Initial creation + */ + +//문제 요구사항 : 숫자를 연속된 자연수로 더해 나타낼 수 있는 경우의 수 구하기 + +// 접근 방법 : (1) +// 1) while문으로 n == n 까지 돌리고 그 +// 2) 안에 list 선언 +// 3) 반복문으로 계속 값 더해서 같으면 answer ++ 더 커지면 for문 탈출 +// 4) 그 다음 i = a 에 a ++ 하고 sum 값 초기화 + + + +class Solution { + public int solution(int n) { + int answer = 0; + + int a = 1; + while(a<=n){ + int sum = 0; + // a + (a+1) ... + for(int i = a ; i<=n ; i++){ + sum+=i; + if(sum == n) answer ++; // 같으면 경우의 수 + 1 + if(sum > n) break; // 더 커지면 아니니까 for 문 탈출 + } + a++; + } + return answer; + } +} \ No newline at end of file diff --git "a/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" new file mode 100644 index 0000000..ba927d9 --- /dev/null +++ "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.java" @@ -0,0 +1,40 @@ +package week4.이상억.progarmmers; + +/** + * PackageName : week4.이상억.progarmmers; + * FileName : 짝지어_제거하기 + * Author : sangeok + * Date : 2025. 5. 16. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 16. sangeok Initial creation + */ + + +// 문제 요구사항 : 같은 알파벳이 2개 붙어 있는 짝을 찾음 -> 그 다음 그 둘을 제거 -> 앞 뒤로 다시 이어 붙임 +// -> 다 제거하는 함수 작성하기 + +// 접근 방법 : (1) list 로 선언해서 했지만 효율성에서 시간 초과 리스트를 삭제하는데 있어서 시간 복잡도가 초과 됨 +// (2) stack / LinkedList 등 다른 자료구조 사용 + +// 회고 : +import java.util.Stack; + +class Solution +{ + public int solution(String s) + { + Stack stack = new Stack<>(); + for (char alphabet : s.toCharArray()) { + if (!stack.isEmpty() && stack.peek() == alphabet) { + stack.pop(); + } else { + stack.push(alphabet); + } + } + + return stack.isEmpty() ? 1:0 ; + } +} \ No newline at end of file diff --git "a/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\262\264\354\234\241\353\263\265.java" "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\262\264\354\234\241\353\263\265.java" new file mode 100644 index 0000000..cb5603b --- /dev/null +++ "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\354\262\264\354\234\241\353\263\265.java" @@ -0,0 +1,54 @@ +package week4.이상억.progarmmers; + +/** + * PackageName : week4.이상억.progarmmers; + * FileName : 체육복 + * Author : sangeok + * Date : 2025. 5. 22. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 22. sangeok Initial creation + */ + +//문제 요구사항 : 체육복을 앞/뒤 번호로만 빌려 줄 수 있음 = > 최대한 적절히 빌려 최대한 많은 학생이 입어야 함 +// 전체 학생수 => n / 체육복을 도난당한 학생들의 번호 담긴 배열 => lost +// 여벌 체육복을 가져온 학생 => reserve / 들을 수 있는 학생 최댓값 return + +// 접근 방식 : (1) for 문과 list 만을 사용해서 작성해봤는데 13,18 에서 계속 실패하고 인덱스가 자꾸 밀리고 겹치는 학생 및 여러 조건을 처리하는데 list를 계속 선언해야하는 불편함이 생김 => 그냥 이 방법 유기하기로 함 +// (2) hashset 사용 + +// 회고 : 어려운 문제는 아니였는데 자꾸 바로 생각나는 풀이로 시도하다보니 삽질 좀 했다. 아직까지 고쳐지지 않는 문제인데 +// 좀 더 넓게 봐야하는데 바로 앞만 보는거 같다. + + +import java.util.*; + +class Solution { + public int solution(int n, int[] lost, int[] reserve) { + + Set lostset = new HashSet<>(); + Set reserveset = new HashSet<>(); + + for(int l : lost) lostset.add(l); + for(int r : reserve) reserveset.add(r); + + for (int r : reserve) { + if (lostset.contains(r)) { + lostset.remove(r); + reserveset.remove(r); + } + } + + for (int r : reserveset) { + if (lostset.contains(r - 1)) { + lostset.remove(r - 1); + } else if (lostset.contains(r + 1)) { + lostset.remove(r + 1); + } + } + + return n-lostset.size(); + } +} \ No newline at end of file diff --git "a/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\355\217\260\354\274\223\353\252\254.java" "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\355\217\260\354\274\223\353\252\254.java" new file mode 100644 index 0000000..545d992 --- /dev/null +++ "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\355\217\260\354\274\223\353\252\254.java" @@ -0,0 +1,36 @@ +package week4.이상억.progarmmers; + +/** + * PackageName : week4.이상억.progarmmers; + * FileName : 폰켓몬 + * Author : sangeok + * Date : 2025. 5. 22. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 22. sangeok Initial creation + */ + + +// 문제 요구사항 : N마리 중 N/2 마리 가져가도 좋다 +// [3,1,2,3] 이래 있음 (3,1) , (3,2) , (3,3), (1,2), (1,3), (2,3) => 6가지 방법 가져 갈 수 있는 최대 포켓몬 2마리 +// 최대한 많은 N/2마리를 가져가는 방법 + +// 접근 방식 : (1) list 선언해서 중복 안되는 값 담고 n/2 넘는지만 검사하면 될 거 같음. + +import java.util.*; + +class Solution { + public int solution(int[] nums) { + List list = new ArrayList<>(); + + for (int i = 0; i < nums.length; i++) { + if (!list.contains(nums[i])) { + list.add(nums[i]); + } + } + + return Math.min(list.size(), nums.length / 2); + } +} diff --git "a/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\355\224\274\353\263\264\353\202\230\354\271\230_\354\210\230.java" "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\355\224\274\353\263\264\353\202\230\354\271\230_\354\210\230.java" new file mode 100644 index 0000000..fc2b542 --- /dev/null +++ "b/week4/\354\235\264\354\203\201\354\226\265/progarmmers/\355\224\274\353\263\264\353\202\230\354\271\230_\354\210\230.java" @@ -0,0 +1,37 @@ +package week4.이상억.progarmmers; + +/** + * PackageName : week4.이상억.progarmmers; + * FileName : 피보나치_수 + * Author : sangeok + * Date : 2025. 5. 16. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 16. sangeok Initial creation + */ + +// 문제 요구사항 : f(0) = 1 , f(1) = 1 일 때, f(n) = f(n-1) + f(n-2) + +// 접근 방법 : (1) 이거 멀리 뛰기랑 똑같은거 + +class Solution { + public int solution(int n) { + int answer = 0; + + int[] a = new int[n+1]; + + if(n==0) return 0; + if(n==1) return 1; + + a[0] = 0; + a[1] = 1; + for(int i = 2; i < n + 1; i++){ + a[i] = (a[i-1] + a[i-2]) % 1234567 ; + + } + answer = a[n] ; + return answer; + } +} \ No newline at end of file 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/week5/\352\260\225\354\204\261\354\232\261/programmers/\352\265\254\353\252\205\353\263\264\355\212\270.java" "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\352\265\254\353\252\205\353\263\264\355\212\270.java" new file mode 100644 index 0000000..97e3655 --- /dev/null +++ "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\352\265\254\353\252\205\353\263\264\355\212\270.java" @@ -0,0 +1,45 @@ +package week5.강성욱.programmers; + +import java.util.*; + +public class 구명보트 { + //2명밖에 못타는게 핵심 + //가장 무거운 사람이, 가능한 태울 수 있는 사람을 태우는게 좋다..? + //가능한듯 + //단순 반복으로 하면 시간복잡도는, 최대 O(n^2)... n=50,000; 불가능 + //정렬을 해서 오름차순? 으로 하고, 쓰면? + //[20, 30, 50, 90] 100 + //90 선택 (right) + //now left = 20 + //possible? no + //아, 불가능할때까지 left를 우측으로 쉬프트하면서 쓰면 되겠다. + //이러면 이론상 O(n) + //종료 조건은? left 가 더 커지면? 같은거 까지는 해야됨. + //[1, 2, 3, 4, 5] 일때, 10이면, [1, 5], [2, 4] 하고 left right 가 동일해지는데, 태워야함 + + class Solution { + public int solution(int[] people, int limit) { + int left = 0; + int right = people.length-1; //인덱스 기반이니 -1 해야됨. + int count = 0; + Arrays.sort(people); //오름차순 정렬 + + while(left <= right) { + if(people[left] + people[right] <= limit) { //태울만함 + left++; + right--; + count++; + } else if(right == left) { //남은 사람이 한명이면 걍 한명 태워서 보냄 + count++; + break; + } + else { //무거워서 한명만 태워야됨 + right--; + count++; + } + } + + return count; + } + } +} diff --git "a/week5/\352\260\225\354\204\261\354\232\261/programmers/\352\267\244\352\263\240\353\245\264\352\270\260.java" "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\352\267\244\352\263\240\353\245\264\352\270\260.java" new file mode 100644 index 0000000..08ac528 --- /dev/null +++ "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\352\267\244\352\263\240\353\245\264\352\270\260.java" @@ -0,0 +1,36 @@ +package week5.강성욱.programmers; + +import java.util.*; +public class 귤고르기 { + //항상 가장 많은 사이즈 분포를 가진 귤만 박스에 넣으면 되는거 아닌가? + //[1, 1, 1, 3, 3, 4, 4, 5, 5, 5, 5], k = 5; + //5만 4개 너고, 아무꺼나 하나 넣으면 끝. + //음.. key-value 자료구조 쓰면 될듯. Map 쓰자 + + //후기, 다풀고 나니, 중간에 Map -> List 로 변환하는 과정에서, key값인 귤 사이즈 종류 데이터는 굳이 가져올 필요가 없다. + //즉, 복잡하게 Map.Entry 로 엔트리를 가져올 필요 없이, 그냥 .values() 만 해서 값만(개수) 꺼내와도 됬을 듯 하다. + + class Solution { + public int solution(int k, int[] tangerine) { + Map map = new HashMap<>(); //key : 귤 사이즈, value : 귤 개수 + for(int item : tangerine) { + map.put(item, map.getOrDefault(item, 0) + 1); + } + + List> entryList = new ArrayList<>(map.entrySet()); + entryList.sort((a, b) -> b.getValue() - a.getValue()); //내림차순 + + int sum = 0; + int sizeCount = 0; + + //이제 실제 상자에 담음. max = k; + for(Map.Entry now : entryList) { + sum += now.getValue(); + sizeCount++; + if(sum >= k) break; + } + + return sizeCount; + } + } +} diff --git "a/week5/\352\260\225\354\204\261\354\232\261/programmers/\353\215\224_\353\247\265\352\262\214.java" "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\353\215\224_\353\247\265\352\262\214.java" new file mode 100644 index 0000000..a2f8ea3 --- /dev/null +++ "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\353\215\224_\353\247\265\352\262\214.java" @@ -0,0 +1,38 @@ +package week5.강성욱.programmers; + +import java.util.*; + +public class 더_맵게 { + // 문제는, 목표치를 정확하게 맞추는게 목표가 아님. + // 일정 (K) 보다 더 높은 스코빌 지수만 가지는 음식을 만들어 내는것 + // 일딴, 기준보다 높은 스코빌은 떼놓아도 됨. + // 만약, 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없다면 -1 return + // 이건, 가지고 있는 음식이 1개 이하인데, K 에 도달하지 못했다면 return 하면 될듯. + + //아, 어렵게 생각하면 안되네, 조합을 생각하는게 아니라, 문제에 가장 작은것과 2번째 작은걸 조합하라는거네? + //우선순위큐를 쓰자. + + class Solution { + public int solution(int[] scoville, int K) { + PriorityQueue pq = new PriorityQueue<>(); //기본 오름차순 + for(int sco : scoville) { + pq.add(sco); + } + + //반복의 조건은 음식의 가장 낮은 스코빌 지수가, K 이상일 것 + int mixCount = 0; + while(pq.peek() < K) { + if(pq.size() <= 1) return -1; + + int first = pq.poll(); + int second = pq.poll(); + + int next = first + (second * 2); + pq.add(next); + mixCount++; + } + + return mixCount; + } + } +} diff --git "a/week5/\352\260\225\354\204\261\354\232\261/programmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235.java" "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235.java" new file mode 100644 index 0000000..09a96e8 --- /dev/null +++ "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235.java" @@ -0,0 +1,61 @@ +package week5.강성욱.programmers; + +import java.time.*; + +public class 동영상_재생 { + //String 에서 LocalTime 변환 하는 로직을 추가하자. + //시간 계산이 주로 있는데, LocalTime 을 사용하면 편함. + //이거, 10초 전으로 이동해도, 만약 오프닝 위치라면, 오프닝 중간으로 들어갈 수 없음. 즉, 오프닝 중간으로 이동하는게 불가능. + + class Solution { + private static final String ORDER_PREV = "prev"; + private static final String ORDER_NEXT = "next"; + + public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) { + LocalTime nowTime = convertToLocalTime(pos); + LocalTime videoLen = convertToLocalTime(video_len); + LocalTime opStart = convertToLocalTime(op_start); + LocalTime opEnd = convertToLocalTime(op_end); + + int opStartSec = toSec(opStart); + int opEndSec = toSec(opEnd); + + int nowSec = toSec(nowTime); + if (nowSec >= opStartSec && nowSec <= opEndSec) { + nowSec = opEndSec; + nowTime = secToLocalTime(nowSec); + } + + int videoLenSec = toSec(videoLen); + + for(String command : commands) { + if (ORDER_PREV.equals(command)) { + nowSec = Math.max(0, nowSec - 10); + } else if (ORDER_NEXT.equals(command)) { + nowSec = Math.min(videoLenSec, nowSec + 10); + } + nowTime = secToLocalTime(nowSec); + + if (nowSec >= opStartSec && nowSec <= opEndSec) { + nowSec = opEndSec; + nowTime = secToLocalTime(nowSec); + } + } + + return String.format("%02d:%02d", nowTime.getMinute(), nowTime.getSecond()); + } + + private LocalTime convertToLocalTime(String time) { + String[] times = time.split(":"); + return LocalTime.of(0, Integer.parseInt(times[0]), Integer.parseInt(times[1])); + } + + private int toSec(LocalTime t) { + return t.getMinute() * 60 + t.getSecond(); + } + + private LocalTime secToLocalTime(int sec) { + return LocalTime.of(0, sec / 60, sec % 60); + } + } +} diff --git "a/week5/\352\260\225\354\204\261\354\232\261/programmers/\353\266\225\353\214\200\352\260\220\352\270\260.java" "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\353\266\225\353\214\200\352\260\220\352\270\260.java" new file mode 100644 index 0000000..5c18a56 --- /dev/null +++ "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\353\266\225\353\214\200\352\260\220\352\270\260.java" @@ -0,0 +1,49 @@ +package week5.강성욱.programmers; + +public class 붕대감기 { + class Solution { + public int solution(int[] bandage, int health, int[][] attacks) { + int maxHp = health; + int nowHp = health; + + //공격받지 않은 횟수 + // == bandage[0] 과 동일하면, bandage[2] 만큼 추가 회복, 단, 최대 maxHp 를 넘을 순 없음. + int nonAttackCount = 0; + + int bandageCastingTime = bandage[0]; + int bandageHealPerSec = bandage[1]; + int bandageHealAdd = bandage[2]; + int lastAttackTime = 0; + + for(int[] attack : attacks) { + int attackTime = attack[0]; //공격 시간 + int attackDamage = attack[1]; //피해량 + int timeGap = attackTime - lastAttackTime - 1; // 이전 공격 ~ 이번 공격까지의 시간 차이. 이만큼 회복할 예정 + + // 시간 차이가 나면, 우선 회복 + if (timeGap > 0) { + int fullCasts = (nonAttackCount + timeGap) / bandageCastingTime; + int nextCount = nonAttackCount + timeGap; + + // 회복 1초당 적용 (연속 카운트도 계속) + for (int t = 1; t <= timeGap; t++) { + nonAttackCount++; + nowHp += bandageHealPerSec; + if (nonAttackCount == bandageCastingTime) { + nowHp += bandageHealAdd; + nonAttackCount = 0; + } + if (nowHp > maxHp) nowHp = maxHp; + } + } + + // 공격 진행 + nowHp -= attackDamage; + if (nowHp <= 0) return -1; // 죽었으면 -1 리턴 + nonAttackCount = 0; // 연속 성공 카운트 초기화 + lastAttackTime = attackTime; // 마지막 공격 시각 업데이트 + } + return nowHp; + } + } +} diff --git "a/week5/\352\260\225\354\204\261\354\232\261/programmers/\354\230\210\354\202\260.java" "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\354\230\210\354\202\260.java" new file mode 100644 index 0000000..03cabb8 --- /dev/null +++ "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\354\230\210\354\202\260.java" @@ -0,0 +1,28 @@ +package week5.강성욱.programmers; + +import java.util.*; + +public class 예산 { + //그냥 정렬때리고, 오름차순으로 하나씩 더하다가, budget 보다 커진다? 하면 count 증가 반복 취소하고 return? + //안될 이유가 없는디? + //음 시간복잡도는 O(n) + + class Solution { + public int solution(int[] d, int budget) { + Arrays.sort(d); + int count=0; + int sum = 0; + + for(int now : d) { + if(sum + now <= budget) { + sum += now; + count++; + continue; + } + break; + } + + return count; + } + } +} diff --git "a/week5/\352\260\225\354\204\261\354\232\261/programmers/\354\271\264\355\216\253.java" "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\354\271\264\355\216\253.java" new file mode 100644 index 0000000..a9ae2e6 --- /dev/null +++ "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\354\271\264\355\216\253.java" @@ -0,0 +1,37 @@ +package week5.강성욱.programmers; + +public class 카펫 { + //brown 이든 yellow 든 하나를 통해서, 만들 수 있는 카페트를 생성 + //yellow 로 카페트를 만드는게 훨신 더 쉬울듯? + //상상속 카페트의 brown 숫자를 확인 + //이걸 입력받은 brown 와 같은지 확인 + // + //구현은? + //케이스를 List 에 2차원으로 가로,세로 조합을 만들어서 넣어두고 + //그걸 토대로, brown 를 계산하는 공식을 만들어서 전달하면 메서드로 뽑아주고 return 해서 + //검사하고 맞으면 return 하는 방식으로 해도 될듯. + // + //이거 굳이 이러지 말고, 적절한 카페트 생성되면 바로 체크하는게 더 유리할 듯. (시간 복잡도 상) + // + //가로가 더 길다는 가정 잘 생각해야됨. + + class Solution { + public int[] solution(int brown, int yellow) { + for(int y=1; y<=Math.sqrt(yellow); y++) { //절반만 써야됨. 왜냐? x가 더 크거나 같으니 + if(yellow % y == 0) { //나눠져야지 사각형이 됨. + int xSize = yellow/y + 2; + int ySize = y + 2; + if (calcBrownCount(xSize, ySize) == brown) { + return new int[]{xSize, ySize}; + } + } + } + + return new int[]{-1, -1}; + } + + private int calcBrownCount(int xSize, int ySize) { + return (xSize * 2) + (ySize * 2) - 4; + } + } +} diff --git "a/week5/\352\260\225\354\204\261\354\232\261/programmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" new file mode 100644 index 0000000..b8a4a33 --- /dev/null +++ "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" @@ -0,0 +1,32 @@ +package week5.강성욱.programmers; + +public class 타겟_넘버 { + //뭔가 최적화를 생각하면, 중간에 조건 분기하고, 남은 숫자들을 뭔가 조합해서 가능하냐? 등을 할 수는 있을 것 같음. (매우 어려울듯) + //단순 반복을 해보자. + //중첩 for 문이 몇개 나올지는 모름. 왜? 반복회수가 정해져 있지 않음. + //그럼 이건 완탐 * bfs/dfs 임 + //시간 복잡도는, O(2^n), 2r가지 +, -에 대해 n개 만큼 + //2^20 = 약 100만. 쌉가능 + + //dfs 로 풀자. + //종료 지점은, depth == numbers.length + //종료 지점에서, 걸리면 target 과 비교 후, resultCount 증가. (동일하면) + //그럼, 현재 값을 지속적으로 넘겨줘야함. visited 는 필요없음. + class Solution { + private int count = 0; + + public int solution(int[] numbers, int target) { + dfs(numbers, target, 0, 0); + return count; + } + + private void dfs(int[] numbers, int target, int nowSum, int depth) { + if(depth == numbers.length) { + if(nowSum == target) count++; + return; + } + dfs(numbers, target, nowSum + numbers[depth], depth + 1); //하나는 더하기 + dfs(numbers, target, nowSum - numbers[depth], depth + 1); //하나는 빼기 + } + } +} diff --git "a/week5/\352\260\225\354\204\261\354\232\261/programmers/\355\224\274\353\241\234\353\217\204.java" "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\355\224\274\353\241\234\353\217\204.java" new file mode 100644 index 0000000..fed82df --- /dev/null +++ "b/week5/\352\260\225\354\204\261\354\232\261/programmers/\355\224\274\353\241\234\353\217\204.java" @@ -0,0 +1,40 @@ +package week5.강성욱.programmers; + +import java.util.*; + +public class 피로도 { + //들어갈 던전에 번호별 제한은 없다. + //즉, 1번 -> 3번 -> 2번 던전 순서대로 진입은 가능. 즉, 텔레포트로 이동한다고 생각할 것. + //결국 조합별 탐색을 진행하면 됨. + //재귀함수 + //각, 던전을 방문했는지 확인할 visited[] 필요. 사이즈는, dungeons.length; + //방문 가능한지가, 1차 종료 조건. 만약 방문할 수 없다면, 종료함과 동시에 지금까지 방문한 depth 반환 + //더 이상 방문할 곳이 없는지가 2차 조건. + //방문할 곳이 있다면, 그곳으로 방문(재귀 함수 호출) + + //시간복잡도는, O(n!), n == 8 (던전 개수) + //이건, 8x7x6...x1 이기때문에 팩토리얼. + //가능은 함. + + class Solution { + public int solution(int k, int[][] dungeons) { + boolean[] visited = new boolean[dungeons.length]; + return dfs(k, dungeons, visited, 0); + } + + private int dfs(int nowHp, int[][] dungeons, boolean[] visited, int depth) { + int maxDepth = depth; + + for (int i=0; i map = new HashMap<>(); + for (int tan : tangerine) { + // 이미 있으면 +1, 없으면 0에서 시작 + map.put(tan, map.getOrDefault(tan, 0) + 1); + } + + // 귤의 크기별 개수만 리스트로 변환 + List list = new ArrayList<>(map.values()); + // 많이 있는 종류부터 뽑기 위해 내림차순 정렬 + Collections.sort(list, Collections.reverseOrder()); + + // 개수가 많은 귤 종류부터 차례로 더해가며 k개 이상 채우는 최소 종류 수 찾기 + for (int val : list) { + if (num + val >= k) { // 현재까지 누적한 개수 + 현재 종류 개수가 k 이상이면 + count++; // 이 종류까지 포함하면 됨 + break; + } else { + num += val; // 아직 부족하면 누적하고 + count++; // 종류 수 추가 + } + } + + return count; // k개 이상을 만들기 위한 최소 종류 수 반환 + } + } +} diff --git "a/week5/\352\271\200\353\202\230\354\235\200/programmers/\353\215\224_\353\247\265\352\262\214.java" "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\353\215\224_\353\247\265\352\262\214.java" new file mode 100644 index 0000000..a6cccbf --- /dev/null +++ "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\353\215\224_\353\247\265\352\262\214.java" @@ -0,0 +1,46 @@ +package week5.김나은.programmers; + +import java.util.PriorityQueue; + +public class 더_맵게 { + + class Solution { + + public int solution(int[] scoville, int K) { + int answer = 0; // 음식을 섞은 횟수 + + // 우선순위 큐(최소 힙) 선언: 가장 맵지 않은 음식부터 꺼낼 수 있음 + PriorityQueue pq = new PriorityQueue<>(); + + // 모든 스코빌 지수를 우선순위 큐에 넣기 + for (int a : scoville) { + pq.add(a); + } + + // 현재 가장 맵지 않은 음식의 스코빌 지수 확인 + int min = pq.peek(); + + // 가장 작은 스코빌 지수가 목표치(K)보다 작을 동안 반복 + while (min < K) { + + // 2개 이상이 있어야 섞을 수 있음 + if (pq.size() >= 2) { + // 가장 맵지 않은 두 개 꺼내서 새 음식 만들기 + int first = pq.poll(); // 가장 작은 스코빌 + int second = pq.poll(); // 두 번째로 작은 스코빌 + int mixed = first + (second * 2); // 섞은 후 스코빌 + + pq.add(mixed); // 새로 만든 음식 다시 큐에 넣기 + min = pq.peek(); // 다음 최소 스코빌 값 확인 + answer++; // 섞은 횟수 증가 + } else { + // 섞을 수 있는 음식이 2개 미만이면 실패 → -1 반환 + return -1; + } + } + + // 모든 음식이 스코빌 K 이상이면 섞은 횟수 반환 + return answer; + } + } +} diff --git "a/week5/\352\271\200\353\202\230\354\235\200/programmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235\352\270\260.java" "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235\352\270\260.java" new file mode 100644 index 0000000..8b518a7 --- /dev/null +++ "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235\352\270\260.java" @@ -0,0 +1,48 @@ +package week5.김나은.programmers; + +public class 동영상_재생기 { + + class Solution { + + public String solution(String video_len, String pos, String op_start, String op_end, + String[] commands) { + // 문자열로 된 시간을 초 단위 정수로 변환 + int len_s = second(video_len); // 전체 영상 길이 (초 단위) + int current_s = second(pos); // 현재 재생 위치 (초 단위) + int op_start_s = second(op_start); // 오프닝 시작 시간 (초 단위) + int op_end_s = second(op_end); // 오프닝 종료 시간 (초 단위) + + // 현재 위치가 오프닝 구간이면 오프닝 종료 지점으로 이동 + if (current_s >= op_start_s && current_s <= op_end_s) { + current_s = op_end_s; + } + + // 명령어 배열을 하나씩 순회 + for (String command : commands) { + if (command.equals("prev")) { + // "prev"인 경우 10초 전으로 이동 (단, 최소 0초까지) + current_s = Math.max(current_s - 10, 0); + } else { + // "next"인 경우 10초 후로 이동 (단, 영상 길이 초과 금지) + current_s = Math.min(current_s + 10, len_s); + } + + // 이동한 위치가 오프닝 구간에 들어왔다면 다시 오프닝 끝으로 이동 + if (current_s >= op_start_s && current_s <= op_end_s) { + current_s = op_end_s; + } + } + + // 최종 위치를 "MM:SS" 형식 문자열로 변환하여 반환 + String minute = String.format("%02d", current_s / 60); + String second = String.format("%02d", current_s % 60); + return minute + ":" + second; + } + + // "MM:SS" 형식 문자열을 초 단위 정수로 변환하는 함수 + private static int second(String time) { + String[] time_ms = time.split(":"); // "MM:SS" → ["MM", "SS"] + return (Integer.parseInt(time_ms[0]) * 60) + Integer.parseInt(time_ms[1]); + } + } +} diff --git "a/week5/\352\271\200\353\202\230\354\235\200/programmers/\353\266\225\353\214\200_\352\260\220\352\270\260.java" "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\353\266\225\353\214\200_\352\260\220\352\270\260.java" new file mode 100644 index 0000000..e1f602b --- /dev/null +++ "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\353\266\225\353\214\200_\352\260\220\352\270\260.java" @@ -0,0 +1,42 @@ +package week5.김나은.programmers; + +public class 붕대_감기 { + + class Solution { + + public int solution(int[] bandage, int health, int[][] attacks) { + // bandage[0] = 시전 시간 + // bandage[1] = 초당 회복량 + // bandage[2] = 추가 회복량 (연속 시전 성공 시) + + int cnt = bandage[0]; // 추가 체력을 얻기 위한 연속 시전 시간 + int now = health; // 현재 체력 + int std = 0; // 마지막 공격 시점 (기준 시간) + + int v1, v2; // 회복 가능한 시간, 추가 회복 횟수 + + // 각 공격에 대해 순차적으로 처리 + for (int[] atk : attacks) { + if (now <= 0) { + return -1; // 체력이 0 이하가 되면 게임 오버 + } + + v1 = atk[0] - std - 1; // 이번 공격 전까지 남은 회복 시간 + v2 = v1 / cnt; // 추가 회복이 몇 번 가능한지 계산 + + // 공격 직전까지의 회복량 처리 + // 1. 일반 회복: 초당 회복량 * 시간 + now = Math.min(health, now + (v1 * bandage[1])); + + // 2. 추가 회복: 연속 시전 성공 횟수만큼 추가 체력 회복 + now = Math.min(health, now + (v2 * bandage[2])); + + std = atk[0]; // 기준 시간 갱신 + now -= atk[1]; // 이번 공격으로 체력 감소 + } + + // 마지막 공격 이후의 체력 확인 + return now <= 0 ? -1 : now; // 체력이 0 이하이면 -1, 아니면 남은 체력 반환 + } + } +} diff --git "a/week5/\352\271\200\353\202\230\354\235\200/programmers/\354\230\210\354\202\260.java" "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\354\230\210\354\202\260.java" new file mode 100644 index 0000000..127f6d2 --- /dev/null +++ "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\354\230\210\354\202\260.java" @@ -0,0 +1,27 @@ +package week5.김나은.programmers; + +import java.util.Arrays; + +public class 예산 { + + class Solution { + + public int solution(int[] d, int budget) { + int answer = 0; + Arrays.sort(d); // 부서별 신청 금액을 오름차순으로 정렬 (적은 금액부터 먼저 처리하기 위해) + + // 정렬된 부서별 신청 금액 배열을 순회 + for (int i = 0; i < d.length; i++) { + if (d[i] <= budget) { // 현재 부서의 신청 금액이 예산보다 작거나 같으면 + answer += 1; // 지원 가능한 부서 수 증가 + budget -= d[i]; // 해당 금액만큼 예산 차감 + } else { + break; // 예산을 초과하면 반복 중단 (더 이상 지원 불가) + } + } + + return answer; // 지원 가능한 최대 부서 수 반환 + } + } + +} diff --git "a/week5/\352\271\200\353\202\230\354\235\200/programmers/\354\271\264\355\216\253.java" "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\354\271\264\355\216\253.java" new file mode 100644 index 0000000..2bee60f --- /dev/null +++ "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\354\271\264\355\216\253.java" @@ -0,0 +1,30 @@ +package week5.김나은.programmers; + +public class 카펫 { + + class Solution { + + public int[] solution(int brown, int yellow) { + int[] answer = new int[2]; // [가로, 세로]를 저장할 배열 + + // 전체 격자 수 = brown + yellow + for (int i = 3; i < brown + yellow; i++) { + int width = (brown + yellow) / i; // 가로 길이 후보 계산 + + // 세로(i) <= 가로(width) 조건을 만족할 때만 진행 + if (width >= i) { + + // 노란색 영역은 테두리(갈색) 1칸씩 제거한 내부 공간 + // 즉, (세로 - 2) * (가로 - 2) == yellow 여야 함 + if ((i - 2) * (width - 2) == yellow) { + answer[0] = width; // 가로 + answer[1] = i; // 세로 + break; // 조건을 만족했으므로 반복 종료 + } + } + } + + return answer; // [가로, 세로] 반환 + } + } +} diff --git "a/week5/\352\271\200\353\202\230\354\235\200/programmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" new file mode 100644 index 0000000..cf1160c --- /dev/null +++ "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" @@ -0,0 +1,37 @@ +package week5.김나은.programmers; + +public class 타겟_넘버 { + + class Solution { + + public int solution(int[] numbers, int target) { + int answer = 0; + + // DFS를 시작: 초기 인덱스 0, 초기 합계 0에서 시작 + answer = dfs(numbers, 0, 0, target); + + // 가능한 조합의 수를 반환 + return answer; + } + + // DFS 함수: 현재 인덱스 n, 현재 합계 sum, 목표 값 target + int dfs(int[] numbers, int n, int sum, int target) { + // 종료 조건: 모든 숫자를 다 사용했을 때 + if (n == numbers.length) { + // 현재까지의 합이 타겟과 같다면 1 반환 (성공한 경우 1개) + if (sum == target) { + return 1; + } + // 그렇지 않으면 0 반환 (실패한 경우) + return 0; + } + + // 재귀 호출 2가지 경우: + // 1. 현재 숫자를 더한 경우 + // 2. 현재 숫자를 뺀 경우 + // 두 경우의 결과를 합산해서 반환 + return dfs(numbers, n + 1, sum + numbers[n], target) + + dfs(numbers, n + 1, sum - numbers[n], target); + } + } +} diff --git "a/week5/\352\271\200\353\202\230\354\235\200/programmers/\355\224\274\353\241\234\353\217\204.java" "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\355\224\274\353\241\234\353\217\204.java" new file mode 100644 index 0000000..e70a616 --- /dev/null +++ "b/week5/\352\271\200\353\202\230\354\235\200/programmers/\355\224\274\353\241\234\353\217\204.java" @@ -0,0 +1,29 @@ +package week5.김나은.programmers; + +public class 피로도 { + + class Solution { + + public static boolean check[]; + public static int ans = 0; + + public int solution(int k, int[][] dungeons) { + check = new boolean[dungeons.length]; + + dfs(k, dungeons, 0); + + return ans; + } + + public static void dfs(int tired, int[][] dungeons, int cnt) { + for (int i = 0; i < dungeons.length; i++) { + if (!check[i] && dungeons[i][0] <= tired) { + check[i] = true; + dfs(tired - dungeons[i][1], dungeons, cnt + 1); + check[i] = false; + } + } + ans = Math.max(ans, cnt); + } + } +} diff --git "a/week5/\352\271\200\353\210\204\353\246\254/programmers/\352\265\254\353\252\205\353\263\264\355\212\270.java" "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\352\265\254\353\252\205\353\263\264\355\212\270.java" new file mode 100644 index 0000000..6bad362 --- /dev/null +++ "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\352\265\254\353\252\205\353\263\264\355\212\270.java" @@ -0,0 +1,87 @@ +package week5.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week5.김누리.programmers + * FileName : 구명보트 + * Author : 김누리(NRKim) + * Date : 2025-05-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 25. 김누리(NRKim) Initial creation + */ +/* +처음 접근 방법. +일단 Queue를 만들고 people를 queue에 넣고 진행하면 될거라 생각. +그래서 처음에 70 50 80 50 일 때 + +1차 : 70 50 80 50 +limit(100) - 70 = 30 (1명 승차됨); +limit(30) - 50 = -20 (중량오버로 추가 승차 불가); ==> Queue에 다시 offer() +limit(30) - 80 = -50 (중량오버로 추가 승차 불가); ==> Queue에 다시 offer() + +그래서 일단 70인 1명 먼저 보냄 answer++; + +2차 : 50 80 50 +limit(100) - 50 = 50 (1명 승차됨); +limit(50) - 80 = -30 (중량오버로 추가 승차 불가); ==> Queue에 다시 offer() +limit(50) - 50 = 0 (딱중량); + +그래서 50을 2명 태운 100키로로 보냄 answer++; + +3차 : 80 +limit(100) - 80 = 20 (1명 승차됨); +더 태울 사람 없으므로 보낸다 >> answer++; + + +반례 : people = [20, 50, 50, 80], limit = 100 일 경우 + +1차 : 20 50 80 50 +limit(100) - 20 = 80 (1명 승차됨); +limit(80) - 50 = 30 (2명 승차 완료); ==> 보냄 answer++; + +2차 : 80 50 +limit(100) - 80 = 20 (1명 승차됨); +limit(20) - 50 = -30 (중량오버로 추가 승차 불가); ==> Queue에 다시 offer() + +그래서 80zlfh 1명을 보냄 answer++; + +3차 : 50 +limit(100) - 50 = 40 (1명 승차됨); +더 태울 사람 없으므로 보낸다 >> answer++; + +그러나, 20 + 80으로 1번, 50 + 50으로 2번만 보내면 되는데?? + +접근방법 변경 + +1. 정렬 처리 50 50 70 80 +2. left[0번 idx] + right[마지막 idx] <= limit ? left++; + >> 가벼운 사람 + 무거운 사람 <= limit인지 검증용 +3. 2번조건 미충족? right--; +4. 2~3 반복하며 answer++; +*/ + +public class 구명보트 { + public int solution(int[] people, int limit) { + int answer = 0; + int left = 0; + int right = people.length -1; // 마지막번 idx + + Arrays.sort(people); + + while (left <= right) { + // 가장 가벼운 사람 + 가장 무거운 사람이 제한 중량을 안넘는지 판단 + if(people[left] + people[right] <= limit) { + left++; + } + + right--; + answer++; + } + + return answer; + } +} diff --git "a/week5/\352\271\200\353\210\204\353\246\254/programmers/\352\267\244_\352\263\240\353\245\264\352\270\260.java" "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\352\267\244_\352\263\240\353\245\264\352\270\260.java" new file mode 100644 index 0000000..0a3ac2f --- /dev/null +++ "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\352\267\244_\352\263\240\353\245\264\352\270\260.java" @@ -0,0 +1,72 @@ +package week5.김누리.programmers; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week5.김누리.programmers + * FileName : 귤_고르기 + * Author : 김누리(NRKim) + * Date : 2025-05-27 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 27. 김누리(NRKim) Initial creation + */ + +/* + +Case 1 : +입력 값 : [1, 3, 2, 5, 4, 5, 2, 3] +K : 6 >> 8개 중 6개만 pick +정렬 : [1, 2, 2, 3, 3, 4, 5, 5] +22 33 55 + +Case 2 : +입력 값 : [1, 3, 2, 5, 4, 5, 2, 3] +K : 4 >> 8개 중 4개만 pick +정렬 : [1, 2, 2, 3, 3, 4, 5, 5] +22 33 +22 55 +33 55 + +Case 3 : +입력 값 : [1, 1, 1, 1, 2, 2, 2, 3] +K : 2 >> 8개 중 2개만 pick +정렬 : [1, 1, 1, 1, 2, 2, 2, 3] +11 +22 + +*/ + +public class 귤_고르기 { + public int solution(int k, int[] tangerine) { + int answer = 0; + + // 귤의 사이즈 별로 갯수 정리 + Map map = new HashMap<>(); + + for(int t : tangerine) { + map.put(t,map.getOrDefault(t,0)+1); + } + + // 귤의 갯수를 다시 리스트화 + List l = new ArrayList<>(map.values()); + l.sort(Comparator.reverseOrder()); + + int sum = 0; + + // 귤의 갯수를 더해가며, sum 의 값이 k 이상이 되는경우 반복 종료 + for(int i : l) { + sum += i; + answer++; + if (sum >= k) break; + } + + return answer; + } +} diff --git "a/week5/\352\271\200\353\210\204\353\246\254/programmers/\353\215\224_\353\247\265\352\262\214.java" "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\353\215\224_\353\247\265\352\262\214.java" new file mode 100644 index 0000000..10d0aab --- /dev/null +++ "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\353\215\224_\353\247\265\352\262\214.java" @@ -0,0 +1,50 @@ +package week5.김누리.programmers; + +import java.util.PriorityQueue; +import java.util.Queue; + +/** + * PackageName : week5.김누리.programmers + * FileName : 더_맵게 + * Author : 김누리(NRKim) + * Date : 2025-05-27 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 27. 김누리(NRKim) Initial creation + */ + +/* + 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) + + 1. 스코빌 큐(우선순위 큐로) 생성. + 2. 큐.peek() < k? + 2-1. (yes) a = 큐.poll(); // 1 b = 큐.poll(); // 2 + 2-2. 큐.offer(a+(b*2)); + 3. 큐.peek() >= k? + 3-1. 반복 종료 +*/ + +public class 더_맵게 { + public int solution(int[] scoville, int K) { + int answer = 0; + Queue que = new PriorityQueue<>(); + + for(int s : scoville) { + que.offer(s); + } + + while(que.peek() < K) { + if(que.size() == 1) return -1; + + int a = que.poll(); + int b = que.poll(); + int scov = a + (b*2); + que.offer(scov); + answer++; + } + + return answer; + } +} diff --git "a/week5/\352\271\200\353\210\204\353\246\254/programmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235\352\270\260.java" "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235\352\270\260.java" new file mode 100644 index 0000000..63681d6 --- /dev/null +++ "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235\352\270\260.java" @@ -0,0 +1,70 @@ +package week5.김누리.programmers; + +/** + * PackageName : week5.김누리.programmers + * FileName : 동영상_재생기 + * Author : 김누리(NRKim) + * Date : 2025-05-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 29. 김누리(NRKim) Initial creation + */ + +/* +pos : 기준이 되는 재생 위치 +op_start : 오프닝 시작 시각 +op_end : 오프닝 종료 시각 + +명령어 리스트 +prev : 10초 전 +next : 10초 후 + +*/ + +public class 동영상_재생기 { + public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) { + String answer = ""; + int videoLenSec = toSecond(video_len); // 비디오 총 길이 + int startSec = toSecond(op_start); // 오프닝 시작점 + int endSec = toSecond(op_end); // 오프닝 종료시점 + int current = toSecond(pos); // 기준점 + + // 기준점 위치가 오프닝 범위 내에 있으면 오프닝 종료 이후 시점으로 이동 + if (current >= startSec && current <= endSec) { + current = endSec; + } + + // 명령어 처리 + for(String c : commands) { + if(c.equals("next")) { + current += 10; + } else if (c.equals("prev")) { + current -= 10; + } + + // 명령어 처리 했을 때 시점이 00:00 이하일 때. + if(current < 0) current = 0; + + // 명령어 처리 했을 때 시점이 비디오 종료 시점을 넘을 경우 + if(current > videoLenSec) current = videoLenSec; + + // 명령어 처리 했을 때 시점이 오프닝 범위 내에 있을 때 + if (current >= startSec && current <= endSec) current = endSec; + } + + answer = String.format("%02d:%02d", current / 60, current % 60); + + return answer; + } + + // 시간 포맷 >> 초로 변환 + private int toSecond(String time) { + String[] parts = time.split(":"); + int m = Integer.parseInt(parts[0]); + int s = Integer.parseInt(parts[1]); + + return m * 60 + s; + } +} diff --git "a/week5/\352\271\200\353\210\204\353\246\254/programmers/\353\266\225\353\214\200_\352\260\220\352\270\260.java" "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\353\266\225\353\214\200_\352\260\220\352\270\260.java" new file mode 100644 index 0000000..71fbdac --- /dev/null +++ "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\353\266\225\353\214\200_\352\260\220\352\270\260.java" @@ -0,0 +1,90 @@ +package week5.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week5.김누리.programmers + * FileName : 붕대_감기 + * Author : 김누리(NRKim) + * Date : 2025-05-29 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 29. 김누리(NRKim) Initial creation + */ + + +/* + 단순한 반복 문제 + + 1. 지속시간 : bandage[0], + + 2. 시나리오 시간 + int maxTime = attacks[attacks.length-1][0]; + + + 3. 시나리오 시간만큼 반복하며 힐링 및 데미징 처리 + for (int t = 1; t <= time; t++) { + // 3-1. 데미지가 들어올 시간 체크 + // 3-2. 데미지가 들어올 시간 >> 데미징 + // 3-3. 데미지가 들어올 시간 X >> 힐링처리 + }0 + + 4. 처리 이후 리턴처리 + health > 0 ? answer = health : -1; + +*/ + +public class 붕대_감기 { + public int solution(int[] bandage, int health, int[][] attacks) { + int answer = 0; + int last_healing_time = bandage[0]; + int healing = bandage[1]; + int additional_healing = bandage[2]; + int max_time = attacks[attacks.length-1][0]; + int now_hp = health; + int continuity = 0; // 연속 힐링 체크용 cnt + Map map = new HashMap<>(); // 데미지 들어올 타이밍을 관리하기 위한 map + + for(int[] a : attacks) { + map.put(a[0],a[1]); + } + + // System.out.println(map); + + for(int i = 1; i <= max_time; i++) { + // 데미지가 들어올 타이밍 체크 + if (map.containsKey(i)) { + // 데미징 처리 + now_hp -= map.get(i); + if(now_hp <= 0 ) { + // 죽었을 떄 + return -1; + } + continuity = 0; // 치료중 데미지를 입었으니 연속 치료 횟수 초기화 + } else { + // 데미지를 입은 상태 + if (now_hp < health) { + if (continuity + 1 == last_healing_time) { + // 연속치료의 마지막 단계 + now_hp += healing + additional_healing; + continuity = 0; // 붕대 지속시간 다 되었으니 연속 치료 횟수 초기화 + } else { + // 힐링 처리 + now_hp += healing; + continuity++; + } + } + + // 현재 hp와 총 hp 비교해서 최소값을 현재 hp로 + now_hp = Math.min(now_hp, health); + } + } + + answer = now_hp; + + return answer; + } +} diff --git "a/week5/\352\271\200\353\210\204\353\246\254/programmers/\354\230\210\354\202\260.java" "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\354\230\210\354\202\260.java" new file mode 100644 index 0000000..878a757 --- /dev/null +++ "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\354\230\210\354\202\260.java" @@ -0,0 +1,38 @@ +package week5.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week5.김누리.programmers + * FileName : 예산 + * Author : 김누리(NRKim) + * Date : 2025-05-27 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 27. 김누리(NRKim) Initial creation + */ + +/* +1. d 배열 정렬. ex) case 1 : {1,2,3,4,5} +2. d의 요소들을 더함. 이 때 오소들의 합이 budget을 초과한다? >> 반복문 종료 +*/ + +public class 예산 { + public int solution(int[] d, int budget) { + int answer = 0; + int sum = 0; + + Arrays.sort(d); + + for(int dv : d) { + sum += dv; + + if (sum <= budget) answer++; + else break; + } + + return answer; + } +} diff --git "a/week5/\352\271\200\353\210\204\353\246\254/programmers/\354\271\264\355\216\253.java" "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\354\271\264\355\216\253.java" new file mode 100644 index 0000000..f2c8d0b --- /dev/null +++ "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\354\271\264\355\216\253.java" @@ -0,0 +1,63 @@ +package week5.김누리.programmers; + +/** + * PackageName : week5.김누리.programmers + * FileName : 카펫 + * Author : 김누리(NRKim) + * Date : 2025-05-27 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 27. 김누리(NRKim) Initial creation + */ + + +/* +넓이 : brown + yellow +가로의 길이는 최소 3. +ex ) + +■ : 갈색 +□ : 노랑 + +■ ■ ■ +■ □ ■ +■ ■ ■ + +■ ■ ■ ■ +■ □ □ ■ +■ ■ ■ ■ + + +■ ■ ■ ■ ■ ■ ■ ■ +■ □ □ □ □ □ □ ■ +■ □ □ □ □ □ □ ■ +■ □ □ □ □ □ □ ■ +■ □ □ □ □ □ □ ■ +■ ■ ■ ■ ■ ■ ■ ■ + +노란 타일을 감쌀 수 있는 가로의 길이 및 세로의 길이는 3 + +*/ +public class 카펫 { + public int[] solution(int brown, int yellow) { + int ext = brown + yellow; // 넓이 + int w = 3; // 가로의 최소값 (기준) + int h = 0; // 세로의 최소값 + + while (true) { + // 예 : 48 % 7 같은 경우는? + if(ext % w != 0) w++; + + h = ext / w; + + // (w-2) * (h-2) >> 테두리 (brown) 을 제외한 순수 내핵의 사이즈 + if ((w-2) * (h-2) == yellow) { + return new int[] {Math.max(w,h),Math.min(w,h)}; + } + + w++; // 가로값을 늘려줌 + } + } +} diff --git "a/week5/\352\271\200\353\210\204\353\246\254/programmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" new file mode 100644 index 0000000..1c8e8ee --- /dev/null +++ "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" @@ -0,0 +1,47 @@ +package week5.김누리.programmers; + +/** + * PackageName : week5.김누리.programmers + * FileName : 타겟_넘버 + * Author : 김누리(NRKim) + * Date : 2025-05-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 28. 김누리(NRKim) Initial creation + */ + +/* +number[idx] 에 있는 값을 더한다 > dfs > number[idx] 에 있는 값을 뺀다 순번대로 처리 + +dfs의 파라미터는 (숫자 배열, 타겟 수치, 지금 어디쯤 왔는지, 얼마만큼 처리 되었는지) + +dfs 매서드를 불렀을 때 sum == target이면 처리 ㄴㄴ +아니라면? 처리 진행. + +*/ +public class 타겟_넘버 { + int answer = 0; + + public int solution(int[] numbers, int target) { + dfs(numbers, target, 0,0); + + return answer; + } + + public void dfs (int[] numbers, int target, int idx, int sum) { + // numbers에 있는 수를 모두 소진 + if (idx == numbers.length) { + // 지금 처리한 sum 값이 target 값과 일치 하는가 + if(sum == target) { + answer++; + } + + return; + } + + dfs(numbers, target, idx+1,sum + numbers[idx]); // (+ 처리) + dfs(numbers, target, idx+1,sum - numbers[idx]); // (- 처리) + } +} diff --git "a/week5/\352\271\200\353\210\204\353\246\254/programmers/\355\224\274\353\241\234\353\217\204.java" "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\355\224\274\353\241\234\353\217\204.java" new file mode 100644 index 0000000..64ef141 --- /dev/null +++ "b/week5/\352\271\200\353\210\204\353\246\254/programmers/\355\224\274\353\241\234\353\217\204.java" @@ -0,0 +1,49 @@ +package week5.김누리.programmers; + +/** + * PackageName : week5.김누리.programmers + * FileName : 피로도 + * Author : 김누리(NRKim) + * Date : 2025-05-28 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 28. 김누리(NRKim) Initial creation + */ + +/* + 단순히 반복문만 쓰면 되는줄 알았지만 그건 아님. + 재귀를 반복하며 백트래킹을 진행해 봐야하다보니, dfs를 채용해야 함 +*/ + +public class 피로도 { + int answer = 0; + public int solution(int k, int[][] dungeons) { + // 방문 여부 배열 생성 + boolean[] visited = new boolean[dungeons.length]; + + // 재귀 호출 + dfs(k,dungeons,0,visited); + + return answer; + } + + public void dfs (int k, int[][] dungeons, int cnt, boolean[] visited) { + // answer값 최신화 + answer = Math.max(answer,cnt); + + // 던전 만큼 반복 + for(int i = 0; i < dungeons.length; i++) { + if(!visited[i] && dungeons[i][0] <= k) { + visited[i] = true; // 던전 방문 가능하다? 그러면 우선 방문처리 + + // 총합 피로도 깎고, 재귀 호출 + dfs(k-dungeons[i][1],dungeons,cnt+1,visited); + + // 방문 여부 초기화 + visited[i] = false; + } + } + } +} diff --git "a/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\352\265\254\353\252\205\353\263\264\355\212\270.java" "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\352\265\254\353\252\205\353\263\264\355\212\270.java" new file mode 100644 index 0000000..c0bf3b8 --- /dev/null +++ "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\352\265\254\353\252\205\353\263\264\355\212\270.java" @@ -0,0 +1,45 @@ +/** + * PackageName : week5.이상억.progarmmers; + * FileName : 구명보트 + * Author : sangeok + * Date : 2025. 5. 23. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 23. sangeok Initial creation + */ + +// 문제 요구사항 : 한번에 최대 2명 +// 구명보트를 최대한 적게 사용하여 많은 사람을 구하려고 함 +// 사람의 무게를 담은 배열 people / 구명 보트의 무게 제한 limit +// 사람, 구명 보트 무게 40~240kg + +// 접근 방식 : (1) 배열 정렬하고 +// 왼쪽과 오른쪽을 비교해서 limit 안넘으면 둘다 타는거고 넘으면 오른쪽 한사람만 타는거고 + +import java.util.*; + +class Solution { + public int solution(int[] people, int limit) { + int answer = 0; + + Arrays.sort(people); + int leftpeople = 0; + int rightpeople = people.length - 1; + + while( leftpeople <= rightpeople ){ + int sum = people[leftpeople] + people[rightpeople]; + + if (people[leftpeople] + people[rightpeople] <= limit) { + leftpeople++; + rightpeople--; + } else { + rightpeople--; + } + answer++; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\352\267\244_\352\263\240\353\245\264\352\270\260.java" "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\352\267\244_\352\263\240\353\245\264\352\270\260.java" new file mode 100644 index 0000000..bac2545 --- /dev/null +++ "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\352\267\244_\352\263\240\353\245\264\352\270\260.java" @@ -0,0 +1,50 @@ +/** + * PackageName : week5.이상억.progarmmers; + * FileName : 귤_고르기 + * Author : sangeok + * Date : 2025. 5. 23. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 23. sangeok Initial creation + */ + + +//문제 요구사항 : 문제 요구사항 : 귤이 8개 [ 1, 3, 2, 5, 4, 5, 2, 3] => [1, 2, 2, 3, 3, 4, 5, 5] +// 크기가 다른 귤을 최소화 하고 싶음 / 한 상자에 담는 귤의 갯수 : k , 귤 크기 배열 : tangerine +// 크기가 서로 다른 최솟값 : result +// +// +import java.util.*; + +class Solution { + public int solution(int k, int[] tangerine) { + int answer = 0; + + if (k <= 0) return 0; + + int max = 0; + for (int t : tangerine) { + max = Math.max(max, t); + } + + int[] count = new int[max + 1]; + + for (int i : tangerine) { + count[i]++; + } + + Arrays.sort(count); + + for (int i = count.length - 1; i >= 0; i--) { + if (count[i] == 0) break; + if (k <= 0) break; + + k -= count[i]; + answer++; + } + + return answer; + } +} diff --git "a/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\353\215\224_\353\247\265\352\262\214.java" "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\353\215\224_\353\247\265\352\262\214.java" new file mode 100644 index 0000000..e4801e8 --- /dev/null +++ "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\353\215\224_\353\247\265\352\262\214.java" @@ -0,0 +1,43 @@ +/** + * PackageName : week5.이상억.progarmmers; + * FileName : 더_맵게 + * Author : sangeok + * Date : 2025. 5. 23. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 23. sangeok Initial creation + */ + +// 문제 요구사항 : 스코빌 지수를 k 이상으로 만들고 싶음 +// 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) +// 스코빌 지수가 가장 낮은 두 음식을 아래와 같은 방법으로 + +// 접근 방식 : (1) 우선순위 큐 사용해서 반복문 + +import java.util.*; + +class Solution { + public int solution(int[] scoville, int K) { + int answer = 0; + + PriorityQueue pq = new PriorityQueue<>(); + + for (int s : scoville) { + pq.add(s); + } + + while (pq.size() >= 2 && pq.peek() < K) { + int a = pq.poll(); + int b = pq.poll(); + int mixed = a + 2 * b; + pq.add(mixed); + answer++; + } + + if (pq.peek() < K) return -1; + + return answer; + } +} diff --git "a/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235\352\270\260.java" "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235\352\270\260.java" new file mode 100644 index 0000000..ab3f1b7 --- /dev/null +++ "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\353\217\231\354\230\201\354\203\201_\354\236\254\354\203\235\352\270\260.java" @@ -0,0 +1,66 @@ +/** + * PackageName : week5.이상억.progarmmers; + * FileName : 동영상_재생기 + * Author : sangeok + * Date : 2025. 5. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 29. sangeok Initial creation + */ + +//문제 요구사항 : 제공하는 기능 => 10초 전으로 이동, 후로 이동, 오프닝 건너 뛰기 +// "prev" -> 현재 위치에서 -10초/ 10초 미만일 경우 처음 ( 0분 0초) +// "next" -> 현재 위치에서 +10초/ 10초 미만으로 남을 경우 마지막 (= 동영상의 길이 ) +// "오프닝 건너뛰기" -> (op_start <= 현재 위치 <= op_end) 인 경우 자동으로 오프닝이 끝나는 구간 +// video_len = 동영상 길이 나타내는 문자열 +// pos : 기능이 수행되기 직전으 재생 위치 문자열 +// op_start : 오프닝 시작 시간 / op_end : 오프닝 끝나는 시간 +// 사용자의 입력을 나타내는 문자열 배열 : commands +// 사용자의 입력이 모두 끝난 후 동영상의 위치를 " mm : ss " 형식으로 return + +// 접근 방식 : (1) + +import java.util.*; + +class Solution { + public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) { + int videototalsec = timetoseconds(video_len); + int possec = timetoseconds(pos); + int opstartsec = timetoseconds(op_start); + int opendsec = timetoseconds(op_end); + + possec = openingskip(possec, opstartsec, opendsec); + + for (String op : commands) { + switch (op) { + case "next": + possec = Math.min(videototalsec, possec + 10); + break; + case "prev": + possec = Math.max(0, possec - 10); + break; + } + possec = openingskip(possec, opstartsec, opendsec); + } + + return secondtotime(possec); + } + + public static int timetoseconds(String time) { + String[] parts = time.split(":"); + return Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[1]); + } + + public static String secondtotime(int totalseconds) { + return String.format("%02d:%02d", totalseconds / 60, totalseconds % 60); + } + + public static int openingskip(int possec, int opstartsec, int opendsec) { + if (possec >= opstartsec && possec <= opendsec) { + return opendsec; + } + return possec; + } +} diff --git "a/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\353\266\225\353\214\200_\352\260\220\352\270\260.java" "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\353\266\225\353\214\200_\352\260\220\352\270\260.java" new file mode 100644 index 0000000..fe42386 --- /dev/null +++ "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\353\266\225\353\214\200_\352\260\220\352\270\260.java" @@ -0,0 +1,58 @@ +/** + * PackageName : week5.이상억.progarmmers; + * FileName : 붕대_감기 + * Author : sangeok + * Date : 2025. 5. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 29. sangeok Initial creation + */ + + +// 문제 요구사항 : t초 동안 붕대를 감으면 1초마다 x 체력회복 +// t초 연속 붕대를 감는다면 y 만큼 최력 추가 회복 +// 최대 체력 만큼 체력을 추가 회복하는건 불가 +// 공격 당하면 취소고 0초부터 다시 +// 몬스터 공격 받으면 => 정해진 피해량 만큼 체력 줄어듬 0 이하 체력 되면 체력 회복 x +// "bandage" => 붕대 감기 시전 시간, 1초당 회복량, 추가 회복량 / 1 demension +// "health" => 최대 체력 +// "attacks" => 몬스터의 공격 시간 및 피해량 / 2 demension +// 공격 다 받고 죽으면 -1 + +// 접근 방식 : (1) + +// 회고 : 공격 시점에도 회복을 하고 있어 값이 제대로 나오지 않았다. 그래서 -1 을 해 해결 하였다. + // 또한 나는 문제가 회복을 시전시간이 다 되야 회복 되는거로 이해하고 풀어서 시간을 좀 버렸었다.. + +class Solution { + public int solution(int[] bandage, int health, int[][] attacks) { + int currenttime = 0; + int recoverytime = 0; + int maxHealth = health; + + for (int i = 0; i < attacks.length; i++) { + int attacktime = attacks[i][0]; + int time = attacktime - currenttime-1; + + for (int j = 0; j < time; j++) { + health += bandage[1]; + recoverytime++; + if (recoverytime == bandage[0]) { + health += bandage[2]; + recoverytime = 0; + } + + if (health > maxHealth) health = maxHealth; + } + + health -= attacks[i][1]; + if (health <= 0) return -1; + + recoverytime = 0; + currenttime = attacktime; + } + return health; + } +} diff --git "a/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\210\354\202\260.java" "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\210\354\202\260.java" new file mode 100644 index 0000000..18e0915 --- /dev/null +++ "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\210\354\202\260.java" @@ -0,0 +1,36 @@ +package week5.이상억.progarmmers; + +/** + * PackageName : week5.이상억.progarmmers; + * FileName : 예산 + * Author : sangeok + * Date : 2025. 5. 23. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 23. sangeok Initial creation + */ + +// 문제 요구사항 : 신청 금액 배열 d , 예산 budget 일 때 최대 몇개 부서에 물품을 지원 할 수 있는지 + +// 접근 방식 : 정렬 후 작은 수 부터 빼기 + +import java.util.*; + +class Solution { + public int solution(int[] d, int budget) { + int answer = 0; + + Arrays.sort(d); + + for(int cost : d){ + if(cost <= budget) { + budget -= cost ; + answer ++; + } + } + + return answer; + } +} diff --git "a/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\354\271\264\355\216\253.java" "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\354\271\264\355\216\253.java" new file mode 100644 index 0000000..51b7b7a --- /dev/null +++ "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\354\271\264\355\216\253.java" @@ -0,0 +1,29 @@ +/** + * PackageName : week5.이상억.progarmmers; + * FileName : 카펫 + * Author : sangeok + * Date : 2025. 5. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 29. sangeok Initial creation + */ + +class Solution { + public int[] solution(int brown, int yellow) { + int[] answer = new int[2]; + + int total = brown + yellow; + + for(int i = 3; i<= total; i++){ + int j = total / i; + + if( (( i - 2 ) * ( j - 2 )) == yellow ){ + answer[0] = i; + answer[1] = j; + } + } + return answer; + } +} \ No newline at end of file diff --git "a/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" new file mode 100644 index 0000000..792229a --- /dev/null +++ "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\355\203\200\352\262\237_\353\204\230\353\262\204.java" @@ -0,0 +1,57 @@ +/** + * PackageName : week5.이상억.progarmmers; + * FileName : 타겟_넘버 + * Author : sangeok + * Date : 2025. 5. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 29. sangeok Initial creation + */ + +class Solution { + int answer = 0; + + public int solution(int[] numbers, int target) { + dfs(numbers, target, 0, 0); + return answer; + } + + public void dfs(int[] numbers, int target, int idx, int sum) { + if (idx == numbers.length) { + if (sum == target) { + answer++; + } + return; + } + dfs(numbers, target, idx + 1, sum + numbers[idx]); + dfs(numbers, target, idx + 1, sum - numbers[idx]); + } +} + +//import java.util.*; +// +//class Solution { +// public int solution(int[] numbers, int target) { +// int answer = 0; +// +// Stack stack = new Stack<>(); +// stack.push(new int[]{0, 0}); +// +// while (!stack.isEmpty()) { +// int[] current = stack.pop(); +// int idx = current[0]; +// int sum = current[1]; +// +// if (idx == numbers.length) { +// if (sum == target) answer++; +// } else { +// stack.push(new int[]{idx + 1, sum + numbers[idx]}); +// stack.push(new int[]{idx + 1, sum - numbers[idx]}); +// } +// } +// +// return answer; +// } +//} diff --git "a/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\355\224\274\353\241\234\353\217\204.java" "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\355\224\274\353\241\234\353\217\204.java" new file mode 100644 index 0000000..247471f --- /dev/null +++ "b/week5/\354\235\264\354\203\201\354\226\265/progarmmers/\355\224\274\353\241\234\353\217\204.java" @@ -0,0 +1,39 @@ +/** + * PackageName : week5.이상억.progarmmers; + * FileName : 피로도 + * Author : sangeok + * Date : 2025. 5. 29. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 29. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + int max = 0; + + public int solution(int k, int[][] dungeons) { + boolean[] visited = new boolean[dungeons.length]; + dfs(k, dungeons, visited, 0); + return max; + } + + public void dfs(int currentfatigue, int[][] dungeons, boolean[] visited, int count) { + + max = Math.max(max, count); + + for (int i = 0; i < dungeons.length; i++) { + int required = dungeons[i][0]; + int consumed = dungeons[i][1]; + + if (!visited[i] && currentfatigue >= required) { + visited[i] = true; + dfs(currentfatigue - consumed, dungeons, visited, count + 1); + visited[i] = false; + } + } + } +} diff --git "a/week6/\352\260\225\354\204\261\354\232\261/programmers/\352\262\214\354\236\204_\353\247\265_\354\265\234\353\213\250\352\261\260\353\246\254.java" "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\352\262\214\354\236\204_\353\247\265_\354\265\234\353\213\250\352\261\260\353\246\254.java" new file mode 100644 index 0000000..de1ac86 --- /dev/null +++ "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\352\262\214\354\236\204_\353\247\265_\354\265\234\353\213\250\352\261\260\353\246\254.java" @@ -0,0 +1,85 @@ +package week6.강성욱.programmers; + +/** + * PackageName : week6.강성욱.programmers + * FileName : 게임_맵_최단거리 + * Author : Baekgwa + * Date : 2025-06-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-05 Baekgwa Initial creation + */ +import java.util.*; +public class 게임_맵_최단거리 { + //가장 최단거리 찾기 + //경로가 막힌 경우도 있음. 이때는 -1 return + //결론적으로, 가장 빠르게 가는 횟수를 return 해주면됨. + // 1은 갈 수 있는 곳. + // 0은 갈 수 없는 곳. (벽) + // 맵 밖으로 나갈 수 없음. + // Queue + BFS 로 + + class Solution { + private final int[] dx = {-1, 0, 1, 0}; + private final int[] dy = {0, -1, 0, 1}; + + public int solution(int[][] maps) { + //map 사이즈 확인 + int maxY = maps.length; + int maxX = maps[0].length; + int result = -1; + + boolean[][] visited = new boolean[maxY][maxX]; + Queue q = new LinkedList<>(); + //방문한 곳 처리는 중복되어도 됨. 즉, 방문한곳 다시 가면 안됨. + + visited[0][0] = true; + q.offer(new Point(0, 0, 1)); + + while(q.size() > 0) { + Point nowPoint = q.poll(); + int nowX = nowPoint.getX(); + int nowY = nowPoint.getY(); + int nowDepth = nowPoint.getDepth(); + + //종료 조건 + if(nowX == maxX-1 && nowY == maxY-1) { + result = nowDepth; + break; + } + + for(int i=0; i<4; i++) { + int nextX = nowX + dx[i]; + int nextY = nowY + dy[i]; + + if(nextX < 0 || nextY < 0 || nextX >= maxX || nextY >= maxY) continue; //under, over index 확인 + if(maps[nextY][nextX] == 0) continue; //벽에 막힘 + if(visited[nextY][nextX] == true) continue; //이미 간곳이면 다시 갈 필요 없음. + + visited[nextY][nextX] = true; + q.offer(new Point(nextX, nextY, nowDepth + 1)); + } + } + + return result; + } + + public static class Point { + private int x; + private int y; + private int depth; + + public int getX() { return this.x; } + public int getY() { return this.y; } + public int getDepth() { return this.depth; } + + public Point(int x, int y, int depth) { + this.x = x; + this.y = y; + this.depth = depth; + } + } + } +} diff --git "a/week6/\352\260\225\354\204\261\354\232\261/programmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" new file mode 100644 index 0000000..ee4ff55 --- /dev/null +++ "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" @@ -0,0 +1,55 @@ +package week6.강성욱.programmers; + +import java.util.*; + +public class 괄호_회전하기 { + //먼저 올바른 괄호인지 확인하는 메서드 하나 필요. + //괄호 확인은 stack 사용해서 pop 시키는 방식으로 진행? + //열리는건 그냥 push 해서 넣고 + //닫히는 괄호가 들어오면 peek() 해서 마지막껄 확인 후, pop 할 수 있으면 pop (이때 넣지 않고 그냥 이번꺼랑 전에넣은거 pop) + //만약 못하는 케이스가 나오면? 그건 바로 return false 해버려도 될듯? + // 주의할 점, 아무것도 없을때, peek() 하면 뭐나오는지 확인해봐야함 (공식문서) + + class Solution { + public int solution(String s) { + int count = 0; + + for(int i=0; i st = new ArrayDeque<>(); + + for(char c : s.toCharArray()) { + if(c == '[' || c == '{' || c == '(') { + st.push(c); + continue; + } + + if (st.isEmpty()) return false; + + char now = st.peek(); + if ((now == '[' && c == ']') || + (now == '{' && c == '}') || + (now == '(' && c == ')')) { + st.pop(); + } else { + return false; + } + } + + return st.isEmpty(); + } + + private String swap(String s) { + if (s.length() == 0) return s; + return s.substring(1) + s.charAt(0); + } + } +} diff --git "a/week6/\352\260\225\354\204\261\354\232\261/programmers/\353\252\250\354\235\214\354\202\254\354\240\204.java" "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\353\252\250\354\235\214\354\202\254\354\240\204.java" new file mode 100644 index 0000000..5a990e3 --- /dev/null +++ "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\353\252\250\354\235\214\354\202\254\354\240\204.java" @@ -0,0 +1,40 @@ +package week6.강성욱.programmers; + +/** + * PackageName : week6.강성욱.programmers + * FileName : 모음사전 + * Author : Baekgwa + * Date : 2025-06-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-05 Baekgwa Initial creation + */ +public class 모음사전 { + class Solution { + + private static final String words[] = {"A", "E", "I", "O", "U"}; + private int result = 0; + private boolean isFind = false; + + public int solution(String word) { + search(word, "", 0); + return result - 1; + } + + private void search(String target, String currentStr, int depth) { + if(depth > 5 || isFind) return; + + result++; + if(target.equals(currentStr)) { + isFind = true; + return; + } + + for(String word : words) { + search(target, currentStr + word, depth + 1); + } + } + } +} diff --git "a/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\202\274\354\264\235\354\202\254.java" "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\202\274\354\264\235\354\202\254.java" new file mode 100644 index 0000000..58ccf22 --- /dev/null +++ "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\202\274\354\264\235\354\202\254.java" @@ -0,0 +1,30 @@ +package week6.강성욱.programmers; + +public class 삼총사 { + //만약 3중 반복문으로 구한다면? + //최대 13개 + //13^3 = 2179개 케이스 + //실제로는 조합을 구해야하기 때문에 케이스는 훨신 적음 + //13 * 12 * 11 + //할만함. + //--- + //반복문의 사이즈가 정해져있기 때문, 일반 3중 반복문으로 해결 + class Solution { + public int solution(int[] number) { + int count = 0; + int max = number.length; + + for(int first=0; first < max; first++) { + for(int second = first+1; second < max; second++) { + for(int third = second+1; third < max; third++) { + if(number[first] + number[second] + number[third] == 0) { + count++; + } + } + } + } + + return count; + } + } +} diff --git "a/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\204\235\354\234\240_\354\213\234\354\266\224.java" "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\204\235\354\234\240_\354\213\234\354\266\224.java" new file mode 100644 index 0000000..d0270b5 --- /dev/null +++ "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\204\235\354\234\240_\354\213\234\354\266\224.java" @@ -0,0 +1,101 @@ +package week6.강성욱.programmers; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * PackageName : week6.강성욱.programmers + * FileName : 석유_시추 + * Author : Baekgwa + * Date : 2025-06-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-05 Baekgwa Initial creation + */ +public class 석유_시추 { + class Solution { + int[][] map; + boolean[][] visited; + int[] dx = {0, 1, 0, -1}; + int[] dy = {-1, 0, 1, 0}; + int maxX, maxY; + + public int solution(int[][] land) { + maxY = land.length; + maxX = land[0].length; + map = land; + visited = new boolean[maxY][maxX]; + + List clusters = new ArrayList<>(); + int[][] clusterMap = new int[maxY][maxX]; + + for (int y = 0; y < maxY; y++) { + for (int x = 0; x < maxX; x++) { + if (map[y][x] == 1 && !visited[y][x]) { + OilCluster cluster = new OilCluster(clusters.size() + 1); + check(y, x, cluster, clusterMap); + clusters.add(cluster); + } + } + } + + int answer = 0; + for (int x = 0; x < maxX; x++) { + Set uniqueClusters = new HashSet<>(); + int totalOil = 0; + for (int y = 0; y < maxY; y++) { + if (clusterMap[y][x] > 0) { + int clusterIdx = clusterMap[y][x] - 1; + if (!uniqueClusters.contains(clusterIdx)) { + uniqueClusters.add(clusterIdx); + totalOil += clusters.get(clusterIdx).size; + } + } + } + answer = Math.max(answer, totalOil); + } + + return answer; + } + + // 현재 좌표에서 연결된 석유 덩어리 크기를 구해서 cluster, clusterMap에 반영 + private void check(int y, int x, OilCluster cluster, int[][] clusterMap) { + visited[y][x] = true; + cluster.add(); + clusterMap[y][x] = cluster.getIndex(); + + for (int i = 0; i < 4; i++) { + int nx = x + dx[i]; + int ny = y + dy[i]; + + if (nx < 0 || ny < 0 || nx >= maxX || ny >= maxY) continue; + if (map[ny][nx] == 1 && !visited[ny][nx]) { + check(ny, nx, cluster, clusterMap); + } + } + } + + // 석유 덩어리 정보용 class + private static class OilCluster { + private final int index; + private int size; + + OilCluster(int index) { + this.index = index; + this.size = 0; + } + + public int getIndex() { + return this.index; + } + + public void add() { + size++; + } + } + } +} diff --git "a/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\232\224\352\262\251_\354\213\234\354\212\244\355\205\234.java" "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\232\224\352\262\251_\354\213\234\354\212\244\355\205\234.java" new file mode 100644 index 0000000..2ace9b4 --- /dev/null +++ "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\232\224\352\262\251_\354\213\234\354\212\244\355\205\234.java" @@ -0,0 +1,31 @@ +package week6.강성욱.programmers; + +import java.util.*; + +public class 요격_시스템 { + // 단순 반복으로 풀기에는, 범위가 너무 큼. 500,000 개 케이스의 경우의수 너무 큼. + // 문제 가정으로, e 기준으로 오름차순 정렬해두고, 가장 끝지점에 뭐 아이기스? 요격 미사일을 발사하면 됨. + + class Solution { + public int solution(int[][] targets) { + Arrays.sort(targets, (a, b) -> Integer.compare(a[1], b[1])); + int count = 0; + int last = -1; + + for (int[] target : targets) { + int start = target[0]; + int end = target[1]; + + //만약, 현재 시작지점이, 마지막으로 요격 미사일 발사한 위치보다 같거나, 크다면 + //새로운 요격 미사일을 발사해야됨. + //그리고 요격 미사일 발사 횟수 증가 + if(start >= last) { + count++; + last = end; + } + } + + return count; + } + } +} diff --git "a/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\240\204\353\240\245\353\247\235\354\235\204_\353\221\220\352\260\234\353\241\234_\353\202\230\353\210\204\352\270\260.java" "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\240\204\353\240\245\353\247\235\354\235\204_\353\221\220\352\260\234\353\241\234_\353\202\230\353\210\204\352\270\260.java" new file mode 100644 index 0000000..6f06aad --- /dev/null +++ "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\240\204\353\240\245\353\247\235\354\235\204_\353\221\220\352\260\234\353\241\234_\353\202\230\353\210\204\352\270\260.java" @@ -0,0 +1,71 @@ +package week6.강성욱.programmers; + +import java.util.*; + +public class 전력망을_두개로_나누기 { + // 어느 한 지점에서 시작해서, 들릴수 있는 모든 곳을 들린 뒤, 들린 횟수를 count check 하면, 그게 연결된 횟수다. + // [1, 3], [2, 3] 이 있다면, 1->3->2 를 갈 수 있다는 뜻? + // 배열에 담아서, 갈 수 있는가? 없는가를 체크하자. + // 그럼 범위는 [101][101] 에, boolean 을 담아두고, [시작][도착] = true 로 하면, 시작->도착은 갈 수 있다. 라는 뜻으로 판단 + // 반복으로 해결 + // 시간 복잡도는, 모르겠는데 (계산이 안됨 ㅠ), 100 이하라 완탐으로 풀어도될듯. + + class Solution { + public int solution(int n, int[][] wires) { + boolean[][] tree = new boolean[n+1][n+1]; + int startNode = wires[0][0]; //시작 노드는 어느 노드든 상관없는데, 존재만 하면 됨. + + //초기 송전탑 전선 구성 + for(int[] wire : wires) { + int a = wire[0]; + int b = wire[1]; + tree[a][b] = true; + tree[b][a] = true; + } + + int diffResult = Integer.MAX_VALUE; + + //wires + for(int[] wire : wires) { + // 끊어볼 전선의 정보, 추후 다시 연결해야되므로 저장. + int a = wire[0]; + int b = wire[1]; + + // 전선 끊어보기 + tree[a][b] = false; + tree[b][a] = false; + + // startNode 로부터 연결된 개수 점검 + int nowCount = checkConnect(tree, new boolean[101], startNode, n); + int nowCount2 = n - nowCount; + + diffResult = Math.min(Math.abs(nowCount - nowCount2), diffResult); + + // 전선 복구 + tree[a][b] = true; + tree[b][a] = true; + } + + return diffResult; + } + + private int checkConnect(boolean[][] tree, boolean[] visited, int startNode, int n) { + int count = 1; + Queue q = new LinkedList<>(); + q.offer(startNode); + visited[startNode] = true; + + while (!q.isEmpty()) { + int node = q.poll(); + for (int i = 1; i <= n; i++) { + if (tree[node][i] && !visited[i]) { + visited[i] = true; + count++; + q.offer(i); + } + } + } + return count; + } + } +} diff --git "a/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\241\260\354\235\264\354\212\244\355\213\261.java" "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\241\260\354\235\264\354\212\244\355\213\261.java" new file mode 100644 index 0000000..4a2b6c8 --- /dev/null +++ "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\241\260\354\235\264\354\212\244\355\213\261.java" @@ -0,0 +1,86 @@ +package week6.강성욱.programmers; + +/** + * PackageName : week6.강성욱.programmers + * FileName : 조이스틱 + * Author : Baekgwa + * Date : 2025-06-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-05 Baekgwa Initial creation + */ +public class 조이스틱 { + // 맨처음에는, 첫번째 위치에서 시작. + // 첫번째를 맞추고, 두번째 or 마지막 으로 이동하는건, 이득인지 아닌지 해봐야 암. + // 즉, 계산의 영역이 아님. + // 그럼, dfs 로 해서 현재까지 몇번 움직였는지 nowCount 로 확인을 한 후. + // 다음 좌 + 우로 이동해서 맞추도록 이동? + // 몇번째 맞추고 있는지 확인이 필요. (종료 조건으로 활용) + + // 아 이거 dfs 쓰면 더 복잡하다. + // 이거 그냥 단순 계산해도 되겠다. + // 문제되는 부분이, 좌우로 어디로 움직이는게 최적화 인지 인데, + // ABAAAAAAAAAAAB 이런 케이스의 경우 + // 좌측으로 한번가서 마지막꺼 맞추고, 다시 우측으로 두번 움직이면 끝임. + // 즉, 이미 맞춘 곳도 들려야될 수도 있음... + // 복잡하네; + + class Solution { + + public int solution(String name) { + int count = 0; + char[] nameArr = name.toCharArray(); + + // 알파벳 실제 맞추는데 소모되는 횟수 계산 + for(char c : nameArr) { + count += calAlphabet(c); + } + + count += calculateMinCursorMoves(name); + + + return count; + } + + //앞으로 맞추기 + //EX) A -> C 면, 2번 움직이면됨. 아스키 코드표 기억안나니 대충 A = 100, B = 102 라고 치면, B-A 하면 됨. + //뒤로 맞추기 + //EX) A -> Y 면, 2번 움직이면 됨. + //A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z + //1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8 + //A = 1, Y = 27; + //Z 에서, 목표값 빼고, +1 하면됨. + private int calAlphabet(char c) { + int forward = c - 'A'; + int backward = 'Z' - c + 1; + return Math.min(forward, backward); + } + + // 이거 이해 안됨. ㅠㅠㅠㅠ + public int calculateMinCursorMoves(String name) { + int length = name.length(); + int minMove = length - 1; // 최악의 경우: 오른쪽으로만 이동 + + for (int i = 0; i < length; i++) { + int nextIndex = i + 1; + + // 연속된 'A' 구간을 지나감 + while (nextIndex < length && name.charAt(nextIndex) == 'A') { + nextIndex++; + } + + // 커서를 i까지 오른쪽으로 갔다가 → 다시 돌아가서 → nextIndex 이후를 처리 + int moveToI = i; + int moveToEnd = length - nextIndex; + int goBack = Math.min(moveToI, moveToEnd); + + int totalMove = moveToI + moveToEnd + goBack; + minMove = Math.min(minMove, totalMove); + } + + return minMove; + } + } +} diff --git "a/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" new file mode 100644 index 0000000..849ee25 --- /dev/null +++ "b/week6/\352\260\225\354\204\261\354\232\261/programmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" @@ -0,0 +1,31 @@ +package week6.강성욱.programmers; + +import java.util.*; +public class 추억_점수 { + //단순한 Map 활용 문제 + //주의할점은 예시에는 없지만, 문제 내용중에 그리움 점수가 없을 경우도 있다는 점. + + class Solution { + public int[] solution(String[] name, int[] yearning, String[][] photo) { + Map map = new HashMap<>(); + int[] result = new int[photo.length]; + + for(int index=0; index < name.length; index++) { + String nowName = name[index]; + int nowYearning = yearning[index]; + map.put(nowName, nowYearning); + } + + for(int index=0; index answer = new ArrayList<>(); + + public int[][] solution(int n) { + hanoi(n, 1, 3, 2); + // List → int[][] + int[][] result = new int[answer.size()][2]; + for (int i = 0; i < answer.size(); i++) { + result[i] = answer.get(i); + } + return result; + } + + private void hanoi(int n, int from, int to, int via) { + if (n == 1) { + answer.add(new int[]{from, to}); + return; + } + hanoi(n - 1, from, via, to); + answer.add(new int[]{from, to}); + hanoi(n - 1, via, to, from); + } + } +} diff --git "a/week6/\352\271\200\353\202\230\354\235\200/programmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" "b/week6/\352\271\200\353\202\230\354\235\200/programmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" new file mode 100644 index 0000000..913961e --- /dev/null +++ "b/week6/\352\271\200\353\202\230\354\235\200/programmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" @@ -0,0 +1,68 @@ +package week6.김나은.programmers; + +import java.util.ArrayDeque; +import java.util.Deque; + +public class 괄호_회전하기 { + + class Solution { + + public int solution(String s) { + + int count = 0; // 유효한 괄호 문자열의 개수를 저장할 변수 + + // 문자열의 길이만큼 회전하며 검사 + for (int i = 0; i < s.length(); i++) { + // 문자열을 왼쪽으로 한 칸 회전시키기 위한 작업 + + char firstChar = s.charAt(0); // 맨 앞 문자 하나 저장 + s = s.substring(1, s.length()); // 앞 문자 제외한 나머지 문자열 추출 + s = s + firstChar; // 저장해둔 앞 문자를 맨 뒤에 붙여 회전 완료 + boolean isCheck = check(s); // 회전된 문자열이 유효한 괄호 문자열인지 확인 + + if (isCheck == true) { // 유효한 경우 개수 증가 + count++; + } + } + return count; + } + + private boolean check(String s) { + Deque stack = new ArrayDeque<>(); + + // 주어진 문자열 s를 문자 배열로 변환한 후 향상된 for문을 사용해 한 글자씩 순회 + for (Character c : s.toCharArray()) { + // 여는 괄호인 경우, 스택에 넣어준다. + if (c.equals('[') || c.equals('{') || c.equals('(')) { + stack.push(c); + // 여는 괄호인 경우 아래 조건문을 검사할 필요 없으므로 + continue; + } + + // 여는 괄호가 없는데, 닫는 괄호부터 오는 경우 false + if (stack.isEmpty()) { + return false; + } + + // 닫는 괄호인 경우, 마지막에 넣은 괄호랑 매칭이 되는지 확인 + Character lastC = stack.peek(); + if ((lastC.equals('[') && c.equals(']')) || + (lastC.equals('{') && c.equals('}')) || + (lastC.equals('(') && c.equals(')'))) { + stack.pop(); + continue; + } + + // 닫는 괄호인 경우, 스택 마지막 문자(여는 괄호)가 짝이 맞지 않는 경우 + return false; + } + + // 스택이 비어있는 경우, 올바른 괄호 문자열 + if (stack.isEmpty() == true) { + return true; + } + // 스택이 남아있는 경우, 열고 닫지 않은 괄호가 있음 + return false; + } + } +} \ No newline at end of file diff --git "a/week6/\352\271\200\353\202\230\354\235\200/programmers/\354\202\274\354\264\235\354\202\254.java" "b/week6/\352\271\200\353\202\230\354\235\200/programmers/\354\202\274\354\264\235\354\202\254.java" new file mode 100644 index 0000000..d51552a --- /dev/null +++ "b/week6/\352\271\200\353\202\230\354\235\200/programmers/\354\202\274\354\264\235\354\202\254.java" @@ -0,0 +1,25 @@ +package week6.김나은.programmers; + +public class 삼총사 { + + class Solution { + + public int solution(int[] number) { + int answer = 0; + + for (int i = 0; i < number.length - 2; i++) { + for (int j = i + 1; j < number.length - 1; j++) { + for (int k = j + 1; k < number.length; k++) { + if (number[i] + number[j] + number[k] == 0) { + answer++; + } + } + } + } + + return answer; + } + } +} + +// for문을 여러번 사용해야할 것 같아서 다른 방법을 시도해보고 싶었는데, 일단 구글링 없이 풀 수 있는 방법으로 시도해봤다. diff --git "a/week6/\352\271\200\353\202\230\354\235\200/programmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" "b/week6/\352\271\200\353\202\230\354\235\200/programmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" new file mode 100644 index 0000000..7525ff3 --- /dev/null +++ "b/week6/\352\271\200\353\202\230\354\235\200/programmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" @@ -0,0 +1,37 @@ +package week6.김나은.programmers; + +import java.util.HashMap; +import java.util.Map; + +public class 추억_점수 { + + class Solution { + + public int[] solution(String[] name, int[] yearning, String[][] photo) { + + // 각 photo마다 계산된 점수를 담을 배열 선언 (photo의 길이만큼) + int[] answer = new int[photo.length]; + + // name과 yearning 값을 매칭해서 저장할 Map 선언 + Map map = new HashMap<>(); + + // name[i]와 yearning[i]를 map에 저장 (이름&그리움 점수 매칭) + for (int i = 0; i < name.length; i++) { + map.put(name[i], yearning[i]); + } + + // 각 photo 배열을 순회하면서 점수 계산 + int index = 0; // answer 배열의 인덱스 + + for (String[] p : photo) { + for (String s : p) { + // map에서 s(이름)에 해당하는 그리움 점수 가져옴. 없으면 0점 + answer[index] += map.getOrDefault(s, 0); + } + index++; // 다음 photo로 인덱스 증가 + } + + return answer; + } + } +} \ No newline at end of file diff --git "a/week6/\352\271\200\353\210\204\353\246\254/programmers/\352\262\214\354\236\204_\353\247\265_\354\265\234\353\213\250\352\261\260\353\246\254.java" "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\352\262\214\354\236\204_\353\247\265_\354\265\234\353\213\250\352\261\260\353\246\254.java" new file mode 100644 index 0000000..b74f869 --- /dev/null +++ "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\352\262\214\354\236\204_\353\247\265_\354\265\234\353\213\250\352\261\260\353\246\254.java" @@ -0,0 +1,70 @@ +package week6.김누리.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week6.김누리.programmers + * FileName : 게임_맵_최단거리 + * Author : 김누리(NRKim) + * Date : 2025-06-05 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 05. 김누리(NRKim) Initial creation + */ + +/* +계속해서 위치를 갱신해 가며, 방문 했는지? 안했는지? ==> dfs or bfs. + +근데 상하 좌우 이동 할 때 마다 dfs로 재귀 방식으로 하면 메모리 issue 나올것 같으므로 bfs 채용 + +길인지 판단하며 이동 진행 +*/ + +public class 게임_맵_최단거리 { + int n; // maps의 가로 + int m; // maps의 세로 + int[] dx = {-1,1,0,0}; // x축 이동 + int[] dy = {0,0,-1,1}; // y축 이동 + + public int solution(int[][] maps) { + n = maps.length; + m = maps[0].length; + boolean[][] visited = new boolean[n][m]; // 좌표별 방문 위치 + Queue q = new LinkedList<>(); // 이동한 x,y의 위치 저장용 + q.offer(new int[] {0,0,1}); // x,y,이동 거리 + visited[0][0] = true; // 초기 시작 위치는 방문 된 상태니, true + + while(!q.isEmpty()) { + int[] now = q.poll(); // 이동한 위치를 queue에 저장 + int x = now[0], y = now[1], dist = now[2]; + + if (x == n-1 && y == m-1) return dist; // 마지막 위치에 도달하면, 이동한 거리 반환 + + for(int i = 0; i < 4; i++) { + int nx = x + dx[i]; // 새로 이동한 x 좌표 + int ny = y + dy[i]; // 새로 이동한 y 좌표 + + if(!checkRange(nx,ny)) continue; + + if(maps[nx][ny] == 1 && !visited[nx][ny]) { + visited[nx][ny] = true; + q.offer(new int[]{nx,ny,dist+1}); + } + } + } + return -1; // 마지막 위치로 가지 못하는 경우 -1 반환 + } + + + // 이동한 x,y 좌표의 범위가 map 내부에 있는가 + public boolean checkRange(int x,int y) { + if(x < 0 || x >= n || y < 0 || y >= m ) { + return false; + } + + return true; + } +} diff --git "a/week6/\352\271\200\353\210\204\353\246\254/programmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" new file mode 100644 index 0000000..8fbfbd0 --- /dev/null +++ "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" @@ -0,0 +1,69 @@ +package week6.김누리.programmers; + +import java.util.LinkedList; +import java.util.Queue; +import java.util.Stack; + +/** + * PackageName : week6.김누리.programmers + * FileName : 괄호_회전하기 + * Author : 김누리(NRKim) + * Date : 2025-06-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 02. 김누리(NRKim) Initial creation + */ + +/* +Queue 채용 + +s의 각 자리에 있는 문자를 Queue에 입력 +이 후 순환하며 체크 진행 +*/ + +public class 괄호_회전하기 { + public int solution(String s) { + int answer = 0; + Queue que = new LinkedList<>(); + Stackstk = new Stack<>(); + + // 큐 초기화 + for(String ch : s.split("")) { + que.offer(ch); + } + + for (int i = 0; i < que.size(); i++) { + // 현재 괄호 값들이 올바르게 배치 되어 있는가 확인. + for(String ch : que) { + valid(stk,ch); + } + + // 처리 완료 후 스택이 비면 점수 추가 + if (stk.isEmpty()) answer++; + + // 괄호 회전 + que.offer(que.poll()); + + // 스택 초기화 + stk.clear(); + } + + return answer; + } + + public void valid (Stackstk, String ch) { + if(stk.isEmpty()) { + stk.push(ch); + } else if (stk.peek().equals("(") && ch.equals(")")) { + stk.pop(); + } else if (stk.peek().equals("{") && ch.equals("}")) { + stk.pop(); + } else if (stk.peek().equals("[") && ch.equals("]")) { + stk.pop(); + } else { + stk.push(ch); + } + } +} diff --git "a/week6/\352\271\200\353\210\204\353\246\254/programmers/\353\252\250\354\235\214_\354\202\254\354\240\204.java" "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\353\252\250\354\235\214_\354\202\254\354\240\204.java" new file mode 100644 index 0000000..08b2913 --- /dev/null +++ "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\353\252\250\354\235\214_\354\202\254\354\240\204.java" @@ -0,0 +1,48 @@ +package week6.김누리.programmers; + +/** + * PackageName : week6.김누리.programmers + * FileName : 모음_사전 + * Author : 김누리(NRKim) + * Date : 2025-06-01 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 01. 김누리(NRKim) Initial creation + */ +/* +모음 배열 = {"A","E","I","O","U"} + +모음 배열에서 가져오며 조합. 조합하며 카운트 증가. + +*/ + +public class 모음_사전 { + int answer = 0; + int cnt = 0; + String[] gathers = {"A","E","I","O","U"}; + + public int solution(String word) { + + dfs("",word); + + return answer; + } + + public void dfs (String current, String target) { + // 현재 문자조합이 target 문자랑 동일하면 재귀 종료 + if(current.equals(target)) { + answer = cnt; + return; + } + + if(current.length() == 5) return; // 문자 최대 길이는 5 + + // 모음들을 조합하며 채번 + for(String ch : gathers) { + cnt++; + dfs(current + ch, target); + } + } +} diff --git "a/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\202\274\354\264\235\354\202\254.java" "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\202\274\354\264\235\354\202\254.java" new file mode 100644 index 0000000..431603b --- /dev/null +++ "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\202\274\354\264\235\354\202\254.java" @@ -0,0 +1,58 @@ +package week6.김누리.programmers; + +/** + * PackageName : week6.김누리.programmers + * FileName : 삼총사 + * Author : 김누리(NRKim) + * Date : 2025-06-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 02. 김누리(NRKim) Initial creation + */ + +/* + +number 배열을 반복하며 숫자 3개를 더했을 때, 0이 되면 삼총사. + +-2 + 3 + 0 = 1 > NG +-2 + 3 + 2 = 3 > NG +-2 + 3 + (-5) = -4 > NG + +-2 + 0 + 2 = 0 > ++ +-2 + 0 + (-5) = -7 > NG +-2 + 2 + (-5) = -5 > NG + +3 + 0 + 2 = 5 > NG +3 + 0 + (-5) = -2 > NG +3 + 2 + (-5) = 0 > ++ +0 + 2 + (-5) = -3 > NG + +이런식으로 완전 쌩노가다 진행해야함. + +그러면? 어차피? 숫자는 최대 13개만 준다며? >> 3중 for문 해도 될듯 + +*/ + +public class 삼총사 { + public int solution(int[] number) { + int answer = 0; + + for (int i = 0; i < number.length -2; i++) { + int sum = 0; // 3중 for문 돌아가며 들어갈 변수 + + for (int j = i+1; j < number.length -1; j++) { + for(int k = j+1; k < number.length; k++) { + sum = number[i] + number[j] + number[k]; // 숫자 3개 합 + + if (sum == 0) { + answer++; // 3개를 더하고도 0이라면? 카운트 증가 + } + } + } + } + + return answer; + } +} diff --git "a/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\232\224\352\262\251_\354\213\234\354\212\244\355\205\234.java" "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\232\224\352\262\251_\354\213\234\354\212\244\355\205\234.java" new file mode 100644 index 0000000..468d144 --- /dev/null +++ "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\232\224\352\262\251_\354\213\234\354\212\244\355\205\234.java" @@ -0,0 +1,57 @@ +package week6.김누리.programmers; + +import java.util.Arrays; +import java.util.Comparator; + +/** + * PackageName : week6.김누리.programmers + * FileName : 요격_시스템 + * Author : 김누리(NRKim) + * Date : 2025-06-03 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 03. 김누리(NRKim) Initial creation + */ + + +/* + +1,4 +3,7 +4,5 +4,8 +5,12 +10,14 +11,13 + +1 > {1,4} 범위 가드 +4~5 사이 > {3,7}, {4,5}, {4,8} > 범위 가드 +11~12 사이 > {5,12}, {10,14}, {11,13} > 범위 가드 + +x1, x2의 좌표를 기준으로 미사일의 위치를 측정해가며 answer ++ + +*/ +public class 요격_시스템 { + public int solution(int[][] targets) { + int answer = 0; + int last = -1; // 미사일 위치 + + // x1, x2 중 x2 좌표 기준으로 2차원 배열 정렬 + Arrays.sort(targets, Comparator.comparing(o -> o[1])); + + for(int[] target : targets) { + // x1 좌표, x2 좌표 추출 + int x1 = target[0]; + int x2 = target[1]; + + if( last <= x1 ) { + answer++; + last = x2; + } + } + + return answer; + } +} diff --git "a/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\240\204\353\240\245\353\247\235\354\235\204_\353\221\230\353\241\234_\353\202\230\353\210\204\352\270\260.java" "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\240\204\353\240\245\353\247\235\354\235\204_\353\221\230\353\241\234_\353\202\230\353\210\204\352\270\260.java" new file mode 100644 index 0000000..46a7eb7 --- /dev/null +++ "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\240\204\353\240\245\353\247\235\354\235\204_\353\221\230\353\241\234_\353\202\230\353\210\204\352\270\260.java" @@ -0,0 +1,65 @@ +package week6.김누리.programmers; + +/** + * PackageName : week6.김누리.programmers + * FileName : 전력망을_둘로_나누기 + * Author : 김누리(NRKim) + * Date : 2025-06-01 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 01. 김누리(NRKim) Initial creation + */ + +/* +dfs를 채용. + +노드간 간선을 끊었을 때, 갯수선을 끊었을 때, 송전탑의 숫자를 카운트 해야 함 +예) +1-3 부분을 끊으면? 끊어진 곳 : 1 이외 : 8 +( 2-3/ 4-5/ 4-6/ 7-8/ 7-9 ) 부분을 끊으면? 상동 +3-4 부분을 끊으면? 끈어진 곳 : 3 이외 : 6 +(4-7) 부분을 끊으면? 상동 + + + +*/ + +public class 전력망을_둘로_나누기 { + public int solution(int n, int[][] wires) { + int answer = Integer.MAX_VALUE; + + for( int i = 0; i < wires.length ; i++ ) { + boolean[] visited = new boolean[n+1]; + int left = dfs(1,wires,i,visited); // 간선을 끊은 후 한쪽의 노드 갯수 + int right = n - left; // 총 노드 갯수 - left + answer = Math.min(answer, Math.abs(left - right)); + } + + return answer; + } + + public int dfs(int n, int[][] wires, int cutIdx, boolean[] visited) { + visited[n] = true; + int cnt = 1; + // 간선 만큼 반복 + for(int i = 0; i < wires.length; i++) { + // 절삭 대상 idx인 경우는 패스 + if( i == cutIdx ) continue; + + int a = wires[i][0]; // 시작 점 + int b = wires[i][1]; // 끝 점 + + if (a == n && !visited[b]) { + // a 위치에서 b에 방문 안했을 때 + cnt += dfs(b,wires,cutIdx,visited); + } else if (b == n && !visited[a]) { + // b 위치에서 a에 방문 안했을 때 + cnt += dfs(a,wires,cutIdx,visited); + } + } + + return cnt; + } +} diff --git "a/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\241\260\354\235\264\354\212\244\355\213\261.java" "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\241\260\354\235\264\354\212\244\355\213\261.java" new file mode 100644 index 0000000..284a1bc --- /dev/null +++ "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\241\260\354\235\264\354\212\244\355\213\261.java" @@ -0,0 +1,70 @@ +package week6.김누리.programmers; + +/** + * PackageName : week6.김누리.programmers + * FileName : 조이스틱 + * Author : 김누리(NRKim) + * Date : 2025-06-06 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 06. 김누리(NRKim) Initial creation + */ + +/* +문자열 배열 생성 {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"} +name = NRKIM 인 경우 + +N를 만들 수 있는 케이스는 up : 13 or down : 13 +R을 만들 수 있는 케이스는 up : 17 or down : 9 +K을 만들 수 있는 케이스는 up : 10 or down : 16 +I을 만들 수 있는 케이스는 up : 8 or down : 18 +M을 만들 수 있는 케이스는 up : 12 or down : 14 + +고로 이 중 Math.min(up,down)의 결과값 answer로 + +perfect + +변경내용 + +굳이? map을 쓸 이유 ㄴㄴ. 걍 charAt으로 char화 해서 A의 아스키 값 만큼 빼서 진행해도 됨. + +그리고, 단지 up, down만 생각할게 아니라 left right 이동 까지 생각을 해야함. + +*/ + +public class 조이스틱 { + public int solution(String name) { + int answer = 0; + + // up, down 부분 고려. + for(int i = 0; i < name.length(); i++) { + int up = name.charAt(i) - 'A'; // 현재 문자에서, A의 아스키 값만큼 제외. + int down = 26 - up; // 총 26개의 영자 에서 up 만큼 제외 + answer += Math.min(up,down); // up을 눌렀을 때 최소치인지? 아님 down을 눌렀을 때 최소치인디. + } + + // 좌 우 커서 이동 변수 + int minMv = name.length() -1; + + for(int i = 0; i < name.length(); i++) { + int next = i+1; + + while(next < name.length() && name.charAt(next) == 'A') { + next++; // A는 기본 생성자. 예를들어 N__에서 left 했을 때 NA_ 이므로 A는 커서 이동 시 자동 생성자이므로, cnt 증가 + } + + // 오른쪽 으로 쭉 가다 왼쪽으로 돌아오는 경우 + minMv = Math.min(minMv,i + i + name.length() - next); + + // 왼쪽으로 쭉 가다 오른쪽으로 돌아오는 경우 + minMv = Math.min(minMv, (name.length() - next) * 2 + i); + } + + // 좌 우 이동 결과값도 ++ + answer += minMv; + + return answer; + } +} diff --git "a/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" new file mode 100644 index 0000000..98ff8f5 --- /dev/null +++ "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" @@ -0,0 +1,54 @@ +package week6.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week6.김누리.programmers + * FileName : 추억_점수 + * Author : 김누리(NRKim) + * Date : 2025-05-31 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 05. 31. 김누리(NRKim) Initial creation + */ + +/* +해시 맵 이용 + 1. Map map = new HashMap<>(); + 2. map의 key = name[i], value = yearning[i] + 3. photo 배열 순회하면서 getOrDefault() 함수 통해서 점수 계산 + 4. answer의 배열은 photo의 사이즈 만큼 +*/ + +public class 추억_점수 { + public int[] solution(String[] name, int[] yearning, String[][] photo) { + int[] answer = new int[photo.length]; + Map map = new HashMap<>(); + + // map 초기화 + for(int i = 0; i < name.length; i++) { + map.put(name[i],yearning[i]); + } + + // idx 채번용 변수 + int idx = 0; + + for(String[] p : photo) { + int sum = 0; + + for(String n : p) { + // 사진에 인원이있는 경우에만 점수 취득 + if (map.containsKey(n)) { + sum += map.get(n); + } + } + + answer[idx++] = sum; + } + + return answer; + } +} diff --git "a/week6/\352\271\200\353\210\204\353\246\254/programmers/\355\225\230\353\205\270\354\235\264\354\235\230_\355\203\221.java" "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\355\225\230\353\205\270\354\235\264\354\235\230_\355\203\221.java" new file mode 100644 index 0000000..8acc044 --- /dev/null +++ "b/week6/\352\271\200\353\210\204\353\246\254/programmers/\355\225\230\353\205\270\354\235\264\354\235\230_\355\203\221.java" @@ -0,0 +1,71 @@ +package week6.김누리.programmers; + +import java.util.LinkedList; +import java.util.List; + +/** + * PackageName : week6.김누리.programmers + * FileName : 하노이의_탑 + * Author : 김누리(NRKim) + * Date : 2025-06-02 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 02. 김누리(NRKim) Initial creation + */ + +/* +1 에서 3으로 +n = 1인 경우 +1 > 3 ==> return 1; + +n = 2인 경우 +1 > 2 +1 > 3 +2 > 3 + +n = 3인 경우 +1 > 3 +1 > 2 +3 > 2 +1 > 3 +2 > 1 +2 > 3 +1 > 3 + +*/ + +public class 하노이의_탑 { + List lst = new LinkedList<>(); + + public int[][] solution(int n) { + dfs(n,1,2,3); + + int[][] answer = new int [lst.size()][]; + int idx = 0; + + for(int[] arr : lst) { + // + answer[idx++] = arr; + } + return answer; + } + + // left : 1번탑, mid : 2번탑, right : 3번탑 + public void dfs (int n, int left, int mid, int right) { + if ( n == 1 ) { + lst.add(new int[] {left,right}); + return; + } + + // 1번 탑에서 하나 씩 빼서 2번 3번 순으로 + dfs(n-1,left,right,mid); + + // 이동 궤적을 적재 + lst.add(new int[] {left,right}); + + // 2번 탑에서 하나 씩 빼서 1번 3번 순으로 + dfs(n-1,mid,left,right); + } +} diff --git "a/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" new file mode 100644 index 0000000..817e978 --- /dev/null +++ "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.java" @@ -0,0 +1,61 @@ +/** + * PackageName : week6.이상억.progarmmers; + * FileName : 괄호_회전하기 + * Author : sangeok + * Date : 2025. 6. 5. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 5. sangeok Initial creation + */ + +//문제 요구사항 : 문자열 s가 매개변수로 주어짐 s 를 왼쪽으로 x 칸 만큼 회전 시켰을 때 +// s가 올바른 문자열이 되게 하는 x 의 개수 return + +// 접근 방식 : (1) deque 사용 +// 1) 최대 s-1 번 만큼 반복 +// 2) 맨 앞 값 뒤로 회전 +// 3) "(" 의 형식의 괄호면 스택에 담기 아니면 스택에 값 pop 해서 비교 + +// 회고 : 자료구조에 대한 이해가 아직 부족한 것 같다. 아직 머리에 자유자재로 그려지지가 않는다. +import java.util.*; + +class Solution { + public int solution(String s) { + int answer = 0; + Deque deque = new ArrayDeque<>(); + + for (char c : s.toCharArray()) { + deque.addLast(c); + } + + for (int i = 0; i < deque.size(); i++) { + if (isValid(deque)) { + answer++; + } + char front = deque.pollFirst(); + deque.addLast(front); + } + + return answer; + } + + public boolean isValid(Deque dq) { + Stack stack = new Stack<>(); + + for (char c : dq) { + if (c == '(' || c == '[' || c == '{') { + stack.push(c); + } else { + if (stack.isEmpty()) return false; + char top = stack.pop(); + if (c == ')' && top != '(') return false; + if (c == ']' && top != '[') return false; + if (c == '}' && top != '{') return false; + } + } + + return stack.isEmpty(); + } +} diff --git "a/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\353\252\250\354\235\214\354\202\254\354\240\204.java" "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\353\252\250\354\235\214\354\202\254\354\240\204.java" new file mode 100644 index 0000000..1233325 --- /dev/null +++ "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\353\252\250\354\235\214\354\202\254\354\240\204.java" @@ -0,0 +1,48 @@ +/** + * PackageName : week6.이상억.progarmmers; + * FileName : 모음사전 + * Author : sangeok + * Date : 2025. 6. 4. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 4. sangeok Initial creation + */ + +// 문제 요구사항 : A, E , I, O , U 만을 사용하여 만들 수 있는길이 5이하의 단어가 수록 +// 첫번째 단어가 A, 마지막 UUUUU +// word 가 주어질 때 몇 번째 단어인지 + +// 접근 방식 : (1) 문제를 읽고 느낀게 수의 진법으로 나타내는 형식이라고 생각하였음 +// (2) 그래도 탐색문제라 dfs 로 접근 + +// 회고 : 어떻게 해야할지 감이 좀 오긴한다만 그 중간에 코드로 어떻게 해야할지 부분 부분 끊겨 있는 느낌이다. +// 이 과정이 좀 제자리 걸음인 것 같다. 맥빠지긴 하는데 그냥 열심히 하자. + +class Solution { + static char[] di = {'A','E','I','O','U'}; + static String target; + static int count = 0; + static int answer = 0; + + public int solution(String word) { + target = word; + dfs(""); + return answer; + } + + public static void dfs(String current) { + if (current.equals(target)) { + answer = count; + return; + } + + if (current.length() == 5) return; + + for (char c : di) { + count++; + dfs(current + c); + } + } +} diff --git "a/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\202\274\354\264\235\354\202\254.java" "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\202\274\354\264\235\354\202\254.java" new file mode 100644 index 0000000..ae6806d --- /dev/null +++ "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\202\274\354\264\235\354\202\254.java" @@ -0,0 +1,39 @@ +/** + * PackageName : week6.이상억.progarmmers; + * FileName : 삼총사 + * Author : sangeok + * Date : 2025. 5. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 30. sangeok Initial creation + */ + +// 접근 방식 : (1) dfs 로 접근해서 풀었다 + +// 회고 : 보자마자 완전탐색 유형의 문제임이 많이 느껴졌다. for문을 사용해서 푸는 방식이 먼저 떠올랐지만 학습을 위해 dfs 로 시도 해봤다. +// 5주차를 풀고 자신감을 많이 얻고 다른 문제도 쉽게 풀 수 있을거라 생각했지만 아직은 dfs 유형에 더 익숙해져야 함을 느꼈다. + + +class Solution { + int answer = 0; + + public int solution(int[] number) { + dfs(number, 0, 0, 0); + return answer; + } + + public void dfs(int[] number, int idx, int start, int sum) { + if (idx == 3) { + if (sum == 0) { + answer++; + } + return; + } + + for (int i = start; i < number.length; i++) { + dfs(number, idx + 1, i + 1, sum + number[i]); + } + } +} diff --git "a/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\232\224\352\262\251_\354\213\234\354\212\244\355\205\234.java" "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\232\224\352\262\251_\354\213\234\354\212\244\355\205\234.java" new file mode 100644 index 0000000..bd2e759 --- /dev/null +++ "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\232\224\352\262\251_\354\213\234\354\212\244\355\205\234.java" @@ -0,0 +1,38 @@ +/** + * PackageName : week6.이상억.progarmmers; + * FileName : 요격_시스템 + * Author : sangeok + * Date : 2025. 6. 3. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 3. sangeok Initial creation + */ + +//문제 요구사항 : [1,4], [3,7], [4,5], [4,8], [5,12], [10,14], [11,13] +// 이 직선을 다 격추시키려면 3개의 미사일이 필요 + +// 접근 방식 : (1) 미사일이 끝나는 targets[x][1] 기준 정렬 +// 마지막 샷보다 새로 날아오는 미사일의 시작값이 크면 ? -> 새로운 쏴야하는 미사일 시작 + +// 전에 프로그래머스 시험 볼 때 풀지 않았었나 ? 풀었던 문제라 금방 풀었다. +import java.util.*; + +class Solution { + public int solution(int[][] targets) { + int answer = 0; + int shot = -1; + + Arrays.sort(targets, (a, b) -> Integer.compare(a[1], b[1])); + + for (int[] target : targets) { + if (target[0] >= shot) { + answer++; + shot = target[1]; + } + } + + return answer; + } +} diff --git "a/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\204\353\240\245\353\247\235_\353\221\230\353\241\234_\353\202\230\353\210\204\352\270\260.java" "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\204\353\240\245\353\247\235_\353\221\230\353\241\234_\353\202\230\353\210\204\352\270\260.java" new file mode 100644 index 0000000..bdfd73c --- /dev/null +++ "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\204\353\240\245\353\247\235_\353\221\230\353\241\234_\353\202\230\353\210\204\352\270\260.java" @@ -0,0 +1,76 @@ +/** + * PackageName : week6.이상억.progarmmers; + * FileName : 전력망_둘로_나누기 + * Author : sangeok + * Date : 2025. 6. 5. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 5. sangeok Initial creation + */ + +// 문제 요구사항 : 전선을 통해 하나의 트리 형태, 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할 +// 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 +// 송전탑의 개수 : n / 전선 정보 : wires +// [v1, v2] 는 v1번과 v2 번 송전탑이 전선으로 연결 되어 있다는 뜻 + +// 접근 방식 : (1) dfs 로 +// 1) 길이 만큼 반복문 +// 2) 배열(간선) 제거 +// 3) 자른 리스트를 트리로 만들기 +// 4) 한 컴포넌트의 갯수 세서 전체의 노드 수 빼서 절대 값 처리 + +import java.util.*; + +class Solution { + public int solution(int n, int[][] wires) { + int answer = Integer.MAX_VALUE; + + List wirelist = new ArrayList<>(); + for (int[] wire : wires) { + wirelist.add(wire); + } + + for (int i = 0; i < wirelist.size(); i++) { + List wirecopy = new ArrayList<>(wirelist); + wirecopy.remove(i); + + // 그래프 만들기 + List> graph = new ArrayList<>(); + for (int j = 0; j <= n; j++) { + graph.add(new ArrayList<>()); + } + + for (int[] wire : wirecopy) { + int a = wire[0]; + int b = wire[1]; + graph.get(a).add(b); + graph.get(b).add(a); + } + + // 한 쪽 컴포넌트만 DFS 탐색 + boolean[] visited = new boolean[n + 1]; + int count = dfs(graph, visited, 1); // 1번 노드부터 탐색 + + // (3) 나머지는 n - count → 차이의 절댓값 계산 + int diff = Math.abs(n - 2 * count); + answer = Math.min(answer, diff); + } + + return answer; + } + + private int dfs(List> graph, boolean[] visited, int node) { + visited[node] = true; + int count = 1; + + for (int a : graph.get(node)) { + if (!visited[a]) { + count += dfs(graph, visited, a); + } + } + + return count; + } +} diff --git "a/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" new file mode 100644 index 0000000..794cc2e --- /dev/null +++ "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\354\266\224\354\226\265_\354\240\220\354\210\230.java" @@ -0,0 +1,40 @@ +/** + * PackageName : week6.이상억.progarmmers; + * FileName : 추억_점수 + * Author : sangeok + * Date : 2025. 5. 30. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 5. 30. sangeok Initial creation + */ + +// 접근 방식 : (1) hashmap 사용 + +// 회고 : 다른 방식으로 문제를 풀어보려고 했는데 hashmap 이 머리에 박혀서 그냥 이걸로 풀었다. + +import java.util.*; + +class Solution { + public int[] solution(String[] name, int[] yearning, String[][] photo) { + int[] answer = new int[photo.length]; + + Map scoremap = new HashMap<>(); + + for(int i = 0; i < name.length; i++){ + scoremap.put(name[i], yearning[i]); + } + int x = 0 ; + for(String[] a : photo){ + int sum = 0; + for(String b : a){ + sum += scoremap.getOrDefault(b,0); + } + answer[x] = sum; + x++; + + } + return answer; + } +} \ No newline at end of file diff --git "a/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\355\225\230\353\205\270\354\235\264\354\235\230_\355\203\221.java" "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\355\225\230\353\205\270\354\235\264\354\235\230_\355\203\221.java" new file mode 100644 index 0000000..253ef07 --- /dev/null +++ "b/week6/\354\235\264\354\203\201\354\226\265/progarmmers/\355\225\230\353\205\270\354\235\264\354\235\230_\355\203\221.java" @@ -0,0 +1,38 @@ +/** + * PackageName : week6.이상억.progarmmers; + * FileName : 하노이의 탑 + * Author : sangeok + * Date : 2025. 6. 3. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 3. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int[][] solution(int n) { + List list = new ArrayList<>(); + hanoi(n, 1, 3, 2, list); + + int[][] answer = new int[list.size()][2]; + for (int i = 0; i < list.size(); i++) { + answer[i] = list.get(i); + } + return answer; + } + + // 하노이 재귀 함수 (one: 첫번째, three: 3번째, two: 2번째) + public void hanoi(int n, int one, int three, int two, List list) { + if (n == 1) { + list.add(new int[]{one, three}); + return; + } + + hanoi(n - 1, one, two, three, list); // 위 n-1개를 2번째 기둥으로 + list.add(new int[]{one, three}); // 가장 큰 원판 이동 + hanoi(n - 1, two, three, one, list); // 2번째 기둥 → 3번째 기둥 + } +} diff --git "a/week6_a/\352\260\225\354\204\261\354\232\261/programmers/\352\263\265\354\233\220.java" "b/week6_a/\352\260\225\354\204\261\354\232\261/programmers/\352\263\265\354\233\220.java" new file mode 100644 index 0000000..e74f610 --- /dev/null +++ "b/week6_a/\352\260\225\354\204\261\354\232\261/programmers/\352\263\265\354\233\220.java" @@ -0,0 +1,55 @@ +package week6_a.강성욱.programmers; + +import java.util.Arrays; +import java.util.Collections; + +/** + * PackageName : week6_a.강성욱.programmers + * FileName : 공원 + * Author : Baekgwa + * Date : 2025-06-06 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-06 Baekgwa Initial creation + */ +public class 공원 { + + // 해결 아이디어 + // 돗자리를 내림차순으로 정렬 후, 브루트포스로 큰사이즈부터 전부 다 확인하면서, 앉기 가능? 검사 + // 단, out index 안되게 잘 체크해야됨. + class Solution { + public int solution(int[] mats, String[][] park) { + int n = park.length; + int m = park[0].length; + + Integer[] matsObj = Arrays.stream(mats).boxed().toArray(Integer[]::new); + Arrays.sort(matsObj, Collections.reverseOrder()); + + for (int i = 0; i < matsObj.length; i++) { + int size = matsObj[i]; + + for (int y = 0; y <= n - size; y++) { + for (int x = 0; x <= m - size; x++) { + if (possible(park, y, x, size)) { + return size; + } + } + } + } + return -1; + } + + private boolean possible(String[][] park, int y, int x, int size) { + for (int dy = 0; dy < size; dy++) { + for (int dx = 0; dx < size; dx++) { + if (!park[y + dy][x + dx].equals("-1")) { + return false; + } + } + } + return true; + } + } +} \ No newline at end of file diff --git "a/week6_a/\352\260\225\354\204\261\354\232\261/programmers/\353\252\250\354\235\230\352\263\240\354\202\254.java" "b/week6_a/\352\260\225\354\204\261\354\232\261/programmers/\353\252\250\354\235\230\352\263\240\354\202\254.java" new file mode 100644 index 0000000..7cfacf9 --- /dev/null +++ "b/week6_a/\352\260\225\354\204\261\354\232\261/programmers/\353\252\250\354\235\230\352\263\240\354\202\254.java" @@ -0,0 +1,56 @@ +package week6_a.강성욱.programmers; + +import java.util.ArrayList; + +/** + * PackageName : week6_a.강성욱.programmers + * FileName : 모의고사 + * Author : Baekgwa + * Date : 2025-06-06 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-06 Baekgwa Initial creation + */ +public class 모의고사 { + + class Solution { + private static final int[] oneAnswer = {1, 2, 3, 4, 5}; //5 + private static final int[] twoAnswer = {2, 1, 2, 3, 2, 4, 2, 5}; //8 + private static final int[] threeAnswer = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; //10 + + public int[] solution(int[] answers) { + ArrayList result = new ArrayList<>(); //[n번 수포자, 현재점수]; + for(int i=1; i<=3; i++) { + result.add(new int[]{i, 0}); + } + + int testCount = 0; + for(int answer : answers) { + if(oneAnswer[testCount%5] == answer){ + int[] ints = result.get(0); + result.set(0, new int[]{ints[0], ints[1] + 1}); + } + if(twoAnswer[testCount%8] == answer){ + int[] ints = result.get(1); + result.set(1, new int[]{ints[0], ints[1] + 1}); + } + + if(threeAnswer[testCount%10] == answer){ + int[] ints = result.get(2); + result.set(2, new int[]{ints[0], ints[1] + 1}); + } + testCount++; + } + + result.sort((a, b) -> Integer.compare(b[1], a[1])); + int maxValue = result.get(0)[1]; + + return result.stream() + .filter(value -> value[1] == maxValue) + .mapToInt(value -> value[0]) + .toArray(); + } + } +} \ No newline at end of file diff --git "a/week6_a/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\265\354\233\220.java" "b/week6_a/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\265\354\233\220.java" new file mode 100644 index 0000000..e69de29 diff --git "a/week6_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\252\250\354\235\230\352\263\240\354\202\254.java" "b/week6_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\252\250\354\235\230\352\263\240\354\202\254.java" new file mode 100644 index 0000000..26335f4 --- /dev/null +++ "b/week6_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\252\250\354\235\230\352\263\240\354\202\254.java" @@ -0,0 +1,33 @@ +import java.util.*; + +class Solution { + public int[] solution(int[] answers) { + List list = new ArrayList<>(); + + int[] player = new int[3]; + int[] one = {1, 2, 3, 4, 5}; // 길이 5 + int[] two = {2, 1, 2, 3, 2, 4, 2, 5}; // 길이 8 + int[] three = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; // 길이 10 + + for (int i = 0; i < answers.length; i++) { + if (one[i % one.length] == answers[i]) player[0]++; + if (two[i % two.length] == answers[i]) player[1]++; + if (three[i % three.length] == answers[i]) player[2]++; + } + + int max = Math.max(player[0], Math.max(player[1], player[2])); + + for (int i = 0; i < 3; i++) { + if (player[i] == max) { + list.add(i + 1); // 1번, 2번, 3번 + } + } + + int[] answer = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + answer[i] = list.get(i); + } + + return answer; + } +} diff --git "a/week7/\352\260\225\354\204\261\354\232\261/programmers/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" "b/week7/\352\260\225\354\204\261\354\232\261/programmers/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..1140138 --- /dev/null +++ "b/week7/\352\260\225\354\204\261\354\232\261/programmers/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,84 @@ +package week7.강성욱.programmers; + +import java.util.ArrayList; +import java.util.List; + +/** + * PackageName : week7.강성욱.programmers + * FileName : k진수에서_소수_개수_구하기 + * Author : Baekgwa + * Date : 2025-06-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-11 Baekgwa Initial creation + */ +public class k진수에서_소수_개수_구하기 { + //문제가 좀 헷갈리네 + //그러니깐, 즉, 3진수로 바꾸고 + //그걸 파싱해서 쭉 확인을 하는데, 0이 나올때까지 문자를 쭉 이어 붙이면? + //그리고 그게 소수인지 판별을 하면 해결될 거 같은데? + // k진수로 변환하는게 필요. String 으로 처리하자. + // 미리 소수를 구해두고..? 대체 어디까지? -> 최악의 조건에서 3진수로 바꿧을때 어디까지 나오려나...? + // 2222222222220(3) -> 1,594,320(10) 너무 많이 캐싱해야되는데? + // 그리고 너무 복잡함... + // 소수를 판별하려면? + // 그냥 값이 들어오면 반복문으로 해결하자. 만약 너무 큰값 (222222222220 같은게 들어오면 한번이 조금 많이 돌지만 어짜피 한번만 돌면 되서 ㄱㅊ) + // 그럼 1, 2, 조건만 확인하고, 루트까지 반복해서 나눠지는지 검사해보면 될듯 ㅇㅇ + + class Solution { + public int solution(int n, int k) { + int result = 0; + + //k진수 변환 + String kString = Integer.toString(n, k); + + //0 기준으로 끊음 + //211, 2, 1, 1, 11 + String[] kStringToken = tokenizerString(kString); + + //위의 토큰을 소수 판별 + for(String token : kStringToken) { + if(isPrime(Long.parseLong(token))) result++; + } + + return result; + } + + private boolean isPrime(long num) { + if (num == 1) return false; + if (num == 2) return true; + if (num % 2 == 0) return false; + long sqrt = (long)Math.sqrt(num); + for (long i = 3; i <= sqrt; i += 2) { + if (num % i == 0) return false; + } + return true; + } + + //String 값을 0 기준으로 token 처럼 끊는 함수 + private String[] tokenizerString(String kString) { + List tokens = new ArrayList<>(); + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < kString.length(); i++) { + char c = kString.charAt(i); + if (c != '0') { + sb.append(c); + } else { + if (sb.length() > 0) { + tokens.add(sb.toString()); + sb.setLength(0); + } + } + } + // 마지막 토큰 처리 + if (sb.length() > 0) { + tokens.add(sb.toString()); + } + + return tokens.toArray(new String[0]); + } + } +} diff --git "a/week7/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\353\247\216\354\235\264_\353\260\233\354\235\200_\354\204\240\353\254\274.java" "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\353\247\216\354\235\264_\353\260\233\354\235\200_\354\204\240\353\254\274.java" new file mode 100644 index 0000000..48c585f --- /dev/null +++ "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\353\247\216\354\235\264_\353\260\233\354\235\200_\354\204\240\353\254\274.java" @@ -0,0 +1,68 @@ +package week7.강성욱.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week7.강성욱.programmers + * FileName : 가장_많이_받은_선물 + * Author : Baekgwa + * Date : 2025-06-12 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-12 Baekgwa Initial creation + */ +public class 가장_많이_받은_선물 { + //알고리즘이 없는 그냥 구현문제 인듯? + //선물을 주고 받기 위해, 알아야 될 정보는? + //상대방이 나에게 얼만큼 선물을 줬는가? 내가 상대방에게 얼만큼 선물을 줬는가? + //상대방과 나의 선물 점수는 얼마인가? + //내 인덱스 번호는 몇번인가? + + // 주고받은 선물 개수 + // A -> B 2개 선물을 어떻게 저장할까? + // A = 1, B=2 라고 인덱스를 주어주고, gitfCount[to][from] 2차원 배열에 저장. + // 즉, gitfCount[1][2] == 2 라면, 1번인덱스 a가, 2번인덱스 b에게 2개 선물 + + // 나의 선물 지수는 배열로 관리. index 알고있으니 ㄱㅊ을듯 + // 나의 index 번호는 map 으로 관리. (key-value 가 매칭하기 편할듯) + + class Solution { + public int solution(String[] friends, String[] gifts) { + int n = friends.length; + Map nameToIdx = new HashMap<>(); + for (int i = 0; i < n; i++) nameToIdx.put(friends[i], i); + + int[][] giftCount = new int[n][n]; + int[] giftScore = new int[n]; + + // 필요한 정보 정리 + for (String gift : gifts) { + String[] arr = gift.split(" "); + int from = nameToIdx.get(arr[0]); + int to = nameToIdx.get(arr[1]); + giftCount[from][to]++; + giftScore[from]++; // 보낸 사람 +1 + giftScore[to]--; // 받은 사람 -1 + } + + // 다음달 선물 주고 받을 것 계산. + // 전체 다 돌아봐야함 + int[] nextGiftCount = new int[n]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (i == j) continue; + if (giftCount[i][j] > giftCount[j][i]) nextGiftCount[i]++; + else if (giftCount[i][j] == giftCount[j][i] && giftScore[i] > giftScore[j]) nextGiftCount[i]++; + } + } + + // 가장 많은거 return + int result = 0; + for (int now : nextGiftCount) result = Math.max(result, now); + return result; + } + } +} diff --git "a/week7/\352\260\225\354\204\261\354\232\261/programmers/\353\222\244\354\227\220_\354\236\210\353\212\224_\355\201\260_\354\210\230_\354\260\276\352\270\260.java" "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\353\222\244\354\227\220_\354\236\210\353\212\224_\355\201\260_\354\210\230_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..6294355 --- /dev/null +++ "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\353\222\244\354\227\220_\354\236\210\353\212\224_\355\201\260_\354\210\230_\354\260\276\352\270\260.java" @@ -0,0 +1,43 @@ +package week7.강성욱.programmers; + +import java.util.Arrays; +import java.util.Stack; + +/** + * PackageName : week7.강성욱.programmers + * FileName : 뒤에_있는_큰_수_찾기 + * Author : Baekgwa + * Date : 2025-06-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-11 Baekgwa Initial creation + */ +public class 뒤에_있는_큰_수_찾기 { + //아 이거 문제를 잘못읽음 다시 정리 + //1순위가 지금 숫자보다 큰거고, 그다음이 가장 가까운임 + //즉, [2, 1, 100, 200] 은, [100, 100, 200, -1] 이 정답임. + //전체 반복해보니 답이 없이 느렸으니, 뭔가 생각이 필요. + // + + class Solution { + public int[] solution(int[] numbers) { + int n = numbers.length; + int[] answer = new int[n]; + Arrays.fill(answer, -1); + + Stack stack = new Stack<>(); + + for (int i = 0; i < n; i++) { + while (!stack.isEmpty() && numbers[stack.peek()] < numbers[i]) { + int idx = stack.pop(); + answer[idx] = numbers[i]; + } + stack.push(i); + } + + return answer; + } + } +} diff --git "a/week7/\352\260\225\354\204\261\354\232\261/programmers/\353\257\270\353\241\234_\355\203\210\354\266\234.java" "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\353\257\270\353\241\234_\355\203\210\354\266\234.java" new file mode 100644 index 0000000..5ae7eed --- /dev/null +++ "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\353\257\270\353\241\234_\355\203\210\354\266\234.java" @@ -0,0 +1,113 @@ +package week7.강성욱.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week7.강성욱.programmers + * FileName : 미로_탈출 + * Author : Baekgwa + * Date : 2025-06-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-11 Baekgwa Initial creation + */ +public class 미로_탈출 { + //가장 빠른 길찾기 인데, 중간에 무조건 들러야 되는 경유지가 있다. + //그럼 경유지까지 가장 빠르게 들리는게 항상 이득인가? + //맞음. 단, 경유지 (레버)가 여러개라면? 조금 다를수도? => 한개만 존재 한다고 한다. + //그럼 bfs 로 레버까지 찾아서 min 계산하고. + //레버 위치에서, 시작지점으로 가는 bfs 계산 + //이때, visited 배열은 bfs 마다 초기화해서 사용해야됨. [S O E O L] 이럴때, 끝가지 왔다가 다시 가운데로 가야됨. + + public class Solution { + private static final char START = 'S'; + private static final char LABER = 'L'; + private static final char GOAL = 'E'; + private static final char WALL = 'X'; + + private int maxY, maxX; + private final int[] dy = {-1, 1, 0, 0}; + private final int[] dx = {0, 0, -1, 1}; + + public int solution(String[] maps) { + maxY = maps.length; + maxX = maps[0].length(); + + char[][] map = new char[maxY][maxX]; + int sy = 0; + int sx = 0; + int ly = 0; + int lx = 0; + + for (int y = 0; y < maxY; y++) { + for (int x = 0; x < maxX; x++) { + map[y][x] = maps[y].charAt(x); + if (map[y][x] == START) { + sy = y; + sx = x; + } + if (map[y][x] == LABER) { + ly = y; + lx = x; + } + } + } + + int findLaberCount = findCount(map, sy, sx, LABER); + if (findLaberCount == -1) return -1; + int findGoalCount = findCount(map, ly, lx, GOAL); + if (findGoalCount == -1) return -1; + + return findLaberCount + findGoalCount; + } + + private int findCount(char[][] map, int sy, int sx, char target) { + boolean[][] visited = new boolean[maxY][maxX]; + Queue q = new LinkedList<>(); + q.add(new Point(sy, sx, 0)); + visited[sy][sx] = true; + + while (!q.isEmpty()) { + Point p = q.poll(); + if (map[p.getY()][p.getX()] == target) + return p.getDepth(); + for (int d = 0; d < 4; d++) { + int ny = p.getY() + dy[d]; + int nx = p.getX() + dx[d]; + if (ny < 0 || nx < 0 || ny >= maxY || nx >= maxX) continue; + if (map[ny][nx] == WALL || visited[ny][nx]) continue; + visited[ny][nx] = true; + q.add(new Point(ny, nx, p.getDepth() + 1)); + } + } + return -1; + } + + private static class Point { + private final int y; + private final int x; + private final int depth; + + Point(int y, int x, int dist) { + this.y = y; + this.x = x; + this.depth = dist; + } + + public int getY() { + return y; + } + + public int getX() { + return x; + } + + public int getDepth() { + return depth; + } + } + } +} diff --git "a/week7/\352\260\225\354\204\261\354\232\261/programmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" new file mode 100644 index 0000000..2a1d6b5 --- /dev/null +++ "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" @@ -0,0 +1,58 @@ +package week7.강성욱.programmers; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + * PackageName : week7.강성욱.programmers + * FileName : 예상_대진표 + * Author : Baekgwa + * Date : 2025-06-12 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-12 Baekgwa Initial creation + */ +public class 예상_대진표 { + //반복문으로 해결이 가능한가? + //N = 2^20 = 1,048,576 + //1,048,576 + 500,000 + 250,000, + 125000 .... + 2 + //그냥 가능할 듯? + //A와 B는 항상 이기기 때문에, 결승에서는 무조건 만나서 못만나는 경우는 없음! + + class Solution + { + public int solution(int n, int a, int b) + { + Queue q = new LinkedList<>(); + int depth = 0; + for(int i=1; i<=n; i++) { + q.offer(i); + } + + while(q.size() > 1) { + depth++; + List next = new ArrayList<>(); + while(q.size() >= 2) { + int p1 = q.poll(); + int p2 = q.poll(); + if ((p1 == a && p2 == b) || (p1 == b && p2 == a)) { + return depth; + } + // a, b 둘 다 아니면 한 명 아무나 진출(여기서는 p1) + if (p1 == a || p1 == b) next.add(p1); + else if (p2 == a || p2 == b) next.add(p2); + else next.add(p1); // 중요X, 어차피 a/b 아니면 신경X + } + // 다음 라운드 큐 채움 (새로운 번호 부여 효과) + for(int num : next) { + q.offer(num); + } + } + return depth; + } + } +} diff --git "a/week7/\352\260\225\354\204\261\354\232\261/programmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..53f7b11 --- /dev/null +++ "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,28 @@ +package week7.강성욱.programmers; + +/** + * PackageName : week7.강성욱.programmers + * FileName : 음양_더하기 + * Author : Baekgwa + * Date : 2025-06-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-11 Baekgwa Initial creation + */ +public class 음양_더하기 { + // signs에 따라서 + 할지 - 할지 결정하면 될듯 + + class Solution { + public int solution(int[] absolutes, boolean[] signs) { + int result = 0; + for(int i=0; i 일딴 나는 불가 + // 그럼 현재 위치에서, 할 수 있는 행동은, 점프 or 순간이동 2가지 케이스. + // bfs 는 안됨. 결국 다 검색을 해봐야 하는건가? + // dfs 처럼 탐색을 하되, 중간에 min 값을 항시 저장해두고, 만약 min 보다 현재값이 크다면, 바로 종료하도록 해서 최대한 케이스를 줄여야될 듯. + // 위에꺼 실패. 즉, dfs로는 시간초과 + // 도저히 생각이 안남 => 구글링 진행 + // 항상 이득인건, 순간이동이 이득. + // 단, 무한정으로 순간이동만 하면, 타겟위치에 도달할 수 없거나 오히려 중간에 점프를 하는게 이득일 경우도 있음. + // 역순으로 생각해서, 현재 위치가 짝수라면 순간이동, 아니라면 -1 이동이 가장 이득? + // 6 -> 3(순간) -> 2(점프) -> 1(순간) -> 0(점프) + // 500 -> 순간이동 -> 250 -> 순간이동 -> 125 -> 점프 -> 124 -> 순간이동 -> 62 -> 순간이동 -> 31 -> 점프 -> 30 -> 순간이동 -> 15 -> 점프 -> 14 -> 순간이동 -> 7 -> 점프 -> 6 -> 순간이동 -> 3 -> 점프 -> 2 -> 순간이동 -> 1 -> 점프 -> 0 + + //아 5000을 체크해야되네; 에휴 + // 5000 -> 순간이동 -> 2500 -> 순간이동 -> 1250 -> 순간이동 -> 625 -> 점프 -> 624 -> 순간이동 -> 312 -> 순간이동 -> 156 -> 순간이동 -> 78 -> 점프 -> 39 -> 점프 -> 38 -> 순간이동 -> 19 -> 점프 -> 18 -> 순간이동 -> 9 -> 순간이동 -> 8 -> 순간이동 -> 4 -> 순간이동 -> 2 -> 순간이동 -> 1 -> 점프 -> 0 + + public class Solution { + public int solution(int n) { + int ans = 0; + + while(n != 0) { + //순간이동 + if(n%2 == 0) { + n /= 2; + continue; + } + + //점프 + n -= 1; + ans++; + } + + return ans; + } + } +} diff --git "a/week7/\352\260\225\354\204\261\354\232\261/programmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" new file mode 100644 index 0000000..471d2bd --- /dev/null +++ "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" @@ -0,0 +1,38 @@ +package week7.강성욱.programmers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week7.강성욱.programmers + * FileName : 정수_내림차순으로_배치하기 + * Author : Baekgwa + * Date : 2025-06-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-11 Baekgwa Initial creation + */ +public class 정수_내림차순으로_배치하기 { + // long 을 각 자리수로 쪼개야됨. + // long -> String -> char -> 정렬 -> 합쳐서 String -> long 하면 될듯? + class Solution { + public long solution(long n) { + String str = String.valueOf(n); + List list = new ArrayList<>(); + for(char c : str.toCharArray()){ + list.add(c); + } + Collections.sort(list, Collections.reverseOrder()); + + str = ""; + for(char c : list) { + str += c; + } + + return Long.parseLong(str); + } + } +} diff --git "a/week7/\352\260\225\354\204\261\354\232\261/programmers/\355\203\235\353\260\260_\354\203\201\354\236\220_\352\272\274\353\202\264\352\270\260.java" "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\355\203\235\353\260\260_\354\203\201\354\236\220_\352\272\274\353\202\264\352\270\260.java" new file mode 100644 index 0000000..2ea21d2 --- /dev/null +++ "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\355\203\235\353\260\260_\354\203\201\354\236\220_\352\272\274\353\202\264\352\270\260.java" @@ -0,0 +1,59 @@ +package week7.강성욱.programmers; + +/** + * PackageName : week7.강성욱.programmers + * FileName : 택배_상자_꺼내기 + * Author : Baekgwa + * Date : 2025-06-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-11 Baekgwa Initial creation + */ +public class 택배_상자_꺼내기 { + //박스를 다 쌓아두고, 진행하면? 즉, map 을 만들어주는거지 + //그럼 특정 y축 인덱스 위치를 특정할 수 있나? 계산으로? + //생각보다 어려워보임. 차라리 쌓을때부터, 특정 인덱스 위치를 알고있는게 나을듯 + //그럼 쌓으면서, 특정 인덱스에 몇개가 쌓이는지도 확인을 하면 굳이 확인을 계속할 필요도? + //일딴 쌓아보자 + + class Solution { + public int solution(int n, int w, int num) { + int h = (n + w - 1) / w; + int[][] map = new int[h][w]; + int cur = 1; + + int targetRow = -1, targetCol = -1; + + for (int i = 0; i < h; i++) { + if (i % 2 == 0) { + for (int j = 0; j < w && cur <= n; j++) { + map[i][j] = cur; + if (cur == num) { + targetRow = i; + targetCol = j; + } + cur++; + } + } else { + for (int j = w - 1; j >= 0 && cur <= n; j--) { + map[i][j] = cur; + if (cur == num) { + targetRow = i; + targetCol = j; + } + cur++; + } + } + } + + int count = 0; + for (int i = targetRow; i < h; i++) { + if (map[i][targetCol] != 0) count++; + } + + return count; + } + } +} diff --git "a/week7/\352\260\225\354\204\261\354\232\261/programmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" new file mode 100644 index 0000000..77bd022 --- /dev/null +++ "b/week7/\352\260\225\354\204\261\354\232\261/programmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" @@ -0,0 +1,63 @@ +package week7.강성욱.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week7.강성욱.programmers + * FileName : 할인_행사 + * Author : Baekgwa + * Date : 2025-06-12 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-12 Baekgwa Initial creation + */ +public class 할인_행사 { + // 음 각 item 별 개수를 넣어두고 + // discount 또한, map 을 활용해서 chicken:1, apple:1 ... 이런식으로 넣어두고 equals 비교를 하면 되지 않을까? + // 추가적으로 다음 넘어갈때는 discount 의 처음껄 빼서, 새로운걸 넣고? + // 나쁘지는 않을듯? + // 시간도 엄청 오래걸리지는 않을듯 + // =========== + // 지문을 잘못 읽어서, 제품을 모두 할인 받을수 있는 날짜의 시작지점을 return 하는걸로 해석해서 자꾸 틀림 + + class Solution { + public int solution(String[] want, int[] number, String[] discount) { + Map wantMap = new HashMap<>(); + Map discountMap = new HashMap<>(); + + // 원하는 것 + for(int i=0; i stack = new ArrayDeque<>(); + + // 배열을 순회하면서 + for (int i = 0; i < numbers.length; i++) { + // 현재 숫자가 스택의 top에 해당하는 인덱스의 값보다 크다면 + // 해당 인덱스에 대한 "뒤에 있는 큰 수"를 찾은 것 + while (!stack.isEmpty() && numbers[stack.peek()] < numbers[i]) { + // 스택에서 인덱스를 꺼내고 + int index = stack.pop(); + // 해당 위치에 현재 숫자를 저장 + answer[index] = numbers[i]; + } + // 현재 인덱스를 스택에 추가 (아직 뒤에 있는 큰 수를 못 찾은 상태) + stack.push(i); + } + + // 스택에 남아있는 인덱스들은 "뒤에 있는 큰 수"가 없었던 것 + while (!stack.isEmpty()) { + int index = stack.pop(); + answer[index] = -1; // 뒤에 더 큰 수가 없으므로 -1 설정 + } + + return answer; // 결과 배열 반환 + } + } +} \ No newline at end of file diff --git "a/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" "b/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" new file mode 100644 index 0000000..d2193dd --- /dev/null +++ "b/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" @@ -0,0 +1,25 @@ +package week7.김나은.programmers; + +public class 예상_대진표 { + + class Solution { + + public int solution(int n, int a, int b) { + int round = 0; // 현재 라운드 수를 저장 (처음은 0) + + // 두 참가자의 번호가 같아질 때까지 반복 (같아지면 같은 경기를 하게 되는 것) + while (a != b) { + // 다음 라운드에서의 번호는 (현재 번호 + 1) / 2 + // 예: 1번과 2번은 1, 3번과 4번은 2로 매칭됨 + + a = (a + 1) / 2; // a의 다음 라운드 번호 + b = (b + 1) / 2; // b의 다음 라운드 번호 + + round++; // 한 라운드 진행 + } + + // a와 b가 같은 번호가 되는 시점이 둘이 붙는 라운드 + return round; + } + } +} diff --git "a/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" "b/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..9e11744 --- /dev/null +++ "b/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,29 @@ +package week7.김나은.programmers; + +/** + * PackageName : week7.김나은.programmers FileName : 음양_더하기 Author : hellonaeunkim Date : + * 2025-06-08 Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-08 hellonaeunkim Initial creation + */ +public class 음양_더하기 { + + class Solution { + + public int solution(int[] absolutes, boolean[] signs) { + int answer = 0; + + // signs가 false인 경우, signs 인덱스와 같은 absolutes 배열 값을 뺌 + for (int i = 0; i < absolutes.length; i++) { + if (signs[i] == false) { + answer -= absolutes[i]; + } else { + answer += absolutes[i]; + } + } + return answer; + } + } +} \ No newline at end of file diff --git "a/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\240\220\355\224\204\354\231\200_\354\210\234\352\260\204_\354\235\264\353\217\231.java" "b/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\240\220\355\224\204\354\231\200_\354\210\234\352\260\204_\354\235\264\353\217\231.java" new file mode 100644 index 0000000..527bd5b --- /dev/null +++ "b/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\240\220\355\224\204\354\231\200_\354\210\234\352\260\204_\354\235\264\353\217\231.java" @@ -0,0 +1,26 @@ +package week7.김나은.programmers; + +public class 점프와_순간_이동 { + + public class Solution { + + public int solution(int n) { + int ans = 0; // 사용한 건전지 수 + + while (n != 0) { + // n이 홀수인 경우, 이 경우 1칸 점프를 해야 다음 순간이동이 가능하므로 건전지를 1개 사용해야 함 + if (n % 2 == 1) { + ans++; // 점프(건전지 1개 사용) + } + + // n을 2로 나누어 순간이동 (건전지 사용하지 않음) + // 순간이동은 현재 위치의 2배로 이동 가능하므로, + // 반대로 생각하면 n에서 순간이동을 한 번 했다는 의미는 현재 위치가 2배였다는 것 + n /= 2; + } + + // 최종적으로 사용한 건전지(점프한 횟수)를 반환 + return ans; + } + } +} \ No newline at end of file diff --git "a/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" "b/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" new file mode 100644 index 0000000..2c1f163 --- /dev/null +++ "b/week7/\352\271\200\353\202\230\354\235\200/programmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" @@ -0,0 +1,35 @@ +package week7.김나은.programmers; + +import java.util.Arrays; + +/** + * PackageName : week7.김나은.programmers FileName : 정수_내림차순으로_배치하기 Author : hellonaeunkim Date + * : 2025-06-05 Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-05 hellonaeunkim Initial creation + */ +public class 정수_내림차순으로_배치하기 { + + class Solution { + + public long solution(long n) { + + // 내림차순 정렬을 위해 주어진 long 타입의 n을 char 타입의 문자 배열로 변환 + char[] ch = String.valueOf(n).toCharArray(); + + // 우선 오름차순 정렬 + Arrays.sort(ch); + + // 배열을 하나의 문자열로 합치기 + StringBuilder sb = new StringBuilder(); + for (char c : ch) { + sb.append(c); + } + + // 문자열을 long 타입으로 변환, 내림차순 정렬 + return Long.parseLong(sb.reverse().toString()); + } + } +} diff --git "a/week7/\352\271\200\353\202\230\354\235\200/programmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" "b/week7/\352\271\200\353\202\230\354\235\200/programmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" new file mode 100644 index 0000000..a8e8c72 --- /dev/null +++ "b/week7/\352\271\200\353\202\230\354\235\200/programmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" @@ -0,0 +1,47 @@ +package week7.김나은.programmers; + +import java.util.HashMap; +import java.util.Map; + +public class 할인_행사 { + + class Solution { + + public int solution(String[] want, int[] number, String[] discount) { + int answer = 0; // 조건을 만족하는 경우의 수 + int days = 10; // 할인 기간은 연속 10일 + + // 원하는 상품과 수량을 저장할 Map 생성 + Map map = new HashMap<>(); + + for (int i = 0; i < want.length; i++) { + map.put(want[i], number[i]); // 예: {"apple": 3, "banana": 2, ...} + } + + // discount 배열을 10일 단위로 잘라가며 검사 + for (int i = 0; i < discount.length - days + 1; i++) { + Map dMap = new HashMap<>(); // 10일간의 할인 품목 수량을 저장할 Map + + // 현재 i일부터 10일간의 할인 품목 수량 계산 + for (int j = 0; j < days; j++) { + String item = discount[i + j]; + dMap.put(item, dMap.getOrDefault(item, 0) + 1); + } + + // 원하는 상품과 현재 할인 품목이 일치하는지 확인 + boolean isIdentical = true; + for (String key : map.keySet()) { + if (map.get(key) != dMap.get(key)) { // 수량이 다르면 실패 + isIdentical = false; + break; + } + } + + // 조건 만족 시 answer 증가 + answer += isIdentical ? 1 : 0; + } + + return answer; + } + } +} diff --git "a/week7/\352\271\200\353\210\204\353\246\254/programmers/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" "b/week7/\352\271\200\353\210\204\353\246\254/programmers/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..8d2a0a9 --- /dev/null +++ "b/week7/\352\271\200\353\210\204\353\246\254/programmers/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,50 @@ +package week7.김누리.programmers; + +/** + * PackageName : week7.김누리.programmers + * FileName : k진수에서_소수_개수_구하기 + * Author : 김누리(NRKim) + * Date : 2025-06-10 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 10. 김누리(NRKim) Initial creation + */ + +/* +1. m = n을 k진수로 변환 ex : 437674 >> 211020101011 +2. m을 0단위로 쪼개서 list에 저장(배열, stack, queue 편한대로 ㄱㄱ) ex : 211/0/2/0/1/0/1/0/11 +3. 쪼갠 값들이 각각 소수인지 10진수화 해서 판정 + 211 > 2*(3^2) + 1*(3^1) + 1*(3^0) > 18 + 3 + 1 > 22 >> 1 2 11 22 > 소수 아님 + 002 > 2 * (3^0) > 2 >> 1 2 >> 소수 + 001 > 1 * (3^0) > 3 >> 소수 + 011 > 1 * (3^1) + 1 + (3^0) > 5 >> 소수 +*/ + +public class k진수에서_소수_개수_구하기 { + public int solution(int n, int k) { + int answer = 0; + String m = Integer.toString(n,k); + String[] mArr = m.split("0+"); + + for(String ms : mArr) { + if(ms.isEmpty()) continue; + + long a = Long.parseLong(ms); + if(isPrime(a)) answer++; + } + + return answer; + } + + public boolean isPrime(long a) { + if ( a <= 1 ) return false; // 1은 소수아님, 0은 판명 불가 + + for(long i = 2; i * i <= a; i++) { + if(a % i == 0) return false; + } + + return true; + } +} diff --git "a/week7/\352\271\200\353\210\204\353\246\254/programmers/\352\260\200\354\236\245_\353\247\216\354\235\264_\353\260\233\354\235\200_\354\204\240\353\254\274.java" "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\352\260\200\354\236\245_\353\247\216\354\235\264_\353\260\233\354\235\200_\354\204\240\353\254\274.java" new file mode 100644 index 0000000..2cb9fbe --- /dev/null +++ "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\352\260\200\354\236\245_\353\247\216\354\235\264_\353\260\233\354\235\200_\354\204\240\353\254\274.java" @@ -0,0 +1,75 @@ +package week7.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week7.김누리.programmers + * FileName : 가장_많이_받은_선물 + * Author : 김누리(NRKim) + * Date : 2025-06-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 11. 김누리(NRKim) Initial creation + */ + +/* +친구 = ["muzi", "ryan", "frodo", "neo"] +선물 = ["muzi frodo", "muzi frodo", "ryan muzi", "ryan muzi", "ryan muzi", "frodo muzi", "frodo ryan", "neo muzi"] + + + muzi ryan frodo neo +muzi - 0 2 0 +ryan 3 - 0 0 +frodo 1 1 - 0 +neo 1 0 0 - + +위와 같이 그래프 구성 + +선물 주고 받는 기록 정리 + +※ 답지를 보고 풀이함. 다시 풀어볼 필요 있음 +*/ + +public class 가장_많이_받은_선물 { + public int solution(String[] friends, String[] gifts) { + int answer = 0; + Map friendMap = new HashMap<>(); + + // 친구 맵 초기화 + for(int i = 0; i < friends.length;i++) { + friendMap.put(friends[i],i); + } + + int[] present = new int[friends.length]; // 선물지수용 배열 + int[][] fromTo = new int[friends.length][friends.length];// 예시와 같이, 그래프 생성을 위한 2차원 배열 + + for(String gift : gifts) { + String[] g = gift.split(" "); // muzi frodo 형태로 된 from to 문을 space 기준으로 나눔 + present[friendMap.get(g[0])]++; // from ++ + present[friendMap.get(g[1])]--; // to 쪽에 -- + + // n*n 그래프 구성 + fromTo[friendMap.get(g[0])][friendMap.get(g[1])]++; + } + + for (int i = 0; i < friends.length; i++) { + int n = 0; + + for (int j = 0; j < friends.length; j++) { + if (i == j) continue; + + // 선물을 준 횟수 > 받은횟수 or 선물 주고받은 횟수는 같지만, 선물 지수에 차이가 있는 경우 + if(fromTo[i][j] > fromTo[j][i] || + (fromTo[i][j] == fromTo[j][i] && present[i] > present[j]) + ) n++; + + if(answer < n) answer = n; + } + } + + return answer; + } +} diff --git "a/week7/\352\271\200\353\210\204\353\246\254/programmers/\353\222\244\354\227\220_\354\236\210\353\212\224_\355\201\260_\354\210\230_\354\260\276\352\270\260.java" "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\353\222\244\354\227\220_\354\236\210\353\212\224_\355\201\260_\354\210\230_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..33889df --- /dev/null +++ "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\353\222\244\354\227\220_\354\236\210\353\212\224_\355\201\260_\354\210\230_\354\260\276\352\270\260.java" @@ -0,0 +1,46 @@ +package week7.김누리.programmers; + +import java.util.Stack; + +/** + * PackageName : week7.김누리.programmers + * FileName : 뒤에_있는_큰_수_찾기 + * Author : 김누리(NRKim) + * Date : 2025-06-09 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 09. 김누리(NRKim) Initial creation + */ + +/* + answer[0] = numbers[0] >= numbers[1] ? continue : numbers[1] ; + 1차 NG : 2중 for문. 실제로 100만건의 케이스가 들어오면? 100만^2 의 시간이 걸림 + >> Stack을 이용해 보자. + + 스택에는 numbers의 값을 적재 하기 보다 numbers 배열의 idx 자체를 적재 후 진행 +*/ + +public class 뒤에_있는_큰_수_찾기 { + public int[] solution(int[] numbers) { + int[] answer = new int[numbers.length]; + Stack stk = new Stack<>(); + + // answer 배열 초기화 + for(int i = 0; i < answer.length; i++) { + answer[i] = -1; + } + + for(int i = 0; i < numbers.length; i++) { + // 스택의 이전 인덱스 값 보다 현재 인덱스의 값이 더 클 경우 + while (!stk.isEmpty() && numbers[i] > numbers[stk.peek()]) { + answer[stk.pop()] = numbers[i]; + } + + stk.push(i); // 인덱스들을 일단 스택에 저장 + } + + return answer; + } +} diff --git "a/week7/\352\271\200\353\210\204\353\246\254/programmers/\353\257\270\353\241\234_\355\203\210\354\266\234.java" "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\353\257\270\353\241\234_\355\203\210\354\266\234.java" new file mode 100644 index 0000000..7e98288 --- /dev/null +++ "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\353\257\270\353\241\234_\355\203\210\354\266\234.java" @@ -0,0 +1,148 @@ +package week7.김누리.programmers; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * PackageName : week7.김누리.programmers + * FileName : 미로_탈출 + * Author : 김누리(NRKim) + * Date : 2025-06-10 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 10. 김누리(NRKim) Initial creation + */ + +/* +1. S > L로 이동 가능한가? +[ + "SOOOL", + "XXXXO", + "OOOOO", + "OXXXX", + "OOOOE" +] + +의 경우 S > O 이동 가능 (오른쪽으로 가면 됨 ㅇㅇ) + +[ + "LOOXS", + "OOOOX", + "OOOOO", + "OOOOO", + "EOOOO" +] + +의 경우 시작점에서 레버 위치 까지 이동할 수 없으므로 -1 리턴 + +[ + "LOOOS", + "OOOOO", + "OOOOO", + "XOOOO", + "EXOOO" +] + +의 경우에는 E로 이동이 불가능하니 -1 + +[ + "LXOOS", + "XOOOO", + "OOOOO", + "OOOOO", + "EOOOO" +] + +의 경우에는 레버에 가서 문을 열지 못하기 때문에 -1 + +bfs를 채용. +체크 포인트 +1. S에서 못나가는가 +2. L,E 포인트에 접근을 못하는가 +3. 1,2 제약조건에 해당하지 않으면 이동한 거리만큼 return +*/ + +public class 미로_탈출 { + int n; + int m; + + public int solution(String[] maps) { + int answer = 0; + String[][] mapsArr = new String[maps.length][]; + int idx = 0; + + // mapsArr 초기화 + for(String s : maps) { + String[] sArr = s.split(""); + mapsArr[idx++] = sArr; + } + int n = mapsArr.length; + int m = mapsArr[0].length; + int startX = 0; // 시작 X 값 + int startY = 0; // 시작 Y 값 + int lX = 0; // 레버의 X + int lY = 0; // 레버의 Y + + for(int i = 0 ; i < n; i++) { + for(int j = 0; j < m; j++) { + if(mapsArr[i][j].equals("S")) { + startX = j; + startY = i; + } else if (mapsArr[i][j].equals("L")) { + lX = j; + lY = i; + } + } + } + + int lvCnt= bfs(startX, startY, n, m, mapsArr, "L"); // S >> L 까지 이동 횟수 + if ( lvCnt == -1) return -1; + + int eCnt = bfs(lX, lY, n, m, mapsArr, "E"); // L >> E 까지 이동 횟수 + if (eCnt == -1) return -1; + + answer = lvCnt + eCnt; + + return answer; + } + + public int bfs(int startX, int startY, int n, int m, String[][] maps, String target) { + boolean[][] visited = new boolean[n][m]; + Queue q = new LinkedList<>(); + q.offer(new int[] {startX,startY,0}); // 시작점의 X, Y 그리고 이동거리 큐에 적재 + visited[startY][startX] = true; // S든, L이든 시작 포인트는 방문상태로 + + int[] dx = {0,0,-1,1}; + int[] dy = {-1,1,0,0}; + + while(!q.isEmpty()) { + int[] now = q.poll(); + int x = now[0]; // 현재 x 위치 + int y = now[1]; // 현재 y 위치 + int mvCnt = now[2]; // 현재 이동 수 + + // 타겟 (예 : S > L // L > E 등)에 도착한 경우 + if (maps[y][x].equals(target)) { + return mvCnt; + } + + for(int i = 0; i < 4; i++) { + int nx = x+dx[i]; + int ny = y+dy[i]; + + // 지도 범위 벗어난 경우 + if(nx < 0 || ny < 0 || nx >= m || ny >= n) continue; + + // 벽(X) or 방문 지역 + if(maps[ny][nx].equals("X") || visited[ny][nx]) continue; + + visited[ny][nx] = true; // 다음 좌표는 일단 방문 상태로 + q.offer(new int[] {nx,ny,mvCnt + 1}); + } + } + + return -1; + } +} diff --git "a/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" new file mode 100644 index 0000000..49d6cf4 --- /dev/null +++ "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" @@ -0,0 +1,58 @@ +package week7.김누리.programmers; + +/** + * PackageName : week7.김누리.programmers + * FileName : 예상_대진표 + * Author : 김누리(NRKim) + * Date : 2025-06-11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 11. 김누리(NRKim) Initial creation + */ + +/* +* +* 각 노드별로 계산 필요. +* +* 예) +* +* N = 8, A = 4, B = 7인 경우 +* +* +* ┌──4───┐ ┌──7───┐ +* ┌─2─┐ ┌─4─┐ ┌─5─┐ ┌─7─┐ +* 1 2 3 4 5 6 7 8 +* +*이 상황을 구현해야함. +* +* a = 4/2 + 4%2 ==> 2 + 0 ==> 2 // b = 8/2 + 8%2 ==> 4 + 0 == >4 // a != b answer++ +* a = 2/2 + 2%2 ==> 1 + 0 ==> 1 // b = 4/2 + 4%2 ==> 2 + 0 ==> 2 // a != b answer++ +* a = 1/2 + 1%2 ==> 0 + 1 ==> 1 // b = 2/2 + 2%2 ==> 1 + 0 ==> 1 // a == b return +* +* a = a/2 + a%2 사유 : +* 다음 라운드에서의 번호 계산을 위함. +* a = 홀수인 경우 a%2 처리 짝수번호는 a/2 처리의 결과 값이랑 같기 때문에 진행해야 함 +* +* +* */ + +public class 예상_대진표 { + public int solution(int n, int a, int b) + { + int answer = 1; + + while(true) { + a = a/2 + a%2; + b = b/2 + b%2; + + if(a==b) { + return answer; + } else { + answer++; + } + } + + } +} diff --git "a/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..91a7666 --- /dev/null +++ "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,35 @@ +package week7.김누리.programmers; + +/** + * PackageName : week7.김누리.programmers + * FileName : 음양_더하기 + * Author : 김누리(NRKim) + * Date : 2025-06-09 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 09. 김누리(NRKim) Initial creation + */ + +/* +* +* 간단한 흐름 +* 1. signs 배열 만큼 반복 +* 2. signs[i]의 값이 true다 ? + 기능을, false다 ? - 기능을 하면 됨 +* +*/ +public class 음양_더하기 { + public int solution(int[] absolutes, boolean[] signs) { + int answer = 0; + + for(int i = 0; i < signs.length; i++) { + if(signs[i]) { + answer += absolutes[i]; + } else if (!signs[i]) { + answer -= absolutes[i]; + } + } + return answer; + } +} diff --git "a/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\240\220\355\224\204\354\231\200_\354\210\234\352\260\204_\354\235\264\353\217\231.java" "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\240\220\355\224\204\354\231\200_\354\210\234\352\260\204_\354\235\264\353\217\231.java" new file mode 100644 index 0000000..b545661 --- /dev/null +++ "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\240\220\355\224\204\354\231\200_\354\210\234\352\260\204_\354\235\264\353\217\231.java" @@ -0,0 +1,53 @@ +package week7.김누리.programmers; + +/** + * PackageName : week7.김누리.programmers + * FileName : 점프와_순간_이동 + * Author : 김누리(NRKim) + * Date : 2025-06-08 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 08. 김누리(NRKim) Initial creation + */ + +/* +텔포를 하려면 필연적으로 점프가 필요 (텔포 = 현재 이동거리 * 2) +그러면 일단 점프가 선행되어야 함 + +그러면 점프만 계속 한다면? 에너지가 계속 1 씩 소모 + +5칸을 가야 한다면? +1 1 1 1 1 >> 1씩 이동하기만 하면? 5에너지 필요 +1칸 이동 순간이동 > 2 순간이동 > 4 나머지는 점프 + +가능한 그럼 텔포를 많이 써야하는데... 텔포는 어떻게? + +만약 5를 이동해야 한다 초기 0상태에서는 못쓰지 ㅇㅇ + +그럼 1 점프 한 상테 > 한번 텔포 *2가 되어 2로, 추가 텔포 4 4 > 5 갈때는 점프 + +*/ + +public class 점프와_순간_이동 { + int ans = 0; + + public int solution(int n) { + + dfs(n); + + return ans; + } + + public void dfs(int n) { + if (n == 0) return; + + if (n % 2 == 0) { + dfs(n/2); // 텔레포트 할 때 + } else { + dfs(n-1); // 점프 할 때 + ans++; // 에너지 소모량 + } + } +} diff --git "a/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" new file mode 100644 index 0000000..4da334e --- /dev/null +++ "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" @@ -0,0 +1,46 @@ +package week7.김누리.programmers; + +import java.util.Arrays; + +/** + * PackageName : week7.김누리.programmers + * FileName : 정수_내림차순으로_배치하기 + * Author : 김누리(NRKim) + * Date : 2025-06-09 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 09. 김누리(NRKim) Initial creation + */ + +/* +* +* 간단한 흐름 정리 +* 1. long n을 String 타입으로 변환 +* 2. 1의 결과값을 각 자리별로 분해 +* 3. 정렬 +* 4. String 타입 >> Long 타입으로 +* +*/ + +public class 정수_내림차순으로_배치하기 { + public long solution(long n) { + long answer = 0; + String v = Long.toString(n); + String[] vArr = v.split(""); + StringBuilder sb = new StringBuilder(); + + Arrays.sort(vArr); + + for(int i = vArr.length-1; i >= 0; i--) { + sb.append(vArr[i]); + } + + String tmp = sb.toString(); + + answer = Long.parseLong(tmp); + + return answer; + } +} diff --git "a/week7/\352\271\200\353\210\204\353\246\254/programmers/\355\203\235\353\260\260_\354\203\201\354\236\220_\352\272\274\353\202\264\352\270\260.java" "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\355\203\235\353\260\260_\354\203\201\354\236\220_\352\272\274\353\202\264\352\270\260.java" new file mode 100644 index 0000000..92380ce --- /dev/null +++ "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\355\203\235\353\260\260_\354\203\201\354\236\220_\352\272\274\353\202\264\352\270\260.java" @@ -0,0 +1,86 @@ +package week7.김누리.programmers; + +/** + * PackageName : week7.김누리.programmers + * FileName : 택배_상자_꺼내기 + * Author : 김누리(NRKim) + * Date : 2025-06-10 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 10. 김누리(NRKim) Initial creation + */ + +/* +n = 총 택배 상자 수 +w = 가로로 쌓일 택배 상자 수 +num = 타겟 박스 상자 + + +1. 박스 쌓기 +1 ~ w 까지는 오른쪽 +w+1 ~ 2w 까지는 왼쪽 +2w+1 ~ 3w는 다시 오른쪽 +3w+1 ~ n 까지 왼쪽 + +2. num 의 위치 파악 후, num이 위치한 행의 위에 있는 택배 상자 갯수들 cnt + +case 1 : +n = 22 / w = 6 / num = 08 + 22 21 20 19 +13 14 15 16 17 18 +12 11 10 09 08 07 +01 02 03 04 05 06 + +1 ~ 22 까지 반복을 하되, 이 때, 순번을 잘 잡아야됨 + +*/ + +public class 택배_상자_꺼내기 { + public int solution(int n, int w, int num) { + int answer = 0; + int box = 1; // 박스 번호 1 ~ w 까지 + + // 박스 쌓을 배열 + // 행을 n+w-1로 잡은 이유 :n/w으로 했을때 딱 떨어지지 않을 가능성이 있음 + int[][] tmp = new int[(n+w-1)/w][w]; + + // 택배 상자 쌓아 올림 + for (int i = 0; i < tmp.length;i++) { + // 왼 >> 오 로직 + if(i % 2 == 0) { + for(int j = 0; j < w && box <= n; j++ ) { + tmp[i][j] = box++; + } + } else { + // 오 >> 왼 로직 + for (int j = w-1; j >=0 && box <= n; j--) { + tmp[i][j] = box++; + } + } + } + + int targetRow = 0; + int targetCol = 0; + + // num의 위치 추적 + for(int i = 0; i < tmp.length; i++) { + for(int j = 0; j = targetRow; i--) { + if(tmp[i][targetCol] != 0) answer++; + } + + return answer; + } +} diff --git "a/week7/\352\271\200\353\210\204\353\246\254/programmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" new file mode 100644 index 0000000..d57a2fc --- /dev/null +++ "b/week7/\352\271\200\353\210\204\353\246\254/programmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" @@ -0,0 +1,92 @@ +package week7.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week7.김누리.programmers + * FileName : 할인_행사 + * Author : 김누리(NRKim) + * Date : 2025-06-12 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 12. 김누리(NRKim) Initial creation + */ + + +/* +want = ["banana", "apple", "rice", "pork", "pot"] +number = [3, 2, 2, 2, 1] + +map = {banana = 3, apple = 2, rice = 2, pork = 2, port = 1} + +discount = ["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"] + +1일차 = "chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice" >> + chicken = 1, apple = 3, banana = 2, rice = 2, pork = 2 >> banana 1개 부족, port 못삼 + +2일차 = "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot" + apple = 3 banana = 2 rice = 2 pork =2 pot = 1 >> banana 1개 부족 + +3일차 = "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana" + apple = 2, banana = 3, rice = 2, pork = 2, pot = 1 + +그러므로 3일차에 가입 해야 함. + +그러면.. + +맵 2개 쓰면 좋지 않을까? +효찬이가 원하는 map +예 ) map = {banana = 3, apple = 2, rice = 2, pork = 2, pot = 1} + +idx = 부터 10개 취득하며 map 구성 +예 ) +1일차 +map2 = {"chicken" = 1, "apple" = 3, "banana" = 2, "rice" = 2, "pork" = 2} + +그리고 map.getKeys(chicken) == map2.getKeys(chicken) ? tmp++ : tmp = 0, days++; + +if(tmp != 0) return answer + +*/ + +public class 할인_행사 { + public int solution(String[] want, int[] number, String[] discount) { + int answer = 0; + Map map = new HashMap<>(); // 효찬이가 원하는 물품 map + + // 원하는 물자 맵 초기화 + for(int i = 0; i < number.length; i++) { + map.put(want[i],number[i]); + } + + + // 할인 물품을 탐색하며, 비교 작업 진행 + for(int i = 0; i < discount.length - 9; i++) { + Mapmap2 = new HashMap<>(); + + // 현재 위치에서 부터 10개 취득 + for(int j = i; j < i + 10; j++) { + // + String tmp = discount[j]; // 할인 대상 물품 + map2.put(tmp, map2.getOrDefault(tmp,0)+1); + } + + boolean same = true; + + // map2에 원하는 물품 갯수랑 map에 있는 물품 갯수 비교. 만약 동일하지 않으면 다시 반복문으로 돌아가 진행 + for(String w : want) { + if(map2.getOrDefault(w,0) != map.get(w)) { + same = false; + break; + } + } + + if(same) answer++; + } + + return answer; + } +} diff --git "a/week7/\354\235\264\354\203\201\354\226\265/progarmmers/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..944d373 --- /dev/null +++ "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,52 @@ +/** + * PackageName : week7.이상억.progarmmers; + * FileName : k진수에서_소수_구하기 + * Author : sangeok + * Date : 2025. 6. 11. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 11. sangeok Initial creation + */ + + +class Solution { + public int solution(int n, int k) { + int answer = 0; + + String converted = convert(n, k); + + String[] parts = converted.split("0"); + + for (String part : parts) { + + if (part.isEmpty()) continue; // 빈 문자열 제외 + if (part.contains("0")) continue; // 0 포함된 숫자 제외 + + long num = Long.parseLong(part); + if (isPrime(num)) { + answer++; + } + } + + return answer; + } + + public String convert(int n, int k) { + StringBuilder sb = new StringBuilder(); + while (n > 0) { + sb.insert(0, n % k); + n /= k; + } + return sb.toString(); + } + + public boolean isPrime(long num) { + if (num < 2) return false; + for (long i = 2; i * i <= num; i++) { + if (num % i == 0) return false; + } + return true; + } +} diff --git "a/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\353\247\216\354\235\264_\353\260\233\354\235\200_\354\204\240\353\254\274.java" "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\353\247\216\354\235\264_\353\260\233\354\235\200_\354\204\240\353\254\274.java" new file mode 100644 index 0000000..e69de29 diff --git "a/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\353\222\244\354\227\220_\354\236\210\353\212\224_\355\201\260_\354\210\230_\354\260\276\352\270\260.java" "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\353\222\244\354\227\220_\354\236\210\353\212\224_\355\201\260_\354\210\230_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..7075481 --- /dev/null +++ "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\353\222\244\354\227\220_\354\236\210\353\212\224_\355\201\260_\354\210\230_\354\260\276\352\270\260.java" @@ -0,0 +1,39 @@ +/** + * PackageName : week7.이상억.progarmmers; + * FileName : 뒤에_있는_큰_수_찾기 + * Author : sangeok + * Date : 2025. 6. 11. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 11. sangeok Initial creation + */ +// 문제 요구사항 : 배열의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수 +// 뒷 큰수가 존재하지 않는 원소는 -1 +// +// 접근 방식 : for문 안에 stack 사용하면서 비교하면 될 거 같다. + +import java.util.*; +class Solution { + public int[] solution(int[] numbers) { + int len = numbers.length; + int[] answer = new int[len]; + Stack stack = new Stack<>(); + + for(int i = len-1; i >= 0; i--){ + int current = numbers[i]; + while(!stack.isEmpty() && stack.peek() <= current){ + stack.pop(); + } + + if(stack.isEmpty()){ + answer[i] = -1; + } else { + answer[i] = stack.peek(); + } + stack.push(current); // 우선 후보로 사용하기 위해 stack 에 박고 봄 + } + return answer; + } +} \ No newline at end of file diff --git "a/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\353\257\270\353\241\234_\355\203\210\354\266\234.java" "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\353\257\270\353\241\234_\355\203\210\354\266\234.java" new file mode 100644 index 0000000..61c97d8 --- /dev/null +++ "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\353\257\270\353\241\234_\355\203\210\354\266\234.java" @@ -0,0 +1,76 @@ +/** + * PackageName : week7.이상억.progarmmers; + * FileName : 뒤에_있는_큰_수_찾기 + * Author : sangeok + * Date : 2025. 6. 12. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 12. sangeok Initial creation + */ + +// 회고 : 2차원 평면에 dx, dy 문제를 풀지를 못하겠다. bfs에 대한 이해도가 현저히 떨어지는 것 같다. 추후 다시 해봐야겠다. + +import java.util.*; + +public class Solution { + static int n, m; + static char[][] grid; + static final int[] dr = {-1, 1, 0, 0}; + static final int[] dc = {0, 0, -1, 1}; + + public int solution(String[] maps) { + n = maps.length; + m = maps[0].length(); + grid = new char[n][m]; + + int sr=0, sc=0, lr=0, lc=0, er=0, ec=0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + grid[i][j] = maps[i].charAt(j); + if (grid[i][j] == 'S') { sr = i; sc = j; } + else if (grid[i][j] == 'L') { lr = i; lc = j; } + else if (grid[i][j] == 'E') { er = i; ec = j; } + } + } + + int d1 = bfs(sr, sc, 'L'); + if (d1 == -1) return -1; + + int d2 = bfs(lr, lc, 'E'); + if (d2 == -1) return -1; + + return d1 + d2; + } + + private int bfs(int r0, int c0, char targetChar) { + boolean[][] visited = new boolean[n][m]; + int[][] dist = new int[n][m]; + Queue q = new LinkedList<>(); + + visited[r0][c0] = true; + dist[r0][c0] = 0; + q.offer(new int[]{r0, c0}); + + while (!q.isEmpty()) { + int[] cur = q.poll(); + int r = cur[0], c = cur[1]; + + if (grid[r][c] == targetChar) { + return dist[r][c]; + } + + for (int d = 0; d < 4; d++) { + int nr = r + dr[d], nc = c + dc[d]; + if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue; + if (visited[nr][nc] || grid[nr][nc] == 'X') continue; + + visited[nr][nc] = true; + dist[nr][nc] = dist[r][c] + 1; + q.offer(new int[]{nr, nc}); + } + } + return -1; + } +} diff --git "a/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" new file mode 100644 index 0000000..a96407f --- /dev/null +++ "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\230\210\354\203\201_\353\214\200\354\247\204\355\221\234.java" @@ -0,0 +1,33 @@ +/** + * PackageName : week7.이상억.progarmmers; + * FileName : 예상_대진표 + * Author : sangeok + * Date : 2025. 6. 9. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 9. sangeok Initial creation + */ + +//문제 요구사항 : n 명이 참가 (1,2) (3,4) ..... (n-1, n) 까지 +// 다시 (1,2) (3,4) .... (n-1/2, n/2) 까지 +// a번 과 b 번이 만나려면 몇번해야하나 ? +// +//접근 방식 : (1) 1-2 3-4 5-6 7-8 +// 1-2 3-4 +// 1-2 + +class Solution { + public int solution(int n, int a, int b) { + int answer = 0; + + while (a != b) { + a = (a + 1) / 2; + b = (b + 1) / 2; + answer++; + } + + return answer; + } +} diff --git "a/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" new file mode 100644 index 0000000..b85d9e7 --- /dev/null +++ "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\214\354\226\221_\353\215\224\355\225\230\352\270\260.java" @@ -0,0 +1,23 @@ +/** + * PackageName : week7.이상억.progarmmers; + * FileName : 음양_더하기 + * Author : sangeok + * Date : 2025. 6. 9. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 9. sangeok Initial creation + */ + +class Solution { + public int solution(int[] absolutes, boolean[] signs) { + int answer = 0; + + for(int i = 0; i < absolutes.length; i++){ + if(signs[i] == true) answer += absolutes[i]; + if(signs[i] == false) answer -= absolutes[i]; + } + return answer; + } +} \ No newline at end of file diff --git "a/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\220\355\224\204\354\231\200_\354\210\234\352\260\204_\354\235\264\353\217\231.java" "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\220\355\224\204\354\231\200_\354\210\234\352\260\204_\354\235\264\353\217\231.java" new file mode 100644 index 0000000..df4ceef --- /dev/null +++ "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\220\355\224\204\354\231\200_\354\210\234\352\260\204_\354\235\264\353\217\231.java" @@ -0,0 +1,31 @@ +/** + * PackageName : week7.이상억.progarmmers; + * FileName : 점프와_순간_이동 + * Author : sangeok + * Date : 2025. 6. 9. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 9. sangeok Initial creation + */ + + +// 문제 요구사항 : 한번에 K 칸을 앞으로 점프 // ( 현재까지 온 거리 ) x 2 해당하는 위치로 순간이동 +// 아이언 슈트는 건전지 사용 => 순간 이동 시 건전지 사용 x , 앞으로 k 칸 만큼 가면 건전지도 k 만큼 줄음 + + +// 접근 방식 : (1) 문제를 읽어보니 2의 제곱승으로 나간다. 1의 갯수를 세는 문제 +// 5 => 101 // 6 => 110 + +// 회고 : 문제가 길어서 귀찮았는데 읽다보니 패턴을 파악해서 쉽게 풀었다. + +import java.util.*; + +public class Solution { + public int solution(int n) { + int ans = Integer.bitCount(n); + + return ans; + } +} \ No newline at end of file diff --git "a/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" new file mode 100644 index 0000000..048e6c5 --- /dev/null +++ "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\354\240\225\354\210\230_\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234_\353\260\260\354\271\230\355\225\230\352\270\260.java" @@ -0,0 +1,24 @@ +/** + * PackageName : week7.이상억.progarmmers; + * FileName : 정수_내림차순으로_배치하기 + * Author : sangeok + * Date : 2025. 6. 9. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 9. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public long solution(long n) { + char[] number = String.valueOf(n).toCharArray(); + Arrays.sort(number); + + StringBuilder rb = new StringBuilder(new String(number)); + + return Long.parseLong(rb.reverse().toString()); + } +} \ No newline at end of file diff --git "a/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\355\203\235\353\260\260_\354\203\201\354\236\220_\352\272\274\353\202\264\352\270\260.java" "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\355\203\235\353\260\260_\354\203\201\354\236\220_\352\272\274\353\202\264\352\270\260.java" new file mode 100644 index 0000000..c16b954 --- /dev/null +++ "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\355\203\235\353\260\260_\354\203\201\354\236\220_\352\272\274\353\202\264\352\270\260.java" @@ -0,0 +1,43 @@ +/** + * PackageName : week7.이상억.progarmmers; + * FileName : 택배_상자_꺼내기 + * Author : sangeok + * Date : 2025. 6. 11 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 11. sangeok Initial creation + */ + +//접근 방식 : +// 1) 우선 해당 박스의 층? row 를 구해야 함 +// 2) w로 나누어진다면 그 층에 마지막 박스 +// 3) 층이 홀수 일 때 왼->오 // 짝수일 때 오->왼 // + +public class Solution { + public int solution(int n, int w, int num) { + int row = (num - 1) / w; + int col = (row % 2 == 0) ? (num - 1) % w : w - 1 - (num - 1) % w; + int lastrow = (n-1) / w; + + int count = 0; + for (int r = row; r <=lastrow ; r++) { + int start = r * w + 1; + int end = (r + 1) * w ; + int index; + + if (r % 2 == 0) { + index = start + col; + } else { + index = end - col; + } + + if (index <= n) { + count++; + } + } + + return count; + } +} \ No newline at end of file diff --git "a/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" new file mode 100644 index 0000000..18ebff9 --- /dev/null +++ "b/week7/\354\235\264\354\203\201\354\226\265/progarmmers/\355\225\240\354\235\270_\355\226\211\354\202\254.java" @@ -0,0 +1,61 @@ +/** + * PackageName : week7.이상억.progarmmers; + * FileName : 할인_행사 + * Author : sangeok + * Date : 2025. 6. 11. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 11. sangeok Initial creation + */ + +// 문제 요구사항 : 마트는 일정 금액 지불 시 10일 동안 회원 자격 부여 +// 회원을 대상으로 매일 한가지 제품을 할인 +// 제품은 하루에 하나씩 구매 +// 자신이 원하는 제품과 수량이 할인하는 날짜와 10일 연속으로 일치할 경우에 맞춰 회원가입 +// 원하는 제품 바나나 3개 , 사과 2개, 쌀 2개, 돼지고기 2개, 냄비 1개 +// 치킨, 사과, 사과, 바나나, 쌀, 사과, 돼지고기, 바나나, 돼지고기, 쌀, 냄비, 바나나, 사과, 바나나 +// 셋째, 넷째 다섯째 날 가입하려함 + +// 1 <= want <= 10 / 10 <= discount <= 100,000 + +// 접근 방식 : (1) 우선적으로 want와 number를 map 으로 등록 +// discount 배열을 한칸씩 뒤로 밀면서 비교하면 ? + +import java.util.*; + +class Solution { + public int solution(String[] want, int[] number, String[] discount) { + int answer = 0; + + Map wantMap = new HashMap<>(); + for (int i = 0; i < want.length; i++) { + wantMap.put(want[i], number[i]); + } + + for (int i = 0; i <= discount.length - 10; i++) { + Map discountMap = new HashMap<>(); + + for (int j = 0; j < 10; j++) { + String item = discount[i + j]; + discountMap.put(item, discountMap.getOrDefault(item, 0) + 1); + } + + if (same(wantMap, discountMap)) { + answer++; + } + } + + return answer; + } + + private boolean same(Map a, Map b) { + for (String key : a.keySet()) { + if (!b.containsKey(key) || !a.get(key).equals(b.get(key))) { + return false; + } + } + return true; + } +} diff --git "a/week7_a/\352\260\225\354\204\261\354\232\261/programmers/\353\260\251\353\254\270\352\270\270\354\235\264_class.java" "b/week7_a/\352\260\225\354\204\261\354\232\261/programmers/\353\260\251\353\254\270\352\270\270\354\235\264_class.java" new file mode 100644 index 0000000..2c730bf --- /dev/null +++ "b/week7_a/\352\260\225\354\204\261\354\232\261/programmers/\353\260\251\353\254\270\352\270\270\354\235\264_class.java" @@ -0,0 +1,103 @@ +package week7_a.강성욱.programmers; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +/** + * PackageName : week7_a.강성욱.programmers + * FileName : 방문길이_class + * Author : Baekgwa + * Date : 2025-06-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-13 Baekgwa Initial creation + */ +public class 방문길이_class { + //좌표 평면계, 이동 문제 + //본인 위치를 계속 기억하고 있어야됨. + //동시에, 이번 길이 이동한 길인지 처음인지 확인해야됨. + //자료구조를 뭐쓸까 + //point -> point 니깐.. 음 + //ArrayList 이중으로 쓸까? 생각이 안나네 + //그냥 4차원으로 쓰면 공간 얼마나 먹지? + //visited[fromX][fromY][toX][toY] = 10*10*10*10 = 10000; 이게 제일 간단하네ㅋㅋ + + class Solution { + public int solution(String dirs) { + int nowX = 5, nowY = 5; + int result = 0; + Set visited = new HashSet<>(); + + for(char dir : dirs.toCharArray()) { + int nextX = nowX, nextY = nowY; + if(dir == 'U') nextY++; + else if(dir == 'D') nextY--; + else if(dir == 'L') nextX--; + else if(dir == 'R') nextX++; + + if(nextX < 0 || nextY < 0 || nextX > 10 || nextY > 10) continue; + + Point p1 = new Point(nowX, nowY); + Point p2 = new Point(nextX, nextY); + Visited path = new Visited(p1, p2); + + if (!visited.contains(path)) result++; + visited.add(path); + + nowX = nextX; + nowY = nextY; + } + return result; + } + + private static class Visited { + private final Point p1, p2; + public Visited(Point p1, Point p2) { + if (p1.compareTo(p2) <= 0) { + this.p1 = p1; + this.p2 = p2; + } else { + this.p1 = p2; + this.p2 = p1; + } + } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Visited)) return false; + Visited v = (Visited) o; + return p1.equals(v.p1) && p2.equals(v.p2); + } + @Override + public int hashCode() { + return Objects.hash(p1, p2); + } + } + + private static class Point implements Comparable { + private final int x, y; + public Point(int x, int y) { + this.x = x; this.y = y; + } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Point)) return false; + Point p = (Point) o; + return x == p.x && y == p.y; + } + @Override + public int hashCode() { + return Objects.hash(x, y); + } + @Override + public int compareTo(Point p) { + if (x != p.x) return Integer.compare(x, p.x); + return Integer.compare(y, p.y); + } + } + } +} diff --git "a/week7_a/\352\260\225\354\204\261\354\232\261/programmers/\353\260\251\353\254\270\352\270\270\354\235\264_\353\260\260\354\227\264.java" "b/week7_a/\352\260\225\354\204\261\354\232\261/programmers/\353\260\251\353\254\270\352\270\270\354\235\264_\353\260\260\354\227\264.java" new file mode 100644 index 0000000..ff6a662 --- /dev/null +++ "b/week7_a/\352\260\225\354\204\261\354\232\261/programmers/\353\260\251\353\254\270\352\270\270\354\235\264_\353\260\260\354\227\264.java" @@ -0,0 +1,61 @@ +package week7_a.강성욱.programmers; + +/** + * PackageName : week7_a.강성욱.programmers + * FileName : 방문길이_배열 + * Author : Baekgwa + * Date : 2025-06-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-13 Baekgwa Initial creation + */ +public class 방문길이_배열 { + //좌표 평면계, 이동 문제 + //본인 위치를 계속 기억하고 있어야됨. + //동시에, 이번 길이 이동한 길인지 처음인지 확인해야됨. + //자료구조를 뭐쓸까 + //point -> point 니깐.. 음 + //ArrayList 이중으로 쓸까? 생각이 안나네 + //그냥 4차원으로 쓰면 공간 얼마나 먹지? + //visited[fromX][fromY][toX][toY] = 10*10*10*10 = 10000; 이게 제일 간단하네ㅋㅋ + + class Solution { + public int solution(String dirs) { + int nowX = 5; + int nowY = 5; + int result = 0; + + boolean[][][][] visited = new boolean[11][11][11][11]; + + for(char dir : dirs.toCharArray()) { + //다음 명령으로 갈 좌표 계산 + int nextX = nowX; int nextY = nowY; + if(dir == 'U') { + nextY += 1; + } else if(dir == 'L') { + nextX -= 1; + } else if(dir == 'D') { + nextY -= 1; + } else if(dir == 'R') { + nextX += 1; + } + + if(nextX < 0 || nextY < 0 || nextX > 10 || nextY > 10) continue; + + //처음 가는 길이라면? + //아 길이니깐? 양방향으로 체크해야됨. + if(!visited[nowX][nowY][nextX][nextY] && + !visited[nextX][nextY][nowX][nowY]) result++; + visited[nowX][nowY][nextX][nextY] = true; + visited[nextX][nextY][nowX][nowY] = true; + + nowX = nextX; + nowY = nextY; + } + + return result; + } + } +} diff --git "a/week7_a/\352\260\225\354\204\261\354\232\261/programmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" "b/week7_a/\352\260\225\354\204\261\354\232\261/programmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" new file mode 100644 index 0000000..67133a3 --- /dev/null +++ "b/week7_a/\352\260\225\354\204\261\354\232\261/programmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" @@ -0,0 +1,35 @@ +package week7_a.강성욱.programmers; + +/** + * PackageName : week7_a.강성욱.programmers + * FileName : 주식가격 + * Author : Baekgwa + * Date : 2025-06-13 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-13 Baekgwa Initial creation + */ +public class 주식가격 { + class Solution { + public int[] solution(int[] prices) { + int[] result = new int[prices.length]; + + for(int i=0; i next) break; + } + result[i] = cnt; + } + + return result; + } + } +} 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; + } + } +} diff --git "a/week7_a/\352\271\200\353\210\204\353\246\254/programmers/\353\260\251\353\254\270_\352\270\270\354\235\264.java" "b/week7_a/\352\271\200\353\210\204\353\246\254/programmers/\353\260\251\353\254\270_\352\270\270\354\235\264.java" new file mode 100644 index 0000000..a908e20 --- /dev/null +++ "b/week7_a/\352\271\200\353\210\204\353\246\254/programmers/\353\260\251\353\254\270_\352\270\270\354\235\264.java" @@ -0,0 +1,78 @@ +package week7_a.김누리.programmers; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * PackageName : week7_a.김누리.programmers + * FileName : 방문_길이 + * Author : 김누리(NRKim) + * Date : 2025-06-14 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 14. 김누리(NRKim) Initial creation + */ + +/* +U = 위로 +D = 아래로 +R = 우측 +L = 좌측 + +시작 : 0,0 + +ULURRDLLU 인 경우 + +1. 0,1 +2. -1,1 +3. -1,2 +4. 0,2 +5. 1,2 +6. 1,1 +7. 0,1 +8. -1,1 +9. -1,2 +*/ + +public class 방문_길이 { + public int solution(String dirs) { + int answer = 0; + int x = 0; + int y = 0; // 시작점 + Set set = new HashSet<>(); // 이동 완료 현재 좌표 + Map map = new HashMap<>(); // 상하좌우 맵 + map.put("U", new int[] {0,1}); + map.put("D", new int[] {0,-1}); + map.put("R", new int[] {1,0}); + map.put("L", new int[] {-1,0}); + + String[] dir = dirs.split(""); + + // 명령어 만큼 반복 + for(String d : dir) { + int[] now = map.get(d); + int nx = x + now[0]; + int ny = y + now[1]; + + if(nx < -5 || nx > 5 || ny < -5 || ny > 5) continue; + + String path1 = x + "," + y + ">" + nx + "," + ny; // 배열로 하면 안풀리니... String 화 : x,y >> nx,ny + String path2 = nx + "," + ny + ">" + x + "," + y; // 배열로 하면 안풀리니... String 화 : nx,ny >> x,y + + if(!set.contains(path1) && !set.contains(path2)) { + set.add(path1); + set.add(path2); + answer++; + } + + x = nx; + y = ny; + } + + return answer; + } +} diff --git "a/week7_a/\352\271\200\353\210\204\353\246\254/programmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" "b/week7_a/\352\271\200\353\210\204\353\246\254/programmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" new file mode 100644 index 0000000..29520fd --- /dev/null +++ "b/week7_a/\352\271\200\353\210\204\353\246\254/programmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" @@ -0,0 +1,56 @@ +package week7_a.김누리.programmers; + +/** + * PackageName : week7_a.김누리.programmers + * FileName : 주식가격 + * Author : 김누리(NRKim) + * Date : 2025-06-14 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 14. 김누리(NRKim) Initial creation + */ + +/* +??? 뭔말이지?? + +price[0] = 1 +price[1] ~ price[4] 까지 1 밑으로 떨어진거 없으니, 4 + +price[1] = 2 +price[2] ~ price[4] 까지 2 밑으로 떨어진거 없으니, 3 + +price[2] = 3 +price[3] 구간에서 3 밑으로 떨어지니, 1 + +price[3] = 2 +price[4] ~ price[4] 까지 2 밑으로 떨어진거 없으니, 1 + +price[4] = 3 +끝점이니 가격이 안떨어지므로 0 + +*/ + +public class 주식가격 { + public int[] solution(int[] prices) { + int[] answer = new int[prices.length]; + + for(int i = 0; i < prices.length -1; i++) { + int cnt = 0; // 카운팅 횟수 + int now = prices[i]; // 현재 가격 + + for(int j = i+1; j < prices.length; j++) { + cnt++; + + // 가격이 떨어지는 순간 내부 반복 종료 + if (now > prices[j]) { + break; + } + } + answer[i] = cnt; + } + + return answer; + } +} diff --git "a/week7_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\260\251\353\254\270_\352\270\270\354\235\264.java" "b/week7_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\260\251\353\254\270_\352\270\270\354\235\264.java" new file mode 100644 index 0000000..f93a7c3 --- /dev/null +++ "b/week7_a/\354\235\264\354\203\201\354\226\265/progarmmers/\353\260\251\353\254\270_\352\270\270\354\235\264.java" @@ -0,0 +1,39 @@ +// 내가 이동한 방문 좌표 저장해야 할 거 같은데 ? +// 방문 간선 ? (x,y) 형식 저장해서 중복 체크 +// 거쳐간 길이라고 명시 했으니 직선 0,0 -> 1,0 // 1,0 -> 0,0 이 둘 다 동일시 되는 거같음 +import java.util.*; + +class Solution { + public int solution(String dirs) { + int answer = 0; + + Set visited = new HashSet<>(); + int x = 0; + int y = 0; + + for(char dir : dirs.toCharArray()){ + int dx = x; + int dy = y; + + if((dir == 'U') && y < 5) dy++; + else if((dir == 'D') && y > -5) dy--; + else if((dir == 'R') && x < 5) dx ++; + else if((dir == 'L') && x > -5) dx --; + else continue; + + String path = x + "," + y + "," + dx + "," + dy; + String reversepath = dx + "," + dy + "," + x + "," + y; + + if(!visited.contains(path) && !visited.contains(reversepath)){ + visited.add(path); + visited.add(reversepath); + answer++; + } + + x = dx; + y = dy; + } + + return answer; + } +} \ No newline at end of file diff --git "a/week7_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" "b/week7_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" new file mode 100644 index 0000000..9ce6387 --- /dev/null +++ "b/week7_a/\354\235\264\354\203\201\354\226\265/progarmmers/\354\243\274\354\213\235\352\260\200\352\262\251.java" @@ -0,0 +1,26 @@ +import java.util.*; + +class Solution { + public int[] solution(int[] prices) { + int n = prices.length; + Stack stack = new Stack<>(); + + int[] answer = new int[n]; + + for(int i = 0 ; i < n ; i++){ + while(!stack.isEmpty() && prices[i] < prices[stack.peek()]){ + int top = stack.pop(); + answer[top] = i - top; + } + stack.push(i); + } + + while(!stack.isEmpty()){ + int top = stack.pop(); + answer[top] = n - 1 - top; + } + + + return answer; + } +} \ No newline at end of file diff --git "a/week8/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" new file mode 100644 index 0000000..f0d5a79 --- /dev/null +++ "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" @@ -0,0 +1,41 @@ +package week8.강성욱.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week8.강성욱.programmers + * FileName : 가장_가까운_같은_글자 + * Author : Baekgwa + * Date : 2025-06-16 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-16 Baekgwa Initial creation + */ +public class 가장_가까운_같은_글자 { + // 현재 인덱스 위치와, 마지막에 'b', 'c' 등이 나온 인덱스 위치를 알 수 있으면 됨. + // key-value map 으로 처리하자 + + class Solution { + public int[] solution(String s) { + Map map = new HashMap<>(); + int[] result = new int[s.length()]; + + int i=0; + for(char c : s.toCharArray()) { + int now = map.getOrDefault(c, -1); //마지막에 나온걸 찾음. 없으면 -1 + + if(now == -1) result[i] = -1; + else result[i] = i-now; + + map.put(c, i); + + i++; + } + + return result; + } + } +} diff --git "a/week8/\352\260\225\354\204\261\354\232\261/programmers/\352\270\260\354\202\254\353\213\250\354\233\220\354\235\230_\353\254\264\352\270\260.java" "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\352\270\260\354\202\254\353\213\250\354\233\220\354\235\230_\353\254\264\352\270\260.java" new file mode 100644 index 0000000..a2780b8 --- /dev/null +++ "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\352\270\260\354\202\254\353\213\250\354\233\220\354\235\230_\353\254\264\352\270\260.java" @@ -0,0 +1,51 @@ +package week8.강성욱.programmers; + +/** + * PackageName : week8.강성욱.programmers + * FileName : 기사단원의_무기 + * Author : Baekgwa + * Date : 2025-06-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-17 Baekgwa Initial creation + */ +public class 기사단원의_무기 { + //약수 구해야됨. + //number = 5 면, 1의약수, 2의약수 ... 5의약수의 개수 구해야됨. + //약수 개수를 구하는 메서드를 하나 만들자. + + class Solution { + public int solution(int number, int limit, int power) { + int result = 0; + + //1부터 공격력 제한 확인 + for (int i = 1; i <= number; i++) { + int count = dividedNumber(i); + if (count > limit) { + result += power; + } else { + result += count; + } + } + + return result; + } + + private int dividedNumber(int number) { + // 루트 number 까지 반복해서 % 나머지가 있는지 확인? + // 10 => [1, 2, 5, 10] = 4개 + // 10 => 3까지 반복, 1(o), 2(o), 3(x) 2개 * 2개 = 4개 + // 근데 16 같은경우는, [1, 2, 4]; + // 4까지 반복 할때, 4는 약수가 중복이니깐 이거 처리 해줘야함. *2 무작정 하면 안됨. + int count = 0; + for (int i = 1; i * i <= number; i++) { + if (number % i == 0) { + count += (i * i == number) ? 1 : 2; + } + } + return count; + } + } +} diff --git "a/week8/\352\260\225\354\204\261\354\232\261/programmers/\353\225\205\353\224\260\353\250\271\352\270\260.java" "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\353\225\205\353\224\260\353\250\271\352\270\260.java" new file mode 100644 index 0000000..8633167 --- /dev/null +++ "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\353\225\205\353\224\260\353\250\271\352\270\260.java" @@ -0,0 +1,52 @@ +package week8.강성욱.programmers; + +/** + * PackageName : week8.강성욱.programmers + * FileName : 땅따먹기 + * Author : Baekgwa + * Date : 2025-06-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-17 Baekgwa Initial creation + */ +public class 땅따먹기 { + // 연속해서 땅을 밟을 수 없음. + // 그말은 즉, 1 -> 2 -> 1 은 가능 + // 그럼 그전 단계 땅을 밟은 위치를 알고있으면 됨. + // x는 4로 제한, y는 100,000 까지 늘어날 수 있음. + + class Solution { + int solution(int[][] land) { + int[][] sum = new int[land.length][land[0].length]; + //sum 은 최적의 누적합 + //즉, sum[1][0] 은 y축 1번행을 밟았을때, 가장 큰 누적 합을 가지고있는 배열 + //x = 0을 밟았을땐, land[0][0] 은 조건에 의해 밟을 수 없기땜문에, 1, 2, 3 중 가장 큰값을 더한걸 기록 + + for (int x = 0; x < 4; x++) { + sum[0][x] = land[0][x]; + } + + for (int y = 1; y < land.length; y++) { + for (int x = 0; x < 4; x++) { + int maxPrev = 0; + //x == 0일때는, [y-1][1], [y-1][2], [y-1][3] 중 가장 큰걸 기록해놔야함. + for (int k = 0; k < 4; k++) { + if (k == x) continue; + maxPrev = Math.max(maxPrev, sum[y - 1][k]); + } + sum[y][x] = land[y][x] + maxPrev; + } + } + + //마지막 y중, 가장 큰걸 return + int answer = 0; + for (int x = 0; x < 4; x++) { + answer = Math.max(answer, sum[land.length - 1][x]); + } + + return answer; + } + } +} diff --git "a/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\212\244\355\202\254\355\212\270\353\246\254.java" "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\212\244\355\202\254\355\212\270\353\246\254.java" new file mode 100644 index 0000000..2174243 --- /dev/null +++ "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\212\244\355\202\254\355\212\270\353\246\254.java" @@ -0,0 +1,45 @@ +package week8.강성욱.programmers; + +/** + * PackageName : week8.강성욱.programmers + * FileName : 스킬트리 + * Author : Baekgwa + * Date : 2025-06-16 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-16 Baekgwa Initial creation + */ +public class 스킬트리 { + // 스킬 트리 순서대로, 체크표시를 하면됨. + // 즉, skill[] 이 = "CBD" 이고, "BACDE" 일때 + // "CBD"만 남긴 문자열로 변환하고 + // "BCD" + // 이거 순서를 반복돌면서 맞는지 확인하면 될듯? + // 이거 startWith 인지 확인하면 될듯? + // "CBD" 일때, "BD" = x, "C" = O, "CB" = O, "B" = x + // ㅇㅇ 가능할듯 + + class Solution { + public int solution(String skill, String[] skill_trees) { + int result = 0; + + for (String tree : skill_trees) { + StringBuilder filtered = new StringBuilder(); + + for (char c : tree.toCharArray()) { + if (skill.contains(String.valueOf(c))) { + filtered.append(c); + } + } + + if (skill.startsWith(filtered.toString())) { + result++; + } + } + + return result; + } + } +} diff --git "a/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\213\244\355\214\250\354\234\250.java" "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\213\244\355\214\250\354\234\250.java" new file mode 100644 index 0000000..7cce1af --- /dev/null +++ "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\213\244\355\214\250\354\234\250.java" @@ -0,0 +1,71 @@ +package week8.강성욱.programmers; + +import java.util.Arrays; + +/** + * PackageName : week8.강성욱.programmers + * FileName : 실패율 + * Author : Baekgwa + * Date : 2025-06-16 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-16 Baekgwa Initial creation + */ +public class 실패율 { + // 음 + // 각 스테이지 별 몇명이 있는지, 빠르게 계산이 가능해야됨. 중복된 계산을 처음부터 하지 않도록 하는게 핵심. + //스테이지 배열 길이가 200,000 이기때문에, 잘못하면 200,000^2 계산을 해야되서 시간초과 예정 + + class Solution { + public int[] solution(int stageCount, int[] userStages) { + + // 스테이지 별, 사용자 몇명 머물고 있는지 확인 + int[] stage = new int[stageCount + 2]; + for (int st : userStages) { + stage[st]++; + } + + // 각 스테이지 별, 실패율 계산 + double[] failRate = calculateFail(stageCount, stage, userStages.length); + + // 정렬 + // 정렬 조건 : 실패율 높은 순서대로 (내림차순), 같으면 스테이지 번호 오름차순 + Integer[] sortedStages = sortResult(stageCount, failRate); + + return Arrays.stream(sortedStages).mapToInt(Integer::intValue).toArray(); + } + + private double[] calculateFail(int stageCount, int[] stage, int playerCount) { + double[] failRate = new double[stageCount]; + int remainCount = playerCount; + + for (int i = 1; i <= stageCount; i++) { + int currentCount = stage[i]; + failRate[i - 1] = (remainCount == 0) ? 0.0 : (double) currentCount / remainCount; + remainCount -= currentCount; + } + + return failRate; + } + + private Integer[] sortResult(int stageCount, double[] failRate) { + Integer[] stages = new Integer[stageCount]; + for (int i = 0; i < stageCount; i++) { + stages[i] = i + 1; + } + + Arrays.sort(stages, (a, b) -> { + double rateA = failRate[a - 1]; + double rateB = failRate[b - 1]; + if (Double.compare(rateB, rateA) != 0) { + return Double.compare(rateB, rateA); + } + return Integer.compare(a, b); + }); + + return stages; + } + } +} diff --git "a/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" new file mode 100644 index 0000000..1007202 --- /dev/null +++ "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" @@ -0,0 +1,36 @@ +package week8.강성욱.programmers; + +import java.util.HashSet; +import java.util.Set; + +/** + * PackageName : week8.강성욱.programmers + * FileName : 연속_부분_수열_합의_개수 + * Author : Baekgwa + * Date : 2025-06-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-17 Baekgwa Initial creation + */ +public class 연속_부분_수열_합의_개수 { + class Solution { + public int solution(int[] elements) { + int n = elements.length; + Set sumSet = new HashSet<>(); + + for (int start = 0; start < n; start++) { + int sum = 0; + + for (int len = 1; len <= n; len++) { + int idx = (start + len - 1) % n; + sum += elements[idx]; + sumSet.add(sum); + } + } + + return sumSet.size(); + } + } +} diff --git "a/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.java" "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.java" new file mode 100644 index 0000000..3802c20 --- /dev/null +++ "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.java" @@ -0,0 +1,61 @@ +package week8.강성욱.programmers; + +/** + * PackageName : week8.강성욱.programmers + * FileName : 유연근무제 + * Author : Baekgwa + * Date : 2025-06-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-17 Baekgwa Initial creation + */ +public class 유연근무제 { + class Solution { + public int solution(int[] schedules, int[][] timelogs, int startday) { + + // timeLogs, schedules 에서 확인해야될 인덱스 번호 (평일) 필터링 + int[] checkDays = new int[5]; + int nowDay = startday; + int index = 0; + for(int i=0; i<7; i++) { + if(nowDay != 6 && nowDay != 7) { + checkDays[index] = i; + index++; + } + + nowDay++; + if(nowDay >= 8) nowDay = 1; + } + + // 지각 체크. + // 지각 아닌경우에 result 증가 + int result = 0; + for (int person = 0; person < schedules.length; person++) { + boolean isLate = false; + int allowedHour = schedules[person] / 100; + int allowedMin = schedules[person] % 100 + 10; + + if (allowedMin >= 60) { + allowedHour += 1; + allowedMin -= 60; + } + + int allowedTime = allowedHour * 100 + allowedMin; + + for (int d = 0; d < 5; d++) { + int logTime = timelogs[person][checkDays[d]]; + if (logTime > allowedTime) { + isLate = true; + break; + } + } + + if (!isLate) result++; + } + + return result; + } + } +} diff --git "a/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..50545c1 --- /dev/null +++ "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,42 @@ +package week8.강성욱.programmers; + +/** + * PackageName : week8.강성욱.programmers + * FileName : 이상한_문자_만들기 + * Author : Baekgwa + * Date : 2025-06-16 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-16 Baekgwa Initial creation + */ +public class 이상한_문자_만들기 { + //각 단어로 쪼개야됨 + //단어별로 쪼개서, 변환하는 메서드가 있어야함 + + class Solution { + public String solution(String s) { + String[] sToken = s.split(" ", -1); + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < sToken.length; i++) { + sb.append(transfer(sToken[i])); + if (i < sToken.length - 1) sb.append(" "); + } + + return sb.toString(); + } + + private String transfer(String str) { + if( str.isBlank() ) return str; + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + sb.append(i % 2 == 0 ? Character.toUpperCase(c) : Character.toLowerCase(c)); + } + return sb.toString(); + } + } +} diff --git "a/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\266\251\353\217\214\354\234\204\355\227\230.java" "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\266\251\353\217\214\354\234\204\355\227\230.java" new file mode 100644 index 0000000..42ff23a --- /dev/null +++ "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\354\266\251\353\217\214\354\234\204\355\227\230.java" @@ -0,0 +1,129 @@ +package week8.강성욱.programmers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * PackageName : week8.강성욱.programmers + * FileName : 충돌위험 + * Author : Baekgwa + * Date : 2025-06-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-17 Baekgwa Initial creation + */ +public class 충돌위험 { + // routes가 주어졌을때, 경로를 순서대로 알고 있어야함 + // 즉, pointRoute[1] = { {x, y}, {x, y}, {x, y} ... } 등, 1번 reoutes 의 최적 경로를 모두 알고 잇어야함. + + // 쵲거의 경로는, (상하) (좌우) 움직일때, 항상 상하부터 움직이는게 답 + // 중간에 벽은 없기때문에 dfs 나 그런거 안써도될듯, 그냥 좌표보고 계산해놓으면 될듯 + + // 이후, 이걸 각 배열 iter 마다, 돌면서 확인하면 될듯? + // 이걸 Map 에 저장한 후, getOrDefault 로 ++ 하면서, count check 하면 될듯. 1개 초과면, 충돌 1건 이상 발생 + + class Solution { + public int solution(int[][] points, int[][] routes) { + List> pointPathList = new ArrayList<>(); + + Point[] pointMap = new Point[points.length + 1]; + for (int i = 0; i < points.length; i++) { + pointMap[i + 1] = new Point(points[i][0], points[i][1]); + } + + // 로봇 경로 구하기 + int maxTime = 0; + for (int i = 0; i < routes.length; i++) { + List path = new ArrayList<>(); + path.add(pointMap[routes[i][0]]); + for (int j = 0; j < routes[i].length - 1; j++) { + Point from = pointMap[routes[i][j]]; + Point to = pointMap[routes[i][j + 1]]; + path.addAll(getPath(from, to)); + } + pointPathList.add(path); + maxTime = Math.max(maxTime, path.size()); + } + + int result = 0; + + //충돌 확인 + for (int t = 0; t < maxTime; t++) { + Map map = new HashMap<>(); + for (int i = 0; i < routes.length; i++) { + List path = pointPathList.get(i); + if (t < path.size()) { + Point p = path.get(t); + map.put(p, map.getOrDefault(p, 0) + 1); + } + } + + for (int count : map.values()) { + if (count > 1) result++; + } + } + + return result; + } + + private List getPath(Point from, Point to) { + List path = new ArrayList<>(); + int x = from.getX(); + int y = from.getY(); + + if (x < to.getX()) { + for (int i = x + 1; i <= to.getX(); i++) { + path.add(new Point(i, y)); + } + } else if (x > to.getX()) { + for (int i = x - 1; i >= to.getX(); i--) { + path.add(new Point(i, y)); + } + } + + if (y < to.getY()) { + for (int i = y + 1; i <= to.getY(); i++) { + path.add(new Point(x = to.getX(), i)); + } + } else if (y > to.getY()) { + for (int i = y - 1; i >= to.getY(); i--) { + path.add(new Point(x = to.getX(), i)); + } + } + + return path; + } + + private static class Point { + private final int x; + private final int y; + + Point(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { return x; } + + public int getY() { return y; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Point)) return false; + Point point = (Point) o; + return x == point.x && y == point.y; + } + + @Override + public int hashCode() { + return Objects.hash(x, y); + } + } + } +} diff --git "a/week8/\352\260\225\354\204\261\354\232\261/programmers/\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.java" "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..a0465c5 --- /dev/null +++ "b/week8/\352\260\225\354\204\261\354\232\261/programmers/\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.java" @@ -0,0 +1,59 @@ +package week8.강성욱.programmers; + +import java.util.Stack; + +/** + * PackageName : week8.강성욱.programmers + * FileName : 크레인_인형뽑기_게임 + * Author : Baekgwa + * Date : 2025-06-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-17 Baekgwa Initial creation + */ +public class 크레인_인형뽑기_게임 { + + //주의할점. moves 배열에서 가져올때, 값들은 -1 해서 써야됨. 인덱스로 쓰려면 + + class Solution { + public int solution(int[][] board, int[] moves) { + Stack[] stArray = new Stack[board[0].length]; + Stack st = new Stack<>(); + + for (int i = 0; i < board[0].length; i++) { + stArray[i] = new Stack<>(); + } + + // stArray 에 인형 쌓아두기 + // 스택이라서, y축은 역순으로 읽어야함. + for (int x = 0; x < board[0].length; x++) { + for (int y = board[0].length - 1; y >= 0; y--) { + int now = board[y][x]; + if (now != 0) { + stArray[x].push(now); + } + } + } + + //움직임에 따라서 정리 + int result = 0; + for (int move : moves) { + int x = move - 1; + if (!stArray[x].isEmpty()) { + int now = stArray[x].pop(); + + if (!st.isEmpty() && st.peek() == now) { + st.pop(); + result += 2; + } else { + st.push(now); + } + } + } + + return result; + } + } +} diff --git "a/week8/\352\271\200\353\202\230\354\235\200/programmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" "b/week8/\352\271\200\353\202\230\354\235\200/programmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" new file mode 100644 index 0000000..24bd87d --- /dev/null +++ "b/week8/\352\271\200\353\202\230\354\235\200/programmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" @@ -0,0 +1,34 @@ +package week8.김나은.programmers; + +import java.util.HashMap; + +public class 가장_가까운_같은_글자 { + + class Solution { + + public int[] solution(String s) { + + int[] answer = new int[s.length()]; + + // 각 문자와 그 문자가 마지막으로 등장한 인덱스를 저장하는 맵 + HashMap map = new HashMap<>(); + + // 문자열을 왼쪽부터 오른쪽으로 순회 + for (int i = 0; i < s.length(); i++) { + // 현재 인덱스의 문자 + if (!map.containsKey(s.charAt(i))) { + // 해당 문자가 처음 나왔다면 -1 + answer[i] = -1; + } else { + // 이전에 나왔던 문자라면 현재 인덱스와 마지막 등장 인덱스 차이를 저장 + answer[i] = i - map.get(s.charAt(i)); + } + + // 현재 문자의 인덱스를 맵에 갱신 + map.put(s.charAt(i), i); + } + + return answer; + } + } +} \ No newline at end of file diff --git "a/week8/\352\271\200\353\202\230\354\235\200/programmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" "b/week8/\352\271\200\353\202\230\354\235\200/programmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" new file mode 100644 index 0000000..f674189 --- /dev/null +++ "b/week8/\352\271\200\353\202\230\354\235\200/programmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" @@ -0,0 +1,48 @@ +package week8.김나은.programmers; + +import java.util.HashSet; +import java.util.Set; + +public class 연속_부분_수열_합의_개수 { + + class Solution { + + public int solution(int[] elements) { + int answer = 0; + + // 중복 없는 합을 저장할 Set + Set sumSet = new HashSet<>(); + + int length = elements.length; + + // size : 부분 수열의 길이 (1부터 length까지) + for (int size = 1; size <= length; size++) { + int sum = 0; + int start = 0; + + // 초기 부분 수열 합 계산 (맨 앞에서 size 길이 만큼) + for (int i = 0; i < size; i++) { + sum += elements[i]; + } + // 합을 Set에 추가 + sumSet.add(sum); + + // start를 1씩 증가시키며 다음 부분 수열 합 계산 (원형 수열 처리) + while (start < length - 1) { + // 부분 수열의 맨 앞 값을 제거하고 + sum -= elements[start]; + // 다음 위치 값을 더함 (원형이므로 % length 처리) + sum += elements[(start + size) % length]; + start++; + + // 새로 계산된 합을 Set에 추가 + sumSet.add(sum); + } + } + + // 서로 다른 합의 개수가 정답 + answer = sumSet.size(); + return answer; + } + } +} diff --git "a/week8/\352\271\200\353\202\230\354\235\200/programmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" "b/week8/\352\271\200\353\202\230\354\235\200/programmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..6181d3d --- /dev/null +++ "b/week8/\352\271\200\353\202\230\354\235\200/programmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,28 @@ +package week8.김나은.programmers; + +public class 이상한_문자_만들기 { + + class Solution { + + public String solution(String s) { + String answer = ""; + // 주어진 문자열 s를 배열로 변환 + String[] strArr = s.split(""); + // 짝수 번째인지 홀수 번째인지 구분하기 위한 변수 선언 + int idx = 0; + + for (int i = 0; i < strArr.length; i++) { + // 공백인 경우, idx를 1로 설정하여 다음 단어를 대문자로 만들어 준다. + if (strArr[i].equals(" ")) { + idx = 1; + } + + // 짝수 번째인 경우 대문자, 홀수 번째인 경우 소문자로 변환 + answer += idx % 2 == 0 ? strArr[i].toUpperCase() : strArr[i].toLowerCase(); + idx++; + } + + return answer; + } + } +} diff --git "a/week8/\352\271\200\353\210\204\353\246\254/programmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" new file mode 100644 index 0000000..6d2d6eb --- /dev/null +++ "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" @@ -0,0 +1,68 @@ +package week8.김누리.programmers; + +/** + * PackageName : week8.김누리.programmers + * FileName : 가장_가까운_같은_글자 + * Author : 김누리(NRKim) + * Date : 2025-06-15 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 15. 김누리(NRKim) Initial creation + */ + + +/* +Case 1 + input : banana + + 1. b : 제일 첫 idx 이므로 자신 앞에 같은 글자가 없으므로 -1 + 2. a : 자신 앞에 같은 글자가 없으므로 -1 + 3. n : 자신 앞에 같은 글자가 없으므로 -1 + 4. a : idx 1에 같은 글자가 있음. 현재 idx = 3, 타겟 idx = 1 >> 3 - 1 = 2 + 5. n : idx 2에 같은 글자가 있음. 현재 idx = 4, 타겟 idx = 2 >> 4 - 2 = 2 + 6. a : idx 3에 같은 글자가 있음. 현재 idx = 5, 타겟 idx = 3 >> 5 - 3 = 2 + + return [-1,-1,-1,2,2,2] + +Case 2 + input : foobar + + 1. f : 제일 첫 idx 이므로 자신 앞에 같은 글자가 없으므로 -1 + 2. o : 자신 앞에 같은 글자가 없으므로 -1 + 3. o : idx 1에 같은 글자가 있음. 현재 idx = 2, 타겟 idx = 1 >> 2 - 1 = 1 + 4. b : 자신 앞에 같은 글자가 없으므로 -1 + 5. a : 자신 앞에 같은 글자가 없으므로 -1 + 6. r : 자신 앞에 같은 글자가 없으므로 -1 + + return [-1,-1,1,-1,-1,-1] +*/ + +public class 가장_가까운_같은_글자 { + public int[] solution(String s) { + int[] answer = new int[s.length()]; + String[] sArr = s.split(""); + + // 0번 idx는 -1 + answer[0] = -1; + + // idx 1번 부터 s 길이까지 + for(int i = 1; i < sArr.length; i++) { + String tar = sArr[i]; // 타겟 문자 + + // 현재 idx vs 이전번 idx 비교 + for(int j = i-1; j >= 0; j--) { + String prev = sArr[j]; + if(prev.equals(tar)) { + answer[i] = i-j; + break; + } else { + answer[i] = -1; + } + } + } + + return answer; + } +} diff --git "a/week8/\352\271\200\353\210\204\353\246\254/programmers/\352\270\260\354\202\254\353\213\250\354\233\220\354\235\230_\353\254\264\352\270\260.java" "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\352\270\260\354\202\254\353\213\250\354\233\220\354\235\230_\353\254\264\352\270\260.java" new file mode 100644 index 0000000..890ce24 --- /dev/null +++ "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\352\270\260\354\202\254\353\213\250\354\233\220\354\235\230_\353\254\264\352\270\260.java" @@ -0,0 +1,44 @@ +package week8.김누리.programmers; + +/** + * PackageName : week8.김누리.programmers + * FileName : 기사단원의_무기 + * Author : 김누리(NRKim) + * Date : 2025-06-18 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 18. 김누리(NRKim) Initial creation + */ + +public class 기사단원의_무기 { + class Solution { + public int solution(int number, int limit, int power) { + int answer = 0; + int knight = 1; + + // 약수 갯수 구하며 무기 수치 제한 + for(int i = 0; i < number; i++) { + int cnt = 0; + + // 기사단의 수가 많아지면 약수의 갯수가 쌍을 이루기 때문 + for(int j = 1; j*j <= knight; j++) { + if(knight % j == 0) { + cnt++; + + // j가 제곱근일 때 처리 + if ( j != knight / j) cnt++; + } + } + + if(cnt > limit) cnt = power; + answer += cnt; + + knight++; + } + + return answer; + } + } +} diff --git "a/week8/\352\271\200\353\210\204\353\246\254/programmers/\353\225\205\353\224\260\353\250\271\352\270\260.java" "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\353\225\205\353\224\260\353\250\271\352\270\260.java" new file mode 100644 index 0000000..dcb5ed8 --- /dev/null +++ "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\353\225\205\353\224\260\353\250\271\352\270\260.java" @@ -0,0 +1,54 @@ +package week8.김누리.programmers; + +/** + * PackageName : week8.김누리.programmers + * FileName : 땅따먹기 + * Author : 김누리(NRKim) + * Date : 2025-06-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 17. 김누리(NRKim) Initial creation + */ + +/* + n = land.length + m = land[0].length + + before + 1 2 3 5 + 5 6 7 8 + 4 3 2 1 + + after + 1 2 3 5 ==> land[0][j]의 max값 + 10 11 12 X ==> (land[0][j] + land[1][j]의 max값) == > 12 + 16 15 X 13 ==> (land[0][j] + land[2][j]의 max값) == > 16 + +으로 해야함 + +정답 보고 풀이함. dp 알고리즘에 대한 이해 필요 +*/ + +public class 땅따먹기 { + int solution(int[][] land) { + int answer = 0; + int n = land.length; // 열 + + for(int i = 1; i < n; i++) { + // 각 행과 열에서 이전 행의 다른 열 중 최대값을 더해 dp 결과값 구성 + land[i][0] += Math.max(land[i-1][1],Math.max(land[i-1][2],land[i-1][3])); + land[i][1] += Math.max(land[i-1][0],Math.max(land[i-1][2],land[i-1][3])); + land[i][2] += Math.max(land[i-1][0],Math.max(land[i-1][1],land[i-1][3])); + land[i][3] += Math.max(land[i-1][0],Math.max(land[i-1][1],land[i-1][2])); + } + + for(int i = 0; i < 4; i++) { + // answer 값과 dp 결과값을 비교하며 최종값 정리 + answer = Math.max(answer,land[land.length-1][i]); + } + + return answer; + } +} diff --git "a/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\212\244\355\202\254\355\212\270\353\246\254.java" "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\212\244\355\202\254\355\212\270\353\246\254.java" new file mode 100644 index 0000000..5a81309 --- /dev/null +++ "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\212\244\355\202\254\355\212\270\353\246\254.java" @@ -0,0 +1,48 @@ +package week8.김누리.programmers; + +/** + * PackageName : week8.김누리.programmers + * FileName : 스킬트리 + * Author : 김누리(NRKim) + * Date : 2025-06-16 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 16. 김누리(NRKim) Initial creation + */ + +/* +skill 을 쪼갬 +예 ) +case 1 : skill = "CBD"; ==> "C","B","D" +쪼갠 스킬들이 스킬트리에 있는지 +있다면 이게 선행 스킬인지 파악하며 스킬트리 판정 +*/ +public class 스킬트리 { + public int solution(String skill, String[] skill_trees) { + int answer = 0; + + // 스킬트리 검사 + for(String tree : skill_trees) { + String filtered = ""; + + // 선행 스킬만 필터링 + for(int i = 0; i < tree.length(); i++) { + char sk = tree.charAt(i); + + // 스킬 찍음 + if (skill.indexOf(sk) != -1) { + filtered += sk; + } + } + + // 해당 스킬이 선행 스킬인가 + if(skill.startsWith(filtered)) { + answer++; + } + } + + return answer; + } +} diff --git "a/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\213\244\355\214\250\354\234\250.java" "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\213\244\355\214\250\354\234\250.java" new file mode 100644 index 0000000..1690d26 --- /dev/null +++ "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\213\244\355\214\250\354\234\250.java" @@ -0,0 +1,99 @@ +package week8.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week8.김누리.programmers + * FileName : 실패율 + * Author : 김누리(NRKim) + * Date : 2025-06-16 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 16. 김누리(NRKim) Initial creation + */ + +/* +스테이지는 총 500 까지 + +case 1 : +N = 5 >> 총 스테이지는 5개 + +stages = [2,1,2,6,2,4,3,3] + +stages[0] = 2 >> 스테이지 1 클리어, 2번째 스테이지 체류중 +stages[1] = 1 >> 스테이지 미클리어, 1번째 스테이지 체류중 +stages[2] = 2 >> 스테이지 1 클리어, 2번째 스테이지 체류중 +stages[3] = 6 >> 스테이지 5 클리어 >> 모든 스테이지 클리어 +stages[4] = 2 >> 스테이지 1 클리어, 2번째 스테이지 체류중 +stages[5] = 4 >> 스테이지 3 클리어, 4번째 스테이지 체류중 +stages[6] = 3 >> 스테이지 2 클리어, 3번째 스테이지 체류중 +stages[7] = 3 >> 스테이지 2 클리어, 3번째 스테이지 체류중 + +스테이지 1 ==> 8명 중 1명 실패 ==> 1/8 ===> 0.125 +스테이지 2 ==> 7명 중 3명 실패 ==> 3/7 ===> 0.428 +스테이지 3 ==> 4명 중 2명 실패 ==> 2/4 ===> 0.5 +스테이지 4 ==> 2명 중 1명 실패 ==> 1/2 ===> 0.5 +스테이지 5 ==> 1명 중 1명 실패 ==> 0/1 ===> 0 + +실패율이 가장 높은순으로 정렬 + +3 4 2 1 5 + +*/ + +public class 실패율 { + public int[] solution(int N, int[] stages) { + int[] answer = new int[N]; + Map map = new HashMap<>(); // 맵당 인원 정리 + int player = stages.length; // 총 플레이어 + + // 총인원만큼 돌며 판정 map 초기화 + for(int i = 0; i < stages.length;i++) { + // 최대 5 스테이지 까지. + + map.put(stages[i], map.getOrDefault(stages[i],0)+1); + } + + Mapmap2 = new HashMap<>(); // 맵당 인원 정리 + + // 실패율 계산 + for(int i = 1; i <= N; i++) { + float fail = (float)map.getOrDefault(i,0)/player; + map2.put(i,fail); + player -= map.getOrDefault(i,0); + } + + float[][] arr = new float[N][2]; // 스테이지당 실패율 + + for(int i = 0; i < N; i++) { + float fail = map2.getOrDefault(i + 1, 0f); + arr[i][0] = i+1; // 스테이지 + arr[i][1] = fail; // 실패율 정수화 값 + } + + // 실패율 별로 정렬 + for(int i = 0; i < N-1; i++) { + for(int j = i+1; j < N; j++) { + if(arr[i][1] < arr[j][1] || + (arr[i][1] == arr[j][1] && + arr[i][0] > arr[j][0])) { + float tmpS = arr[i][0]; + float tmpF = arr[i][1]; + arr[i][0] = arr[j][0]; + arr[i][1] = arr[j][1]; + arr[j][0] = tmpS; + arr[j][1] = tmpF; + } + } + } + + for(int i = 0; i < N; i++) { + answer[i] = (int)arr[i][0]; + } + + return answer; + } +} diff --git "a/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" new file mode 100644 index 0000000..0211bd7 --- /dev/null +++ "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" @@ -0,0 +1,73 @@ +package week8.김누리.programmers; + +import java.util.HashSet; +import java.util.Set; + +/** + * PackageName : week8.김누리.programmers + * FileName : 연속_부분_수열_합의_개수 + * Author : 김누리(NRKim) + * Date : 2025-06-18 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 18. 김누리(NRKim) Initial creation + */ + +/* +Case 1 : + +hashset 이용. + +연속 범위가 +1인 경우 + 7 9 1 1 4 + +2인 경우 + 7 9 ==> 16 + 9 1 ==> 10 + 1 1 ==> 2 + 1 4 ==> 5 + 4 7 ==> 11 + +3인 경우 + 7 9 1 ==> 17 + 9 1 1 ==> 11 + 1 1 4 ==> 6 + 1 4 7 ==> 12 + 4 7 9 ==> 20 + +4인 경우 + 7 9 1 1 ==> 18 + 9 1 1 4 ==> 15 + 1 1 4 7 ==> 13 + 1 4 7 9 ==> 21 + +5인 경우 + 7 9 1 1 4 ==> 22 +*/ + +public class 연속_부분_수열_합의_개수 { + public int solution(int[] elements) { + int answer = 0; + Set set = new HashSet<>(); // 중복 제거용 + + // 원형 수열의 배열 만큼 반복 + for(int i = 0; i < elements.length; i++) { + for(int j = 1; j <= elements.length; j++) { + int sum = 0; + + // 연속된 수열 만큼 덧셈 + for(int k = 0; k < j; k++) { + sum += elements[(i+k) % elements.length]; + } + set.add(sum); + } + } + + answer = set.size(); + + return answer; + } +} diff --git "a/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.java" "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.java" new file mode 100644 index 0000000..37e1650 --- /dev/null +++ "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.java" @@ -0,0 +1,59 @@ +package week8.김누리.programmers; + +/** + * PackageName : week8.김누리.programmers + * FileName : 유연근무제 + * Author : 김누리(NRKim) + * Date : 2025-06-17 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 17. 김누리(NRKim) Initial creation + */ + +/* +startday = 근무 시작일 +1 월 +2 화 +3 수 +4 목 +5 금 +6 토 +7 일 + +int[] schedules = 각 인원들의 출근 희망 일 +int[][] timelogs = 실제 출근 시각 + +반복 조건 +평일일 것 +실제 출근 시간 이 희망 출근 시간 보다 이를 때 +실제 출근 시간 이 희망 출근 시간 + 10 이내일 때 + +이 때 주의할 것 +int hopeMin = (s / 100) * 60 + (s % 100); // 희망 출근 시간 → 분 변환 +int logMin = (timestamp[i] / 100) * 60 + (timestamp[i] % 100); // 실제 출근 시간 + +*/ + +public class 유연근무제 { + public int solution(int[] schedules, int[][] timelogs, int startday) { + int answer = schedules.length; // 7일부터 시작 + + for(int i = 0; i < schedules.length; i++) { + for(int j = 0; j < 7; j++) { + int day = (startday + j) % 7; + + // 평일 중 실제 출근 시간이 희망 출근 시간이 이르거나, 희망 출근 시간 + 10분 이내일 때 + if(day > 0 && day < 6 + && 60 * (timelogs[i][j] / 100) + timelogs[i][j] % 100 > 60 * (schedules[i] / 100) + (schedules[i] % 100 + 10) + ) { + answer--; + break; + } + } + } + + return answer; + } +} diff --git "a/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..ca38dd4 --- /dev/null +++ "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,53 @@ +package week8.김누리.programmers; + +/** + * PackageName : week8.김누리.programmers + * FileName : 이상한_문자_만들기 + * Author : 김누리(NRKim) + * Date : 2025-06-15 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 15. 김누리(NRKim) Initial creation + */ + + +/* +" "기준으로 문자 나눔 +나눈 문자 별로 홀수 인덱스는 대문자 짝수 인덱스는 소문자로 조합 +*/ + +public class 이상한_문자_만들기 { + public String solution(String s) { + String answer = ""; + String[] sArr = s.split(""); + StringBuilder sb = new StringBuilder(); + int idx = 0; // 문자의 idx + + for(int i = 0; i < sArr.length; i++) { + + // 해당 idx의 값이 space 일 때 + if (sArr[i].equals(" ")) { + sb.append(" "); + idx = 0; + } + + // 해당 idx가 짝수번 idx 이며, 해당 값이 space가 아닐 때 + else if (idx%2 == 0) { + sb.append(sArr[i].toUpperCase()); + idx++; + } + + // 해당 idx가 홀수번 idx 이며, 해당 값이 space가 아닐 일 때 + else if (idx%2 != 0) { + sb.append(sArr[i].toLowerCase()); + idx++; + } + } + + answer = sb.toString(); + + return answer; + } +} diff --git "a/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\266\251\353\217\214\354\234\204\355\227\230_\354\260\276\352\270\260.java" "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\266\251\353\217\214\354\234\204\355\227\230_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..a97cce2 --- /dev/null +++ "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\354\266\251\353\217\214\354\234\204\355\227\230_\354\260\276\352\270\260.java" @@ -0,0 +1,122 @@ +package week8.김누리.programmers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * PackageName : week8.김누리.programmers + * FileName : 충돌위험_찾기 + * Author : 김누리(NRKim) + * Date : 2025-06-19 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 19. 김누리(NRKim) Initial creation + */ + + +/* +points = [[3, 2], [6, 4], [4, 7], [1, 4]] +points = [[y, x], [y, x], [y, x], [y, x]] + +routes = [[4, 2], [1, 3], [2, 4]] ==> 이거는 좌표 아님 + +routes[0][0] = [4,2] ==> 4번 위치 --> 2번 위치로 간다. + +그러면 map을 2개 쓰자 + +1번 맵 +map = { + 1 = {3,2}, + 2 = {6,4}, + 3 = {4,7}, + 4 = {1,4} +} + + +이후 2번 맵에 시간별 로봇의 이동 경로를 카운팅 하며 충돌 위치 파악 + +※ 초기에 map을 통해 물류 창고 설정 map 초기화는 OK 그러나 이후 경로 설정 및 충돌 로직 구현에서 + AI 도구 이용. 추후 다시 풀어봐야 함 +*/ + + + +public class 충돌위험_찾기 { + public int solution(int[][] points, int[][] routes) { + int answer = 0; + Map map = new HashMap<>(); + + int position = 1; + // 물류센터 포지션 저장 맵 초기화 + for(int[] p : points) { + map.put(position++, p); + } + + // 각 로봇별 시간순 경로 저장 (시간 -> 위치) + List> robotPaths = new ArrayList<>(); + + // 각 로봇의 전체 경로 계산 + for(int[] route : routes) { + List path = new ArrayList<>(); + + // 시작 위치 추가 + int[] currentPos = map.get(route[0]).clone(); + path.add(currentPos.clone()); + + // 각 목표점까지의 경로 계산 + for(int i = 1; i < route.length; i++) { + int[] target = map.get(route[i]); + + // r 좌표부터 이동 + while(currentPos[0] != target[0]) { + if(currentPos[0] < target[0]) currentPos[0]++; + else currentPos[0]--; + path.add(currentPos.clone()); + } + + // c 좌표 이동 + while(currentPos[1] != target[1]) { + if(currentPos[1] < target[1]) currentPos[1]++; + else currentPos[1]--; + path.add(currentPos.clone()); + } + } + + robotPaths.add(path); + } + + // 최대 시간 찾기 + int maxTime = 0; + for(List path : robotPaths) { + maxTime = Math.max(maxTime, path.size()); + } + + // 각 시간별로 충돌 검사 + for(int time = 0; time < maxTime; time++) { + Map> positionRobots = new HashMap<>(); + + // 각 로봇의 현재 시간 위치 확인 + for(int robotId = 0; robotId < robotPaths.size(); robotId++) { + List path = robotPaths.get(robotId); + if(time < path.size()) { + int[] pos = path.get(time); + String posKey = pos[0] + "," + pos[1]; + positionRobots.computeIfAbsent(posKey, k -> new ArrayList<>()).add(robotId); + } + } + + // 같은 위치에 2대 이상 있는 경우 충돌 발생 + for(List robots : positionRobots.values()) { + if(robots.size() > 1) { + answer++; // 한 위치에서 충돌이 발생하면 1 증가 + } + } + } + + return answer; + } +} diff --git "a/week8/\352\271\200\353\210\204\353\246\254/programmers/\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.java" "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..eb63b36 --- /dev/null +++ "b/week8/\352\271\200\353\210\204\353\246\254/programmers/\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.java" @@ -0,0 +1,93 @@ +package week8.김누리.programmers; + +import java.util.Stack; + +/** + * PackageName : week8.김누리.programmers + * FileName : 크레인_인형뽑기_게임 + * Author : 김누리(NRKim) + * Date : 2025-06-18 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 18. 김누리(NRKim) Initial creation + */ + +/* +초기 셋팅 + +board +[ + [0,0,0,0,0], + [0,0,1,0,3], + [0,2,5,0,1], + [4,2,4,4,2], + [3,5,1,3,1] +] + +moves +[1,5,3,5,1,2,1,4] + +int a = moves[i]-1; + +임시 Stack + +int b =board[j][a]; + +Stackst = new Stack<>(); + +Stack이 empty이다? 일단 put + +| | +| | +|4| +|2| +|4| + _ + +board +[ + [0,0,0,0,0], + [0,0,0,0,0], + [0,0,5,0,0], + [0,2,4,4,2], + [0,5,1,3,1] +] + +moves +[1,"5","3","5","1",2,1,4] + +*/ + +public class 크레인_인형뽑기_게임 { + public int solution(int[][] board, int[] moves) { + int answer = 0; + Stackstk = new Stack<>(); + + // 이동 수 만큼 반복 + for(int i = 0 ; i < moves.length; i++) { + int target = moves[i]-1; // moves[i] = 1 ==> 가장 첫번째 즉 0번 idx임 + // + for(int j = 0; j < board.length; j++) { + + if(board[j][target] != 0) { + // 스택이 비어있으면 일단 push + if(stk.isEmpty() || stk.peek() != board[j][target]) { + stk.push(board[j][target]); + } else { + // 스택이 비어있지 않을 경우, 옮겨올 인형과 스택의 가장 위에 있는 인형 비교. 같은 인형이면 한 쌍의 인형(2개)이 삭제되니 +2 + if(stk.peek() == board[j][target]) { + stk.pop(); + answer += 2; + } + } + board[j][target] = 0; + break; + } + } + } + + return answer; + } +} diff --git "a/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" new file mode 100644 index 0000000..bcbe5e2 --- /dev/null +++ "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\352\260\200\354\236\245_\352\260\200\352\271\214\354\232\264_\352\260\231\354\235\200_\352\270\200\354\236\220.java" @@ -0,0 +1,30 @@ +/** + * PackageName : week8.이상억.progarmmers; + * FileName : 가장_가까운_같은_글자 + * Author : sangeok + * Date : 2025. 6. 18. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 18. sangeok Initial creation + */ + + +class Solution { + public int[] solution(String s) { + char[] chararray = s.toCharArray(); + int[] answer = new int[chararray.length]; + + for (int i = 0; i < chararray.length; i++) { + answer[i] = -1; + for (int j = i - 1; j >= 0; j--) { + if (chararray[i] == chararray[j]) { + answer[i] = i - j; + break; + } + } + } + return answer; + } +} diff --git "a/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\352\270\260\354\202\254\353\213\250\354\233\220\354\235\230_\353\254\264\352\270\260.java" "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\352\270\260\354\202\254\353\213\250\354\233\220\354\235\230_\353\254\264\352\270\260.java" new file mode 100644 index 0000000..15295cc --- /dev/null +++ "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\352\270\260\354\202\254\353\213\250\354\233\220\354\235\230_\353\254\264\352\270\260.java" @@ -0,0 +1,39 @@ +/** + * PackageName : week8.이상억.progarmmers; + * FileName : 기사단원의_무기 + * Author : sangeok + * Date : 2025. 6. 16. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 16. sangeok Initial creation + */ + +// 문제 요구사항 : 자신의 기사 번호의 약수 개수에 해당하는 공격력을 가진 무기 구매 +//제한 수치 넘을 경우 제한된 공격력을 가진 무기 +//무기 공격력 1당 1kg 의 철 +//ex -> 15번 지정된 기사단원 1,3,5,15 약수 4개 이므로 4인 공격력 이지만 제한 수치가 3 초과한 제약은 2라서 2를 구매 +//기사단원의 수 : number / 공격력의 제한 수치 : limit / 제한 수치를 초과한 기사 사용할 무기의 공격력 : power + +// 회고 : 처음에 별 생각 없이 이중 for 문 썻다가 n^2 떠서 터졌다 .. 그래서 i * i < j 방식을 사용해서 반복횟수를 줄이는 방법을 하려했으나 +// 다른 방법이 있을 것 같아 찾아 봤는데 DP 방법이 있어 그 방법을 채택해서 문제 해결하였다. + + +public int solution(int number, int limit, int power) { + int[] divisorCount = new int[number + 1]; + int answer = 0; + + // 약수 개수 미리 계산 + for (int i = 1; i <= number; i++) { + for (int j = i; j <= number; j += i) { + divisorCount[j]++; + } + } + + for (int i = 1; i <= number; i++) { + answer += (divisorCount[i] > limit) ? power : divisorCount[i]; + } + + return answer; +} diff --git "a/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\353\225\205\353\224\260\353\250\271\352\270\260.java" "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\353\225\205\353\224\260\353\250\271\352\270\260.java" new file mode 100644 index 0000000..f66dc71 --- /dev/null +++ "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\353\225\205\353\224\260\353\250\271\352\270\260.java" @@ -0,0 +1,45 @@ +/** + * PackageName : week8.이상억.progarmmers; + * FileName : 땅따먹기 + * Author : sangeok + * Date : 2025. 6. 19. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 19. sangeok Initial creation + */ + +// 문제 요구사항 : 게임 땅 => N 행 4열 +// 1 행부터 한 행씩 내려올 때 각 행의 4칸중 한칸만 밣으면서 => 한 행씩 내려올 때 같은 열을 연속해서 x +// +//접근 방식 : 완전탐색 문제로 풀기엔 너무 경우의 수가 많아진다. -> 시간복잡도 터질 확률이 높아보임 +// +// + +class Solution { + int solution(int[][] land) { + int answer = 0; + + int[][] dp = new int[land.length][4]; + + for (int a = 0; a < 4; a++) { + dp[0][a] = land[0][a]; + } + + for(int i = 1; i < land.length; i++){ + for(int j = 0; j < 4 ; j++){ + for(int k = 0; k < 4; k++){ + if( j == k ) continue; + dp[i][j] = Math.max(dp[i][j],dp[i-1][k] + land[i][j]); + } + } + } + + for(int i = 0; i < 4; i++){ + answer = Math.max(answer,dp[land.length-1][i]); + } + + return answer; + } +} \ No newline at end of file diff --git "a/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\212\244\355\202\254\355\212\270\353\246\254.java" "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\212\244\355\202\254\355\212\270\353\246\254.java" new file mode 100644 index 0000000..8015c92 --- /dev/null +++ "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\212\244\355\202\254\355\212\270\353\246\254.java" @@ -0,0 +1,45 @@ +/** + * PackageName : week8.이상억.progarmmers; + * FileName : 실패율 + * Author : sangeok + * Date : 2025. 6. 19. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 19. sangeok Initial creation + */ + +// +import java.util.*; + +class Solution { + public int solution(String skill, String[] skill_trees) { + int answer = 0; + + for(String tree : skill_trees){ + + Stack stack = new Stack<>(); + + for(int i = skill.length()-1 ; i >= 0; i--){ + stack.push(skill.charAt(i)); + } + + boolean isvalid = true; + + for(char c : tree.toCharArray()){ + if(!stack.contains(c)) continue; + if( !stack.isEmpty() && c == stack.peek() ){ + stack.pop(); + } + else { + isvalid = false; + break; + } + } + if(isvalid) answer++; + + } + return answer; + } +} \ No newline at end of file diff --git "a/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\213\244\355\214\250\354\234\250.java" "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\213\244\355\214\250\354\234\250.java" new file mode 100644 index 0000000..edd566f --- /dev/null +++ "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\213\244\355\214\250\354\234\250.java" @@ -0,0 +1,56 @@ +/** + * PackageName : week8.이상억.progarmmers; + * FileName : 실패율 + * Author : sangeok + * Date : 2025. 6. 18. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 18. sangeok Initial creation + */ + + +//문제 요구사항 : 실패율 => 클리어 못한 players / stages 도달한 players +// 전체 stage : N // 현재 사용자가 멈춰 있는 번호가 담긴 배열 : stage +// 실패율이 높은 스테이지 부터 내림차순 +// +//접근 방식 : stage 깬 사람과 도달한 사람을 hashmap으로 등록해서 나타내면 될 거같음. stages 배열을 돌면서 그 안에 또 for문을 사용해 clear와 falied 를 등록하니 시간 복잡도가 터짐 ( N X M ) +// => 정수 배열만을 두고 사용 +// 중간 계산식에서 double 로 캐스팅 하기 싫어서 정수형으로 최대로 나타낼 수 있는 숫자 -2,100,000,000 ~ 2,100,000,000 이거 대충 생각하고 1억인가 10억 곱하는거로 했다가 overflow 나타남 +// 그래서 결국엔 dobule 로 캐스팅 해서 풀었는데 중간에 0일 때를 따로 빼고 하지 않아서 테스트 케이스에서 오류가 많이나서 조건문 추가 해 해결 + +import java.util.*; + +class Solution { + public int[] solution(int N, int[] stages) { + int len = stages.length; + + int[] answer = new int[N]; + int[] failed = new int[N+2]; + + List list = new ArrayList<>(); + + for( int stage : stages ){ + if( stage <= N ) failed[stage]++; + } + int total = len; + for(int i = 1 ; i <= N; i++){ + int fail = failed[i]; + double failrate = (total == 0) ? 0.0 : (double) fail / total; + list.add(new double[]{i,failrate}); + total -= fail; + } + + list.sort((a, b) -> { + int cmp = Double.compare(b[1], a[1]); + if (cmp == 0) return (int)(a[0] - b[0]); + return cmp; + }); + + for(int i = 0; i < N; i++){ + answer[i] = (int)list.get(i)[0]; + } + return answer; + } +} \ No newline at end of file diff --git "a/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" new file mode 100644 index 0000000..9c5e02f --- /dev/null +++ "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\227\260\354\206\215_\353\266\200\353\266\204_\354\210\230\354\227\264_\355\225\251\354\235\230_\352\260\234\354\210\230.java" @@ -0,0 +1,36 @@ +/** + * PackageName : week8.이상억.progarmmers; + * FileName : 연속_부분_수열_합의_개수 + * Author : sangeok + * Date : 2025. 6. 17. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 17. sangeok Initial creation + */ + +// 회고 : 문제에 있는 원형 구조? +// 이걸 보고 원형큐를 생각해 큐를 사용해서 작성했다가 굳이라는 생각으 들어 % len을 사용해 문제를 풀었다. + + +import java.util.*; + +class Solution { + public int solution(int[] elements) { + Set sumset = new HashSet<>(); + int len = elements.length; + + for (int window = 1; window <= len; window++) { + for (int start = 0; start < len; start++) { + int sum = 0; + for (int k = 0; k < window; k++) { + sum += elements[(start + k) % len]; + } + sumset.add(sum); + } + } + + return sumset.size(); + } +} diff --git "a/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.java" "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.java" new file mode 100644 index 0000000..57fa632 --- /dev/null +++ "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.java" @@ -0,0 +1,45 @@ +/** + * PackageName : week8.이상억.progarmmers; + * FileName : 유연근무제 + * Author : sangeok + * Date : 2025. 6. 16. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 16. sangeok Initial creation + */ + +// 문제 요구사항 : 출근 희망 시각 + 10 까지 어플로 출근 ( 희망 시각 9:58 => 10:8 까지 ) +// 토,일요일의 출근 시각은 이벤트에 영향 x +// 모든 시각은 시에 x 100 더한 정수 10:13 => 1013 +// 직원 n 명의 출근 희망 시각 : schedules // +// 일주일 동안 출근한 시각 : timelogs // 이벤트 시작 요일 startday +// 1 : 월 ~ 7 : 일 +// +// 접근 방식 : (1) 그냥 for 문 ? +// 1) schedules에 10 더하고 그 다음 timelogs 도 그냥 돌면 되겠는데 +// 그 안에서 startday n % 7 + 1 로 요일 돌리고 + +class Solution { + public int solution(int[] schedules, int[][] timelogs, int startday) { + int answer = 0; + + for (int i = 0; i < schedules.length; i++) { + + int maxtime = ((schedules[i] / 100) * 60) + ((schedules[i] % 100) + 10); + int correctcount = 0; + int currentDay = startday; + + for (int j = 0; j < timelogs[i].length; j++) { + + int log = ((timelogs[i][j] / 100) * 60) + (timelogs[i][j] % 100); + if (log > maxtime && currentDay != 6 && currentDay != 7) correctcount--; + currentDay = (currentDay % 7) + 1; + + } + if (correctcount == 0) answer++; + } + return answer; + } +} diff --git "a/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" new file mode 100644 index 0000000..e67e8a0 --- /dev/null +++ "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\235\264\354\203\201\355\225\234_\353\254\270\354\236\220_\353\247\214\353\223\244\352\270\260.java" @@ -0,0 +1,36 @@ +/** + * PackageName : week8.이상억.progarmmers; + * FileName : 이상한_문자_만들기 + * Author : sangeok + * Date : 2025. 6. 18. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 18. sangeok Initial creation + */ + +class Solution { + public String solution(String s) { + StringBuilder answer = new StringBuilder(); + int index = 0; + + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == ' ') { + index = 0; + answer.append(c); + } else { + if (index % 2 == 1) { + answer.append(Character.toLowerCase(c)); + } else { + answer.append(Character.toUpperCase(c)); + } + index++; + } + } + + return answer.toString(); + } +} diff --git "a/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\266\251\353\217\214\354\234\204\355\227\230_\354\260\276\352\270\260.java" "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\266\251\353\217\214\354\234\204\355\227\230_\354\260\276\352\270\260.java" new file mode 100644 index 0000000..f7416d1 --- /dev/null +++ "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\354\266\251\353\217\214\354\234\204\355\227\230_\354\260\276\352\270\260.java" @@ -0,0 +1,70 @@ +/** + * PackageName : week8.이상억.progarmmers; + * FileName : 충돌위험_찾기 + * Author : sangeok + * Date : 2025. 6. 20. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 17. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int solution(int[][] points, int[][] routes) { + Map pointMap = new HashMap<>(); + for (int i = 0; i < points.length; i++) { + pointMap.put(i + 1, points[i]); + } + + Map> timeToPositionCount = new HashMap<>(); + + for (int[] route : routes) { + List path = new ArrayList<>(); + int time = 0; + + for (int i = 0; i < route.length - 1; i++) { + int[] start = pointMap.get(route[i]); + int[] end = pointMap.get(route[i + 1]); + + int r = start[0]; + int c = start[1]; + int er = end[0]; + int ec = end[1]; + + while (r != er) { + path.add(new int[]{r, c}); + r += (er > r) ? 1 : -1; + } + while (c != ec) { + path.add(new int[]{r, c}); + c += (ec > c) ? 1 : -1; + } + } + + int[] last = pointMap.get(route[route.length - 1]); + path.add(new int[]{last[0], last[1]}); + + for (int[] pos : path) { + String key = pos[0] + "," + pos[1]; + timeToPositionCount.putIfAbsent(time, new HashMap<>()); + Map posCount = timeToPositionCount.get(time); + posCount.put(key, posCount.getOrDefault(key, 0) + 1); + time++; + } + } + + int dangerCount = 0; + for (Map map : timeToPositionCount.values()) { + for (int count : map.values()) { + if (count >= 2) { + dangerCount++; + } + } + } + + return dangerCount; + } +} diff --git "a/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.java" "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.java" new file mode 100644 index 0000000..b86a227 --- /dev/null +++ "b/week8/\354\235\264\354\203\201\354\226\265/progarmmers/\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.java" @@ -0,0 +1,56 @@ +/** + * PackageName : week8.이상억.progarmmers; + * FileName : 크레인_인형뽑기_게임 + * Author : sangeok + * Date : 2025. 6. 17. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 17. sangeok Initial creation + */ + +// 크레인 인형뽑기 게임 +// +//문제 요구사항 : board size : 5x5 <= 30x30 +// board : 0은 빈칸 1~100의 숫자는 각기 다른 인형 모양 의미 +// 터트려 사라진 인형의 개수 +// +//접근 방식 : stack 사용 +// +// 0 0 0 0 0 +// 0 0 1 0 3 +// 0 2 5 0 1 +// 4 2 4 4 2 +// 3 5 1 3 1 + +import java.util.*; + +class Solution { + public int solution(int[][] board, int[] moves) { + int answer = 0; + Stack stack = new Stack<>(); + + for(int i = 0; i < moves.length; i++){ + int col = moves[i]-1; + + for(int row = 0; row < board[0].length; row++){ + if(board[row][col] != 0 ){ + + int picked = board[row][col]; + board[row][col] = 0; + + if (!stack.isEmpty() && stack.peek() == picked) { + stack.pop(); + answer += 2; + } else { + stack.push(picked); + } + break; + } + } + } + + return answer; + } +} \ No newline at end of file diff --git "a/week8_a/progarmmers/\352\271\200\353\210\204\353\246\254/programmers/\353\241\244\354\274\200\354\235\264\355\201\254_\354\236\220\353\245\264\352\270\260.java" "b/week8_a/progarmmers/\352\271\200\353\210\204\353\246\254/programmers/\353\241\244\354\274\200\354\235\264\355\201\254_\354\236\220\353\245\264\352\270\260.java" new file mode 100644 index 0000000..7ef2ab4 --- /dev/null +++ "b/week8_a/progarmmers/\352\271\200\353\210\204\353\246\254/programmers/\353\241\244\354\274\200\354\235\264\355\201\254_\354\236\220\353\245\264\352\270\260.java" @@ -0,0 +1,70 @@ +package week8_a.progarmmers.김누리.programmers; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * PackageName : week8_a.progarmmers.김누리.programmers + * FileName : 롤케이크_자르기 + * Author : 김누리(NRKim) + * Date : 2025-06-24 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 24. 김누리(NRKim) Initial creation + */ + +/* +HashSet 이용. +HashSet cs +HashSet sis + +cs에 1, 2 [1 2] +sis에 1, 3, 4, 2 [1 3 1 4 1 2] +-- 사이즈 달라서 NG + +cs에 1 2 3 [1 2 1 3] +sis에 1 4 2[1 4 1 2] +-- 사이즈 같아서 Good > cnt++ + +cs에 1 2 3 [1 2 1 3 1] +sis에 4 1 2 [4 1 2] +-- 사이즈 같아서 Good > cnt++ + +*/ + +public class 롤케이크_자르기 { + public int solution(int[] topping) { + int answer = 0; + Map map = new HashMap<>(); // 여동생 배열 + Set set = new HashSet<>(); + + // 여동생한테 토핑 셋팅 + for(int i : topping) { + map.put(i,map.getOrDefault(i,0)+1); + } + + // 토핑 갯수 + int cnt = 0; + + // 여동생 토핑 >> 철수 토핑에 분배 + for (int i = 0; i < topping.length; i++) { + set.add(topping[i]); + + cnt = map.get(topping[i]); + + if(cnt == 1) { + map.remove(topping[i]); + } else { + map.put(topping[i],cnt-1); + } + + if (set.size() == map.size()) answer++; + } + + return answer; + } +} diff --git "a/week8_a/\352\260\225\354\204\261\354\232\261/programmers/\353\241\244\354\274\200\354\235\264\355\201\254_\354\236\220\353\245\264\352\270\260.java" "b/week8_a/\352\260\225\354\204\261\354\232\261/programmers/\353\241\244\354\274\200\354\235\264\355\201\254_\354\236\220\353\245\264\352\270\260.java" new file mode 100644 index 0000000..1b112b0 --- /dev/null +++ "b/week8_a/\352\260\225\354\204\261\354\232\261/programmers/\353\241\244\354\274\200\354\235\264\355\201\254_\354\236\220\353\245\264\352\270\260.java" @@ -0,0 +1,52 @@ +package week8_a.강성욱.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week8_a.강성욱.programmers + * FileName : 롤케이크_자르기 + * Author : Baekgwa + * Date : 2025-06-23 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-23 Baekgwa Initial creation + */ +public class 롤케이크_자르기 { + //일정 문자열에서 어느 지점을 잘랐을때, 그 지점 기준으로 토핑의 종류가 같으면 공평한 것. + // 공평하지 못할 수도 있음. + // 최대 1,000,000 길이의 토핑 종류가 들어옴... + // 공평하게 자르는 방법의 수를 모두 체크해야됨. (거의 완탐) + // set 두개를 사용해서 넣고 빼고 사이즈 비교? 하면 되긴함. + // 마지막까지 다 잘라봐야지 모두 체크가 가능할듯 + // 아 이거 set 쓰면 안된다. map 으로 해야된다. + + class Solution { + public int solution(int[] topping) { + Map mapLeft = new HashMap<>(); + Map mapRight = new HashMap<>(); + int result = 0; + + //전부 다 right 에 다 박아두기. 자르기 전이라는 가정 + for(int i=0; i set = new HashSet<>(); // 왼쪽부터 잘라나갈 토핑 + + Map map = new HashMap<>(); + + // 전체 토핑 개수 세기 + for(int i : topping){ + map.put( i , map.getOrDefault(i,0) + 1); + } + + for(int i : topping){ + set.add(i); + map.put(i,map.get(i) -1 ); + if(map.get(i) == 0) map.remove(i); + if(set.size() == map.size()) answer ++; + } + + return answer; + } +}week8_a \ No newline at end of file diff --git "a/week9/\352\260\225\354\204\261\354\232\261/programmers/N_\352\260\234\354\235\230_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" "b/week9/\352\260\225\354\204\261\354\232\261/programmers/N_\352\260\234\354\235\230_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" new file mode 100644 index 0000000..b9acf38 --- /dev/null +++ "b/week9/\352\260\225\354\204\261\354\232\261/programmers/N_\352\260\234\354\235\230_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" @@ -0,0 +1,45 @@ +package week9.강성욱.programmers; + +/** + * PackageName : week9.강성욱.programmers + * FileName : N_개의_최소공배수 + * Author : Baekgwa + * Date : 2025-06-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-25 Baekgwa Initial creation + */ +public class N_개의_최소공배수 { + // 2중 반복문으로 풀면? + // 가장 큰 공배수일떄? + // [99, 98, 97, 96 ... 50] 정도 까지하면 가장 큰 공배수일듯? + // 해봣자 1백만 안될듯? + // 1백만 반복 x 15개 반복(약수인지 확인) + // 문제없는디? + + class Solution { + public int solution(int[] arr) { + int result = 0; + + int val = 1; + while(result == 0) { + boolean isAllOk = true; + + for(int i=0; i dy = -1; + case 'S' -> dy = 1; + case 'W' -> dx = -1; + case 'E' -> dx = 1; + } + + int nextY = now[0]; + int nextX = now[1]; + boolean canMove = true; + + for (int i = 0; i < count; i++) { + nextY += dy; + nextX += dx; + + if (nextY < 0 || nextY >= h || nextX < 0 || nextX >= w || map[nextY][nextX] == 'X') { + canMove = false; + break; + } + } + + if (canMove) { + now[0] = nextY; + now[1] = nextX; + } + } + + return now; + } + } +} diff --git "a/week9/\352\260\225\354\204\261\354\232\261/programmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" "b/week9/\352\260\225\354\204\261\354\232\261/programmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" new file mode 100644 index 0000000..b9b172d --- /dev/null +++ "b/week9/\352\260\225\354\204\261\354\232\261/programmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" @@ -0,0 +1,36 @@ +package week9.강성욱.programmers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week9.강성욱.programmers + * FileName : 나누어_떨어지는_숫자_배열 + * Author : Baekgwa + * Date : 2025-06-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-25 Baekgwa Initial creation + */ +public class 나누어_떨어지는_숫자_배열 { + // 범위가 딱히 나와있진않음. + // 딱히 생각나는 알고리즘도 없음. 반복문으로 해결하자 그냥 + + class Solution { + public int[] solution(int[] arr, int divisor) { + List result = new ArrayList<>(); + + for(int val : arr) { + if(val % divisor == 0) result.add(val); + } + + if(result.isEmpty()) return new int[]{-1}; + + Collections.sort(result); + return result.stream().mapToInt(Integer::intValue).toArray(); + } + } +} diff --git "a/week9/\352\260\225\354\204\261\354\232\261/programmers/\353\215\247\354\271\240\355\225\230\352\270\260.java" "b/week9/\352\260\225\354\204\261\354\232\261/programmers/\353\215\247\354\271\240\355\225\230\352\270\260.java" new file mode 100644 index 0000000..c3fe0d2 --- /dev/null +++ "b/week9/\352\260\225\354\204\261\354\232\261/programmers/\353\215\247\354\271\240\355\225\230\352\270\260.java" @@ -0,0 +1,33 @@ +package week9.강성욱.programmers; + +/** + * PackageName : week9.강성욱.programmers + * FileName : 덧칠하기 + * Author : Baekgwa + * Date : 2025-06-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-25 Baekgwa Initial creation + */ +public class 덧칠하기 { + // 오 머리쓰는문제다 + // 앞에서부터 칠하면 안되나 그냥? + // 반복문 돌면서 하나씩 확인하고 칠하면 될 것 같은데? + + class Solution { + public int solution(int n, int m, int[] section) { + int count = 0; + int nowCovered = 0; + for(int sec : section) { + if(nowCovered >= sec) continue; + + nowCovered = sec + m - 1; + count++; + } + + return count; + } + } +} diff --git "a/week9/\352\260\225\354\204\261\354\232\261/programmers/\353\271\233\354\235\230_\352\262\275\353\241\234_\354\202\254\354\235\264\355\201\264.java" "b/week9/\352\260\225\354\204\261\354\232\261/programmers/\353\271\233\354\235\230_\352\262\275\353\241\234_\354\202\254\354\235\264\355\201\264.java" new file mode 100644 index 0000000..522abdb --- /dev/null +++ "b/week9/\352\260\225\354\204\261\354\232\261/programmers/\353\271\233\354\235\230_\352\262\275\353\241\234_\354\202\254\354\235\264\355\201\264.java" @@ -0,0 +1,120 @@ +package week9.강성욱.programmers; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +/** + * PackageName : week9.강성욱.programmers + * FileName : 빛의_경로_사이클 + * Author : Baekgwa + * Date : 2025-06-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025-06-25 Baekgwa Initial creation + */ +public class 빛의_경로_사이클 { + + class Solution { + private final int[] dy = {-1, 0, 1, 0}; + private final int[] dx = {0, 1, 0, -1}; + + public int[] solution(String[] grid) { + int h = grid.length; + int w = grid[0].length(); + Set visited = new HashSet<>(); + List result = new ArrayList<>(); + + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++) { + for (int dir = 0; dir < 4; dir++) { + Light start = new Light(y, x, dir); + if (visited.contains(start)) continue; + + int cnt = 0; + int nowY = y; + int nowX = x; + int nowDir = dir; + + while (true) { + Light current = new Light(nowY, nowX, nowDir); + if (visited.contains(current)) break; + + visited.add(current); + cnt++; + + // 다음 위치 계산 + int nextY = nowY + dy[nowDir]; + int nextX = nowX + dx[nowDir]; + + // 위쪽으로 나가면 맨 아래로 + if (nextY < 0) { + nextY = h - 1; + } + // 아래쪽으로 나가면 맨 위로 + else if (nextY >= h) { + nextY = 0; + } + + // 왼쪽으로 나가면 맨 오른쪽으로 + if (nextX < 0) { + nextX = w - 1; + } + // 오른쪽으로 나가면 맨 왼쪽으로 + else if (nextX >= w) { + nextX = 0; + } + + // 이동 적용 + nowY = nextY; + nowX = nextX; + + char command = grid[nowY].charAt(nowX); + if (command == 'L') { + nowDir = (nowDir + 3) % 4; + } else if (command == 'R') { + nowDir = (nowDir + 1) % 4; + } + + if (nowY == y && nowX == x && nowDir == dir) break; + } + + if (cnt > 0) result.add(cnt); + } + } + } + + return result.stream().sorted().mapToInt(Integer::intValue).toArray(); + } + + private static class Light { + private final int y; + private final int x; + private final int dir; + + Light(int y, int x, int dir) { + this.y = y; + this.x = x; + this.dir = dir; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Light)) return false; + Light light = (Light) o; + return y == light.y && x == light.x && dir == light.dir; + } + + + @Override + public int hashCode() { + return Objects.hash(y, x, dir); + } + } + } +} diff --git "a/week9/\352\271\200\353\202\230\354\235\200/programmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" "b/week9/\352\271\200\353\202\230\354\235\200/programmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" new file mode 100644 index 0000000..35e57ad --- /dev/null +++ "b/week9/\352\271\200\353\202\230\354\235\200/programmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" @@ -0,0 +1,42 @@ +package week9.김나은.programmers; + +import java.util.Arrays; + +public class 나누어_떨어지는_숫자_배열 { + + class Solution { + + public int[] solution(int[] arr, int divisor) { + int count = 0; // divisor로 나누어 떨어지는 요소의 개수를 세기 위한 변수 + + // 첫 번째 반복문: 나누어 떨어지는 숫자의 개수 세기 + for (int i = 0; i < arr.length; i++) { + if (arr[i] % divisor == 0) { // 나누어 떨어지는 경우 + count++; // 개수 증가 + } + } + + if (count == 0) { + // 나누어 떨어지는 숫자가 없을 경우, -1을 원소로 가지는 배열 반환 + return new int[]{-1}; + } + + // 결과 배열 선언 (크기는 나누어 떨어지는 숫자의 개수만큼) + int[] answer = new int[count]; + + int index = 0; // answer 배열에 값을 넣기 위한 인덱스 + + // 두 번째 반복문: 실제로 나누어 떨어지는 숫자를 answer 배열에 담음 + for (int i = 0; i < arr.length; i++) { + if (arr[i] % divisor == 0) { // 나누어 떨어지면 + answer[index++] = arr[i]; // 배열에 저장하고 인덱스 증가 + } + } + + // 결과 배열을 오름차순으로 정렬 + Arrays.sort(answer); + + return answer; + } + } +} diff --git "a/week9/\352\271\200\353\210\204\353\246\254/programmers/N\352\260\234\354\235\230_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" "b/week9/\352\271\200\353\210\204\353\246\254/programmers/N\352\260\234\354\235\230_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" new file mode 100644 index 0000000..08d7fe7 --- /dev/null +++ "b/week9/\352\271\200\353\210\204\353\246\254/programmers/N\352\260\234\354\235\230_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" @@ -0,0 +1,56 @@ +package week9.김누리.programmers; + +/** + * PackageName : week9.김누리.programmers + * FileName : N개의_최소공배수 + * Author : 김누리(NRKim) + * Date : 2025-06-24 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 24. 김누리(NRKim) Initial creation + */ + + +/* + 유클리드 호제법 이용 + + 유클리드 호제법: 큰 수를 작은 수로 나눈 나머지로 계속 나누다가 나머지가 0이 되는 순간의 나누는 + 수가 최대공약수 + + +*/ + +public class N개의_최소공배수 { + public int solution(int[] arr) { + int answer = 0; + + // arr의 길이가 1인 경우 + if(arr.length == 1) return arr[0]; + + // 초기 최소 공약수 셋팅 + int g = gcd(arr[0],arr[1]); + + // 초기 answer 값 셋팅 + answer = (arr[0] * arr[1]) / g; + + + if(arr.length > 1) { + for(int i = 2; i < arr.length; i++) { + g = gcd(arr[i],answer); + answer = (answer* arr[i])/g; + } + } + + return answer; + } + + + // 유클리드 호제법 공식 + public int gcd(int a, int b) { + if (a%b == 0) return b; + + return gcd(b, a%b); + } +} diff --git "a/week9/\352\271\200\353\210\204\353\246\254/programmers/\352\263\265\354\233\220_\354\202\260\354\261\205.java" "b/week9/\352\271\200\353\210\204\353\246\254/programmers/\352\263\265\354\233\220_\354\202\260\354\261\205.java" new file mode 100644 index 0000000..02880c8 --- /dev/null +++ "b/week9/\352\271\200\353\210\204\353\246\254/programmers/\352\263\265\354\233\220_\354\202\260\354\261\205.java" @@ -0,0 +1,130 @@ +package week9.김누리.programmers; + +import java.util.HashMap; +import java.util.Map; + +/** + * PackageName : week9.김누리.programmers + * FileName : 공원_산책 + * Author : 김누리(NRKim) + * Date : 2025-06-23 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 23. 김누리(NRKim) Initial creation + */ + + +/* +int[] start = new int [2]; +int[] goal = new int [2]; + +0. 좌표값 초기화 +Mapmap = new HashMap<>(); + +map.put("E",1); +map.put("W",-1); +map.put("N",1); +map.put("S",-1); + +1. park 배열 2차원 배열화 +2. 시작점 셋팅 +3. 명령어 배열화 +4. 1번에서 2차원 배열화 한 배열에서 [i][j]이 O 면 이동 가능, X 면 이동 불가 판정을 내리며 진행 + +*/ +public class 공원_산책 { + public int[] solution(String[] park, String[] routes) { + int[] answer = new int[2]; + String[][] parks = new String[park.length][]; + String[][] commands = new String[routes.length][]; + int[] start = new int[2]; // 시작점 y,x 순번 + Map map = new HashMap<>(); + + // 0. 좌표값 초기화 + map.put("E",1); + map.put("W",-1); + map.put("S",1); + map.put("N",-1); + + + // 1. park 배열 2차원 배열화 + for(int i = 0; i < park.length; i++) { + // + String now = park[i]; + String[] tmp = now.split(""); + + parks[i] = tmp; + } + + // 2. 시작점 셋팅 + for (int i = 0; i < parks.length; i++) { + for (int j = 0; j < parks[0].length; j++) { + if(parks[i][j].equals("S")) { + start[0] = i; + start[1] = j; + } + } + } + + int h = parks.length; // 높이 + int w = parks[0].length; // 너비 + + // 3. 명령어 2차원 배열화 + for(int i = 0; i < routes.length; i++) { + String now = routes[i]; + String[] tmp = now.split(" "); + + commands[i] = tmp; + } + + // 4. 로직 구현 + for(int i = 0; i < commands.length; i++) { + String obj = commands[i][0]; + int dist = Integer.parseInt(commands[i][1]); + + // 현재 x축 y축 + int x = 0; + int y = 0; + + // 방향이 x 축인 경우 + if(obj.equals("E") || obj.equals("W")) { + x = map.get(obj); + } else { + y = map.get(obj); + } + + // 막혀 있는지 체크 + boolean isBlocked = false; + int nx = start[1]; + int ny = start[0]; + + // 새 x,y 좌표값 계산 + for(int j = 0; j < dist; j++) { + ny += y; + nx += x; + + // 이동 후 x,y값이 맵의 크기를 벗어나지 않고, 해당 위치가 X면 안가고 패스 + if(ny < 0 || ny >= h || nx < 0 || nx >= w || parks[ny][nx].equals("X")) { + isBlocked = true; + break; + } + } + + // 정상 케이스인 경우 > 신규 y,x 축을 다시 시작점으로 + if(!isBlocked) { + start[0] = ny; + start[1] = nx; + } + } + + int idx = 0; + // 5. start >> answer + for(int i : start) { + answer[idx++] = i; + } + + return answer; + } +} diff --git "a/week9/\352\271\200\353\210\204\353\246\254/programmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" "b/week9/\352\271\200\353\210\204\353\246\254/programmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" new file mode 100644 index 0000000..0bda6f1 --- /dev/null +++ "b/week9/\352\271\200\353\210\204\353\246\254/programmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" @@ -0,0 +1,40 @@ +package week9.김누리.programmers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week9.김누리.programmers + * FileName : 나누어_떨어지는_숫자_배열 + * Author : 김누리(NRKim) + * Date : 2025-06-24 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 24. 김누리(NRKim) Initial creation + */ + +public class 나누어_떨어지는_숫자_배열 { + public int[] solution(int[] arr, int divisor) { + List list = new ArrayList<>(); + + for(int i : arr) { + if ( i % divisor == 0 ) { + list.add(i); + } + } + + int[] answer = new int[list.size()]; + + if (list.size() == 0) return new int[] {-1}; + + Collections.sort(list); + + int idx = 0; + for(int i : list) answer[idx++] = i; + + return answer; + } +} diff --git "a/week9/\352\271\200\353\210\204\353\246\254/programmers/\353\215\247\354\271\240\355\225\230\352\270\260.java" "b/week9/\352\271\200\353\210\204\353\246\254/programmers/\353\215\247\354\271\240\355\225\230\352\270\260.java" new file mode 100644 index 0000000..8e3364c --- /dev/null +++ "b/week9/\352\271\200\353\210\204\353\246\254/programmers/\353\215\247\354\271\240\355\225\230\352\270\260.java" @@ -0,0 +1,39 @@ +package week9.김누리.programmers; + +/** + * PackageName : week9.김누리.programmers + * FileName : 덧칠하기 + * Author : 김누리(NRKim) + * Date : 2025-06-25 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 25. 김누리(NRKim) Initial creation + */ + +/* +n = 페인트가 칠해진 벽의 길이 +m = 롤러의 길이 +section[] = 페인트 발라야 되는 구간 + +칠해야 되는 곳이, 마지막으로 칠해진 위치 내에 있으면 계속 칠하며 +*/ + +public class 덧칠하기 { + public int solution(int n, int m, int[] section) { + int answer = 0; + int last = 0; // 마지막으로 칠해진 곳 위치 + + + for(int i = 0; i < section.length; i++) { + if(section[i] <= last) continue; // 현재 위치가 마지막으로 칠해진 위치 이전인지 판독 + + last = section[i] + m - 1; // section[i] 에서 m칸 칠함 + answer++; + } + + + return answer; + } +} diff --git "a/week9/\352\271\200\353\210\204\353\246\254/programmers/\353\271\233\354\235\230_\352\262\275\353\241\234_\354\202\254\354\235\264\355\201\264.java" "b/week9/\352\271\200\353\210\204\353\246\254/programmers/\353\271\233\354\235\230_\352\262\275\353\241\234_\354\202\254\354\235\264\355\201\264.java" new file mode 100644 index 0000000..58a41f0 --- /dev/null +++ "b/week9/\352\271\200\353\210\204\353\246\254/programmers/\353\271\233\354\235\230_\352\262\275\353\241\234_\354\202\254\354\235\264\355\201\264.java" @@ -0,0 +1,115 @@ +package week9.김누리.programmers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PackageName : week9.김누리.programmers + * FileName : 빛의_경로_사이클 + * Author : 김누리(NRKim) + * Date : 2025-06-26 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 06. 26. 김누리(NRKim) Initial creation + */ + +/* +dfs? bfs? >>> 단순히 반복문 ㄱㄱ + +우선 그럼 grid = {"SL","LR"}; >> grids[][] = {{"S","L"},{"L","R"}} + +3중 반복 문을 진행하며 사이클 로직 구현 +※ grid의 길이가 500 이긴 해도, 3중 for문 진행 시 + +x < 500 +y < 500 +d < 4 + +로 총 100만 건 정도 반복되기 때문에, 3중 for문 써도 무방. + +visited[x][y][d] >> 단순히 x,y 좌표만으로는 어느 방향에서 빛이 들어왔는지 확인 불가능 하기 때문에 3중 배열로 진행 + +*/ + +public class 빛의_경로_사이클 { + // 상하좌우 방향 + int[] dx = {-1,0,1,0}; + int[] dy = {0,1,0,-1}; + + public int[] solution(String[] grid) { + char[][] grids = new char[grid.length][]; + + // grid 문자열 배열을 이차원 배열화 + for(int i = 0; i < grid.length; i++) { + // + char[] tmp = grid[i].toCharArray(); + + grids[i] = tmp; + } + + // x, y 축 길이 + int n = grids.length; + int m = grids[0].length; + + // 방문 체크용 배열 + // [x][y][d] ==> d가 4인 이유는 상 하 좌 우 4방향이기 때문 + boolean[][][] visited = new boolean[n][m][4]; + + // 빛의 경로 저장용 리스트 + List list = new ArrayList<>(); + + // + for(int x = 0; x < n; x++) { + for(int y = 0; y < m; y++) { + for(int d = 0; d < 4; d++) { + if (!visited[x][y][d]) { + int path = followCycle(x,y,d,visited,n,m,dx,dy,grids); + list.add(path); + } + } + } + } + + // 오름차순화 + Collections.sort(list); + + + // list >> answer 배열에 적재 + int[] answer = new int[list.size()]; + int idx = 0; + + for(int i : list) answer[idx++] = i; + + return answer; + } + + + // 빛이 사이클을 이루며 이동한 경로 길이를 계산하는 함수 + private int followCycle(int x, int y, int d, boolean[][][] visited, int n, int m, int[] dx, int[] dy, char[][] grids) { + // 빛의 이동수 + int cnt = 0; + + // 현재 좌표와 방향에서 이미 경로를 방문했는지 확인 + while (!visited[x][y][d]) { + visited[x][y][d] = true; + cnt++; + + // 현재 위치의 명령어 + char cmd = grids[x][y]; + if(cmd == 'L') { + d = (d+3) % 4; // 좌회전 + } else if (cmd == 'R') { + d = (d+1) % 4; // 우회전 + } + + // 다음 위치 + x = (x + dx[d] + n) % n; + y = (y + dy[d] + m) % m; + } + + return cnt; + } +} diff --git "a/week9/\354\235\264\354\203\201\354\226\265/progarmmers/N\352\260\234\354\235\230_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" "b/week9/\354\235\264\354\203\201\354\226\265/progarmmers/N\352\260\234\354\235\230_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" new file mode 100644 index 0000000..3692b8b --- /dev/null +++ "b/week9/\354\235\264\354\203\201\354\226\265/progarmmers/N\352\260\234\354\235\230_\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230.java" @@ -0,0 +1,88 @@ +/** + * PackageName : week9.이상억.progarmmers; + * FileName : N개의_최소공배수 + * Author : sangeok + * Date : 2025. 6. 26. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 26. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + public int solution(int[] arr) { + int answer = 0; + + // 각 소수의 최대 지수를 저장할 Map (LCM 계산용) + Map map = new HashMap<>(); + + for (int i : arr) { + // 현재 숫자의 소인수 분해 결과를 담은 Map + Map fymap = fx(i); + for (int fy : fymap.keySet()) { + int exponent = fymap.get(fy); + // 기존에 저장된 지수와 비교하여 더 큰 값으로 갱신 + map.put(fy, Math.max(map.getOrDefault(fy, 0), exponent)); + } + } + + int lcm = 1; + for (Map.Entry entry : map.entrySet()) { + int prime = entry.getKey(); + int exponent = entry.getValue(); + // LCM = 각 소수의 최대 지수만큼 곱한 값 + lcm *= Math.pow(prime, exponent); + } + + answer = lcm; + return answer; + } + + // 소인수 분해 함수: n을 소인수로 분해하고, 소수와 그 지수를 Map으로 반환 + public static Map fx(int n) { + Map fxmap = new HashMap<>(); + + for (int i = 2; i * i <= n; i++) { + while (n % i == 0) { + fxmap.put(i, fxmap.getOrDefault(i, 0) + 1); + n /= i; + } + } + + // n이 1보다 크면 그것도 소수임 (예: n이 소수일 경우) + if (n > 1) { + fxmap.put(n, fxmap.getOrDefault(n, 0) + 1); + } + + return fxmap; + } +} + + +// import java.util.*; +// +//class Solution { +// public int solution(int[] arr) { +// int lcm = arr[0]; +// for (int i = 1; i < arr.length; i++) { +// lcm = lcm(lcm, arr[i]); +// } +// return lcm; +// } +// +// private int lcm(int a, int b) { +// return a * b / gcd(a, b); +// } +// +// private int gcd(int a, int b) { +// while (b != 0) { +// int tmp = a % b; +// a = b; +// b = tmp; +// } +// return a; +// } +//} \ No newline at end of file diff --git "a/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\265\354\233\220_\354\202\260\354\261\205.java" "b/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\265\354\233\220_\354\202\260\354\261\205.java" new file mode 100644 index 0000000..61984ad --- /dev/null +++ "b/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\352\263\265\354\233\220_\354\202\260\354\261\205.java" @@ -0,0 +1,72 @@ +/** + * PackageName : week9.이상억.progarmmers; + * FileName : 공원_산책 + * Author : sangeok + * Date : 2025. 6. 26. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 26. sangeok Initial creation + */ + + +// 회고 : 문제를 잘못 읽었음 장애물이 있으면 이동을 못하고 그 위치에서 다음 명령에 따라 움직이는 줄 알았는데 아니었음 + // x, dx ,nx 이러한 변수가 많다 보니까 헷갈림.. 좀 귀찮아도 그냥 변수명을 좀 길게 하는게 날 거 같기도 함 + +class Solution { + public int[] solution(String[] park, String[] routes) { + int[] answer = new int[2]; + int ph = park.length; // park hegiht + int pw = park[0].length(); // park width; + + int x = 0; + int y = 0; + for(int i = 0; i < ph; i++){ + int k = park[i].indexOf("S"); + if( k != -1) { + x = i; // 높이 + y = k; // 넓이 + break; + } + } // 시작 위치 탐색 + + for(String route : routes){ + String[] parts = route.split(" "); + String dir = parts[0]; + int mv = Integer.parseInt(parts[1]); + + int dx = 0; + int dy = 0; + + switch(dir){ + case "E" : dy = 1; break; + case "W" : dy = -1; break; + case "N" : dx = -1; break; + case "S" : dx = 1; break; + } + + boolean canmove = true; + + for(int i = 1 ; i <= mv; i++){ + int nx = x + dx * i; + int ny = y + dy * i; + + if (nx < 0 || ny < 0 || nx >= ph || ny >= pw || park[nx].charAt(ny) == 'X'){ + canmove = false; + break; + } + } + if(canmove){ + x += dx * mv; + y += dy * mv; + } + } + + answer[0] = x; + answer[1] = y; + + + return answer; + } +} \ No newline at end of file diff --git "a/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" "b/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" new file mode 100644 index 0000000..3d6db88 --- /dev/null +++ "b/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\353\202\230\353\210\204\354\226\264_\353\226\250\354\226\264\354\247\200\353\212\224_\354\210\253\354\236\220_\353\260\260\354\227\264.java" @@ -0,0 +1,36 @@ +/** + * PackageName : week9.이상억.progarmmers; + * FileName : 나누어_떨어지는_숫자_배열 + * Author : sangeok + * Date : 2025. 6. 23. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 23. sangeok Initial creation + */ + + + +import java.util.*; + +class Solution { + public int[] solution(int[] arr, int divisor) { + + List list = new ArrayList<>(); + + for(int i : arr) { + if( i % divisor == 0) list.add(i); + } + + int[] answer = new int[list.size()]; + + for(int i = 0; i < list.size(); i++){ + answer[i] = list.get(i); + } + + if(list.isEmpty()) return new int[]{-1}; + Arrays.sort(answer); + return answer; + } +} \ No newline at end of file diff --git "a/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\353\215\247\354\271\240\355\225\230\352\270\260.java" "b/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\353\215\247\354\271\240\355\225\230\352\270\260.java" new file mode 100644 index 0000000..df4263f --- /dev/null +++ "b/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\353\215\247\354\271\240\355\225\230\352\270\260.java" @@ -0,0 +1,32 @@ +/** + * PackageName : week9.이상억.progarmmers; + * FileName : 덧칠하기 + * Author : sangeok + * Date : 2025. 6. 25. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 25. sangeok Initial creation + */ + +// 문제 풀 때 중간에 덧칠되는 부분을 고려 안하고 차례대로 하는 방향으로 했어서 실패했다. 그 후 칠해진 부분은 스킵하는 방식으로 문제를 해결 + // 문제 설명을 보다가 너무 길어서 입출력 예제를 보고 이해해서 풀었다. 그림을 보는게 훨씬 이해가 잘간다. + + +class Solution { + public int solution(int n, int m, int[] section) { + int answer = 0; + int len = section.length; + int i = 0; + + while( i < len){ + int start = section[i]; + int end = start + m - 1; + answer ++; + + while( i < section.length && section[i] <= end) i++; // 이미 색칠된 부분 + } + return answer; + } +} \ No newline at end of file diff --git "a/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\353\271\233\354\235\230_\352\262\275\353\241\234_\354\202\254\354\235\264\355\201\264.java" "b/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\353\271\233\354\235\230_\352\262\275\353\241\234_\354\202\254\354\235\264\355\201\264.java" new file mode 100644 index 0000000..747bdd1 --- /dev/null +++ "b/week9/\354\235\264\354\203\201\354\226\265/progarmmers/\353\271\233\354\235\230_\352\262\275\353\241\234_\354\202\254\354\235\264\355\201\264.java" @@ -0,0 +1,72 @@ +/** + * PackageName : week9.이상억.progarmmers; + * FileName : 빛의_경로_사이클 + * Author : sangeok + * Date : 2025. 6. 26. + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 6. 26. sangeok Initial creation + */ + +import java.util.*; + +class Solution { + // 방향: 상(0), 우(1), 하(2), 좌(3) + static int[] dy = {-1, 0, 1, 0}; + static int[] dx = {0, 1, 0, -1}; + + public int[] solution(String[] grid) { + int h = grid.length; + int w = grid[0].length(); + boolean[][][] visited = new boolean[h][w][4]; + List result = new ArrayList<>(); + + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++) { + for (int d = 0; d < 4; d++) { + if (!visited[y][x][d]) { + int cycleLen = tracecycle(grid, y, x, d, visited); + result.add(cycleLen); + } + } + } + } + + Collections.sort(result); + return result.stream().mapToInt(i -> i).toArray(); + } + + private int tracecycle(String[] grid, int sy, int sx, int sd, boolean[][][] visited) { + int h = grid.length; + int w = grid[0].length(); + int y = sy, x = sx, d = sd; + int count = 0; + + while (true) { + if (visited[y][x][d]) break; + + visited[y][x][d] = true; + count++; + + // 이동 + int ny = (y + dy[d] + h) % h; + int nx = (x + dx[d] + w) % w; + + // 방향 변경 + char cmd = grid[ny].charAt(nx); + if (cmd == 'L') { + d = (d + 3) % 4; // 좌회전 + } else if (cmd == 'R') { + d = (d + 1) % 4; // 우회전 + } + // 'S'는 그대로 + + y = ny; + x = nx; + } + + return count; + } +}