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" index f0dc62d..19a37e9 100644 --- "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" @@ -1,5 +1,8 @@ package week13.김누리.programmers; +import java.util.HashMap; +import java.util.Map; + /** * PackageName : week13.김누리.programmers * FileName : 키패드_누르기 @@ -82,4 +85,61 @@ */ 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_a/\352\271\200\353\210\204\353\246\254/progarmmers/\354\230\271\354\225\214\354\235\264_2.java" "b/week13_a/\352\271\200\353\210\204\353\246\254/progarmmers/\354\230\271\354\225\214\354\235\264_2.java" new file mode 100644 index 0000000..1ef3198 --- /dev/null +++ "b/week13_a/\352\271\200\353\210\204\353\246\254/progarmmers/\354\230\271\354\225\214\354\235\264_2.java" @@ -0,0 +1,44 @@ +package week13_a.김누리.progarmmers; + +/** + * PackageName : week13_a.김누리.progarmmers + * FileName : 옹알이_2 + * Author : 김누리(NRKim) + * Date : 2025-08-01 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 01. 김누리(NRKim) Initial creation + */ + +public class 옹알이_2 { + public int solution(String[] babbling) { + int answer = 0; + String[] babb = {"aya", "ye", "woo", "ma"}; + + for(int i = 0; i < babbling.length; i++) { + String target = babbling[i]; + + // 연속 발음 있는지 체크용 bool + boolean invalid = false; + + for(String b : babb) { + if(target.contains(b+b)) { + invalid = true; + break; + } + } + + // 연속 발음 있으면 다음 타겟으로 + if(invalid) continue; + + for(String b : babb) target = target.replaceAll(b," "); + + // 공백 제거 후 문자열이 비어있으면 answer++; + if(target.trim().isEmpty()) answer++; + } + + return answer; + } +} diff --git "a/week13_a/\352\271\200\353\210\204\353\246\254/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/\352\271\200\353\210\204\353\246\254/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..8198b28 --- /dev/null +++ "b/week13_a/\352\271\200\353\210\204\353\246\254/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,30 @@ +package week13_a.김누리.progarmmers; + +import java.util.Stack; + +/** + * PackageName : week13_a.김누리.progarmmers + * FileName : 짝지어_제거하기 + * Author : 김누리(NRKim) + * Date : 2025-08-01 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 01. 김누리(NRKim) Initial creation + */ + +public class 짝지어_제거하기 { + public int solution(String s) { + int answer = -1; + String[] tmp = s.split(""); + Stack 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/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_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\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\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\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\271\200\353\202\230\354\235\200/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\202\230\354\235\200/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..bae0656 --- /dev/null +++ "b/week17/\352\271\200\353\202\230\354\235\200/programmers/\354\230\201\354\226\264_\353\201\235\353\247\220\354\236\207\352\270\260.java" @@ -0,0 +1,50 @@ +package week17.김나은.programmers; + +import java.util.HashSet; +import java.util.Set; + +public class 영어_끝말잇기 { + + class Solution { + + public int[] solution(int n, String[] words) { + // 이전에 나온 단어를 저장할 HashSet + Set 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\271\200\353\210\204\353\246\254/baekjoon/\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\271\200\353\210\204\353\246\254/baekjoon/\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..3d9ac69 --- /dev/null +++ "b/week17_a/\352\271\200\353\210\204\353\246\254/baekjoon/\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,110 @@ +package week17_a.김누리.baekjoon; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.StringTokenizer; + +/** + * PackageName : week17_a.김누리.baekjoon + * FileName : 스위치_켜고_끄기 + * Author : 김누리(NRKim) + * Date : 2025-08-22 + * Description : + * ===================================================================================================================== + * DATE AUTHOR NOTE + * --------------------------------------------------------------------------------------------------------------------- + * 2025. 08. 22. 김누리(NRKim) Initial creation + */ + +/* +* +* 입력 값 +* 1번째 줄 : 스위치 갯수 +* 2번째 줄 : 스위치 상태 +* 3번째 줄 : 학생 수 +* 4번째 ~ N번째 줄 : 학생 성별_받은 수 +* 예 ) 1_3 : 남학생_3번 스위치 갯수 +* +* 출력 : 1번 ~ N번 까지 스위치 상태 출력 +* +* case 1 : +* +* 8 +* 0 1 0 1 0 0 0 1 +* 2 +* 1 3 >> 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\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\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\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/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\271\200\353\202\230\354\235\200/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\271\200\353\202\230\354\235\200/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..1bad2a6 --- /dev/null +++ "b/week21/\352\271\200\353\202\230\354\235\200/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,53 @@ +package week21.김나은.programmers; + +public class 로또의_최고_순위와_최저_순위 { + + class Solution { + + public int[] solution(int[] lottos, int[] win_nums) { + int[] answer = new int[2]; + + // lottos에 win_nums와 일치하는 번호 개수 + int count = 0; + // lottos 0의 개수 + int zero = 0; + + // lottos 배열의 각 번호를 확인 + for (int i = 0; i < lottos.length; i++) { + if (lottos[i] == 0) { + zero++; + continue; // 다음 번호 확인 + } + // 번호가 0이 아닌 경우, 당첨 번호(win_nums)와 비교 + for (int j = 0; j < win_nums.length; j++) { + if (win_nums[j] == lottos[i]) { + count++; + continue; + } + } + } + + answer[0] = rank(count + zero); + answer[1] = rank(count); + + return answer; + } + + // 맞춘 번호 개수에 따라 순위를 반환하는 메서드 + private static int rank(int num) { + if (num == 6) { + return 1; // 6개 맞추면 1등 + } else if (num == 5) { + return 2; // 5개 맞추면 2등 + } else if (num == 4) { + return 3; + } else if (num == 3) { + return 4; + } else if (num == 2) { + return 5; + } else { + return 6; + } + } + } +} \ No newline at end of file diff --git "a/week21/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220_\354\247\235\352\277\215.java" "b/week21/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220_\354\247\235\352\277\215.java" new file mode 100644 index 0000000..6b5d799 --- /dev/null +++ "b/week21/\352\271\200\353\202\230\354\235\200/programmers/\354\210\253\354\236\220_\354\247\235\352\277\215.java" @@ -0,0 +1,51 @@ +package week21.김나은.programmers; + +public class 숫자_짝꿍 { + + class Solution { + + public String solution(String X, String Y) { + + // 0~9까지 각 숫자의 등장 횟수를 저장할 배열 + int[] cntX = new int[10]; + int[] cntY = new int[10]; + + // 문자열 X와 Y에 등장하는 숫자를 카운트해서 배열에 저장 + countNumInArr(X, cntX); + countNumInArr(Y, cntY); + + // 결과 길이의 상한은 두 문자열 길이의 최솟값 + StringBuilder sb = new StringBuilder(Math.min(X.length(), Y.length())); + + // 큰 수를 만들어야 하므로 9부터 0까지 역순으로 확인 + for (int d = 9; d >= 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\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\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\271\200\353\202\230\354\235\200/baekjoon/\354\212\244\355\203\235.java" "b/week24/\352\271\200\353\202\230\354\235\200/baekjoon/\354\212\244\355\203\235.java" new file mode 100644 index 0000000..8484d8c --- /dev/null +++ "b/week24/\352\271\200\353\202\230\354\235\200/baekjoon/\354\212\244\355\203\235.java" @@ -0,0 +1,58 @@ +package week24.김나은.baekjoon; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayDeque; +import java.util.Deque; +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 st; + int capacity = Integer.parseInt(br.readLine()); + + // 스택 구현 + Deque 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/\354\235\264\354\203\201\354\226\265/backjoon/\353\202\230\353\254\264_\355\203\210\354\266\234.java" "b/week25/\354\235\264\354\203\201\354\226\265/backjoon/\353\202\230\353\254\264_\355\203\210\354\266\234.java" new file mode 100644 index 0000000..68b7726 --- /dev/null +++ "b/week25/\354\235\264\354\203\201\354\226\265/backjoon/\353\202\230\353\254\264_\355\203\210\354\266\234.java" @@ -0,0 +1,50 @@ +import java.util.*; +import java.io.*; + +public class Main { + + static ArrayList[] 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/\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/\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/\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/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\230_\353\254\266\352\270\260.java" "b/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\230_\353\254\266\352\270\260.java" new file mode 100644 index 0000000..b2ed352 --- /dev/null +++ "b/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\210\230_\353\254\266\352\270\260.java" @@ -0,0 +1,64 @@ +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws Exception { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + + List plus_numbers = new ArrayList<>(); + List minus_numbers = new ArrayList<>(); + + int ones = 0; + int zeros = 0; + + for (int i = 0; i < N; i++) { + int num = Integer.parseInt(br.readLine()); + + if (num > 1) plus_numbers.add(num); + else if (num == 1) ones++; + else if (num == 0) zeros++; + else minus_numbers.add(num); + } + + Collections.sort(plus_numbers, Collections.reverseOrder()); + Collections.sort(minus_numbers); + + long result = 0; + + for (int i = 0; i < plus_numbers.size(); ) { + if (i + 1 < plus_numbers.size()) { + int a = plus_numbers.get(i); + int b = plus_numbers.get(i + 1); + result += a * b; + i += 2; + } else { + result += plus_numbers.get(i); + i += 1; + } + } + + result += ones; + + for (int i = 0; i < minus_numbers.size(); ) { + if (i + 1 < minus_numbers.size()) { + int a = minus_numbers.get(i); + int b = minus_numbers.get(i + 1); + result += a * b; + i += 2; + } else { + if (zeros > 0) { + zeros--; + i += 1; + } else { + result += minus_numbers.get(i); + i += 1; + } + } + } + + System.out.println(result); + } +} diff --git "a/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\260.java" "b/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\260.java" new file mode 100644 index 0000000..ed98e3c --- /dev/null +++ "b/week29/\354\235\264\354\203\201\354\226\265/backjoon/\354\265\234\354\206\214\353\271\204\354\232\251_\352\265\254\355\225\230\352\270\260.java" @@ -0,0 +1,73 @@ +import java.io.*; +import java.util.*; + +public class Main{ + + static class Node { + int v, cost; + Node(int v, int cost){ + this.v = v; + this.cost = cost; + } + } + + static List> graph; + static int[] dist; + static boolean[] visit; + static int N, M; + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); // 도시 수 + M = Integer.parseInt(br.readLine()); // 버스 수 + + graph = new ArrayList<>(); + for(int i = 0; i <= N; i++){ + graph.add(new ArrayList<>()); + } + + for(int i = 0; i < M; i++){ + StringTokenizer st = new StringTokenizer(br.readLine()); + int from = Integer.parseInt(st.nextToken()); + int to = Integer.parseInt(st.nextToken()); + int cost = Integer.parseInt(st.nextToken()); + + graph.get(from).add(new Node(to, cost)); + } + + StringTokenizer st = new StringTokenizer(br.readLine()); + int start = Integer.parseInt(st.nextToken()); + int end = Integer.parseInt(st.nextToken()); + + dist = new int[N+1]; + visit = new boolean[N+1]; + + Arrays.fill(dist, Integer.MAX_VALUE); + + dijkstra(start); + + System.out.println(dist[end]); + } + + static void dijkstra(int start){ + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1.cost - o2.cost); + pq.add(new Node(start, 0)); + dist[start] = 0; + + while(!pq.isEmpty()){ + Node now = pq.poll(); + + if(visit[now.v]) continue; + visit[now.v] = true; + + for(Node next : graph.get(now.v)){ + if(!visit[next.v] && dist[next.v] > dist[now.v] + next.cost){ + dist[next.v] = dist[now.v] + next.cost; + pq.add(new Node(next.v, dist[next.v])); + } + } + } + } +} diff --git "a/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224.java" "b/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224.java" new file mode 100644 index 0000000..ee8f95b --- /dev/null +++ "b/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224.java" @@ -0,0 +1,51 @@ +import java.util.*; + +class Solution { + public int[] solution(String[] genres, int[] plays) { + + Map genreSum = new HashMap<>(); + Map> genreMap = new HashMap<>(); + + for (int i = 0; i < genres.length; i++) { + String g = genres[i]; + int p = plays[i]; + + // 총 재생수 누적 + genreSum.put(g, genreSum.getOrDefault(g, 0) + p); + + if (!genreMap.containsKey(g)) { + genreMap.put(g, new ArrayList<>()); + } + + // 재생수, 고유번호 + genreMap.get(g).add(new int[]{p, i}); + } + + List genreList = new ArrayList<>(genreSum.keySet()); + genreList.sort((a, b) -> genreSum.get(b) - genreSum.get(a)); + + List result = new ArrayList<>(); + + for (String g : genreList) { + List list = genreMap.get(g); + + list.sort((a, b) -> { + if (b[0] != a[0]) return b[0] - a[0]; + return a[1] - b[1]; + }); + + // 2개까지 + result.add(list.get(0)[1]); + if (list.size() > 1) { + result.add(list.get(1)[1]); + } + } + + int[] answer = new int[result.size()]; + for (int i = 0; i < result.size(); i++) { + answer[i] = result.get(i); + } + + return answer; + } +} diff --git "a/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\352\263\240\354\235\230_\354\247\221\355\225\251.java" "b/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\352\263\240\354\235\230_\354\247\221\355\225\251.java" new file mode 100644 index 0000000..a8f6541 --- /dev/null +++ "b/week29/\354\235\264\354\203\201\354\226\265/progarmmers/\354\265\234\352\263\240\354\235\230_\354\247\221\355\225\251.java" @@ -0,0 +1,22 @@ +import java.util.*; + +class Solution { + public int[] solution(int n, int s) { + if (s < n) { + return new int[]{-1}; + } + + int[] answer = new int[n]; + + int m = s / n; + int r = s % n; + + Arrays.fill(answer, m); + + for (int i = n - r; i < n; i++) { + answer[i]++; + } + + return answer; + } +} diff --git "a/week3/\352\271\200\353\202\230\354\235\200/programmers/K\353\262\210\354\247\270\354\210\230.java" "b/week3/\352\271\200\353\202\230\354\235\200/programmers/K\353\262\210\354\247\270\354\210\230.java" new file mode 100644 index 0000000..a3cdf8a --- /dev/null +++ "b/week3/\352\271\200\353\202\230\354\235\200/programmers/K\353\262\210\354\247\270\354\210\230.java" @@ -0,0 +1,27 @@ +package week3.김나은.programmers; + +import java.util.Arrays; + +class K번째수 { + + class Solution { + + public int[] solution(int[] array, int[][] commands) { + + int[] answer = new int[commands.length]; + + // i, j, k를 담은 배열 순회 + for (int i = 0; i < commands.length; i++) { + // i - 1번째 수부터 j직전까지 배열 추출 + int[] temp = Arrays.copyOfRange(array, commands[i][0] - 1, commands[i][1]); + + // 추출한 배열 오름차순 정렬 + Arrays.sort(temp); + + // K번째 수 answer 배열에 담기 + answer[i] = temp[commands[i][2] - 1]; + } + return answer; + } + } +} diff --git "a/week30/\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/\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/\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/\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/\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/\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/\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/\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/\354\235\264\354\203\201\354\226\265/backjoon/\355\203\200\354\236\204\353\250\270\354\213\240.java" "b/week38/\354\235\264\354\203\201\354\226\265/backjoon/\355\203\200\354\236\204\353\250\270\354\213\240.java" new file mode 100644 index 0000000..8cb3c95 --- /dev/null +++ "b/week38/\354\235\264\354\203\201\354\226\265/backjoon/\355\203\200\354\236\204\353\250\270\354\213\240.java" @@ -0,0 +1,83 @@ +import java.util.*; +import java.io.*; + +public class Main{ + + static class Edge{ + int v; // 나가는 정점 + int w; // 들어오는 정점 + int cost; + + public Edge(int v, int w, int cost){ + this.v = v; + this.w = w; + this.cost = cost; + } + } + + 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<>(); + + 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/\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/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; + } + } +}