diff --git "a/janghw0126/\353\270\214\353\243\250\355\212\270 \355\217\254\354\212\244/\355\207\264\354\202\254.py" "b/janghw0126/\353\270\214\353\243\250\355\212\270 \355\217\254\354\212\244/\355\207\264\354\202\254.py" deleted file mode 100644 index c32c4054..00000000 --- "a/janghw0126/\353\270\214\353\243\250\355\212\270 \355\217\254\354\212\244/\355\207\264\354\202\254.py" +++ /dev/null @@ -1,36 +0,0 @@ -# 전체 상담 가능한 날짜 수를 입력받는다. -n = int(input()) -# 각 상담을 완료하는데 걸리는 기간을 초기화한다. -t = [] -# 각 상담을 했을 때 받을 수 있는 금액을 초기화한다. -p = [] -for i in range(n) : - # 상담 기간과 금액을 입력받는다. - arr = list(map(int, input().split())) - # 상담 기간을 저장한다. - t.append(arr[0]) - # 상담 금액을 저장한다. - p.append(arr[1]) -# 최대 이익 저장 변수를 선언한다. -ans = 0 - -# 재귀 함수를 정의한다. -def go(day, sum) : - # 전역 변수로 ans를 사용한다. - global ans - # 모든 날짜를 확인했을 때 현재까지의 이익과 최대 이익을 비교하여 갱신한다. - if day == n : - ans = max(ans,sum) - return - # 상담 기간이 남은 기간을 초과할 경우, 더 이상 진행 불가하므로 함수를 종료한다. - if day > n : - return - # 해당 날짜의 상담을 진행하는 경우 - go(day+t[day], sum+p[day]) - # 해당 날짜의 상담을 진행하지 않는 경우 - go(day+1, sum) - -# 재귀 함수를 호출한다. -go(0,0) -# 최대 이익을 출력한다. -print(ans) \ No newline at end of file diff --git a/jung0115/.gitignore b/jung0115/.gitignore index 01345c6f..64223e8b 100644 --- a/jung0115/.gitignore +++ b/jung0115/.gitignore @@ -1,2 +1,3 @@ *.jars -*.jar \ No newline at end of file +*.jar +*.class \ No newline at end of file diff --git a/jung0115/README.md b/jung0115/README.md index ce0a5cb4..d434c325 100644 --- a/jung0115/README.md +++ b/jung0115/README.md @@ -6,4 +6,13 @@ | 2차시 | 2024.07.20.토 | 백트래킹 | [우주 탐사선(17182)](https://www.acmicpc.net/problem/17182) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/125 | | 3차시 | 2024.07.24.수 | 이분 탐색 | [휴게소 세우기(1477)](https://www.acmicpc.net/problem/1477) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/129 | | 4차시 | 2024.07.27.토 | 트리 / 트라이 | [개미굴(14725)](https://www.acmicpc.net/problem/14725) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/134 | -| 5차시 | 2024.07.31.수 | 트리 / MST | [1251. [S/W 문제해결 응용] 4일차 - 하나로](https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15StKqAQkCFAYD) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/137 | \ No newline at end of file +| 5차시 | 2024.07.31.수 | 트리 / MST | [1251. [S/W 문제해결 응용] 4일차 - 하나로](https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15StKqAQkCFAYD) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/137 | +| 6차시 | 2024.08.03.토 | 트리 / 트라이 | [디스크 트리(7432)](https://www.acmicpc.net/problem/7432) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/142 | +| 7차시 | 2024.08.07.수 | 다익스트라 | [지형 이동(Lv.4)](https://school.programmers.co.kr/learn/courses/30/lessons/62050) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/144 | +| 8차시 | 2024.08.19.월 | 이분 탐색 | [입국심사(Lv.3)](https://school.programmers.co.kr/learn/courses/30/lessons/43238) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/148 | +| 9차시 | 2024.08.27.화 | 수학 | [음식 평론가(1188)](https://www.acmicpc.net/problem/1188) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/150 | +| 10차시 | 2024.08.28.수 | 브루트포스 | [램프(1034)](https://www.acmicpc.net/problem/1034) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/151 | +| 11차시 | 2024.09.04.수 | 수학 | [축구(1344)](https://www.acmicpc.net/problem/1344) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/153 | +| 12차시 | 2024.09.07.토 | 다이나믹 프로그래밍 | [개근상(1563)](https://www.acmicpc.net/problem/1563) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/157 | +| 13차시 | 2024.09.23.월 | 다이나믹 프로그래밍 | [사전(1256)](https://www.acmicpc.net/problem/1256) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/162 | +| 14차시 | 2024.09.25.수 | 그리디 알고리즘 | [컵라면(1781)](https://www.acmicpc.net/problem/1781) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/165 | \ No newline at end of file diff --git "a/jung0115/\352\267\270\353\246\254\353\224\224\354\225\214\352\263\240\353\246\254\354\246\230/Baekjoon_1781.java" "b/jung0115/\352\267\270\353\246\254\353\224\224\354\225\214\352\263\240\353\246\254\354\246\230/Baekjoon_1781.java" new file mode 100644 index 00000000..9444d359 --- /dev/null +++ "b/jung0115/\352\267\270\353\246\254\353\224\224\354\225\214\352\263\240\353\246\254\354\246\230/Baekjoon_1781.java" @@ -0,0 +1,66 @@ +// 14차시 2024.09.25.수 : 백준 - 컵라면(1781) +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; +import java.util.Arrays; +import java.util.PriorityQueue; + +public class Baekjoon_1781 { + static class CupNoodle implements Comparable { + int deadLine; + int count; + + public CupNoodle(int deadLine, int count) { + this.deadLine = deadLine; + this.count = count; + } + + @Override + public int compareTo(CupNoodle o) { + // 데드라인을 기준으로 오름차순 정렬 + return this.deadLine - o.deadLine; + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + + CupNoodle[] cupNoodles = new CupNoodle[N]; + + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + + int deadLine = Integer.parseInt(st.nextToken()); // 데드라인 + int count = Integer.parseInt(st.nextToken()); // 맞힐 때 받는 컵라면 수 + + cupNoodles[i] = new CupNoodle(deadLine, count); + } + + // 데드라인을 기준으로 정렬 (오름차순) + Arrays.sort(cupNoodles); + + PriorityQueue pq = new PriorityQueue<>(); + + for (CupNoodle cn : cupNoodles) { + // 만약 현재 데드라인 내에 풀 수 있는 문제라면 큐에 추가 + pq.offer(cn.count); + + // 큐의 크기가 데드라인을 초과하면 가장 적은 컵라면 수를 제거 + if (pq.size() > cn.deadLine) { + pq.poll(); + } + } + + int answer = 0; + + // 큐에 남아 있는 컵라면의 총합을 구함 + while (!pq.isEmpty()) { + answer += pq.poll(); + } + + System.out.println(answer); + } +} diff --git "a/jung0115/\352\267\270\353\246\254\353\224\224\354\225\214\352\263\240\353\246\254\354\246\230/Baekjoon_1781_fail.java" "b/jung0115/\352\267\270\353\246\254\353\224\224\354\225\214\352\263\240\353\246\254\354\246\230/Baekjoon_1781_fail.java" new file mode 100644 index 00000000..95a52258 --- /dev/null +++ "b/jung0115/\352\267\270\353\246\254\353\224\224\354\225\214\352\263\240\353\246\254\354\246\230/Baekjoon_1781_fail.java" @@ -0,0 +1,37 @@ +// 14차시 2024.09.25.수 : 백준 - 컵라면(1781) +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; +import java.util.HashMap; +import java.util.Iterator; + +public class Baekjoon_1781_fail { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + + HashMap cupNoodles = new HashMap(); + + for(int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + + int deadLine = Integer.parseInt(st.nextToken()); // 데드라인 + int count = Integer.parseInt(st.nextToken()); // 맞힐 때 받는 컵라면 수 + + int current = cupNoodles.getOrDefault(deadLine, 0); + if(current < count) cupNoodles.put(deadLine, count); + } + + int answer = 0; + + Iterator keys = cupNoodles.keySet().iterator(); + while(keys.hasNext()){ + int key = keys.next(); + answer += cupNoodles.get(key); + } + + System.out.print(answer); + } +} diff --git "a/jung0115/\353\213\244\354\235\264\353\202\230\353\257\271\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/Baekjoon_1256.java" "b/jung0115/\353\213\244\354\235\264\353\202\230\353\257\271\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/Baekjoon_1256.java" new file mode 100644 index 00000000..c091d097 --- /dev/null +++ "b/jung0115/\353\213\244\354\235\264\353\202\230\353\257\271\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/Baekjoon_1256.java" @@ -0,0 +1,55 @@ +package jung0115.다이나믹프로그래밍; +// 13차시 2024.09.23.월 : 백준 - 사전(1256) + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Baekjoon_1256 { + public static void main(String[] args) throws IOException { + BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(bf.readLine()); + + int N = Integer.parseInt(st.nextToken()); // a의 개수 + int M = Integer.parseInt(st.nextToken()); // z의 개수 + int K = Integer.parseInt(st.nextToken()); // 몇 번째 문자열을 찾아야 하는지 + + StringBuilder answer = new StringBuilder(); + + long[][] dp = new long[ N + M + 1 ][ N + M + 1 ]; + dp[0][0] = 1; + + for(int i = 1;i <= N + M; i++){ + dp[i][0] = 1; + dp[i][i] = 1; + for(int j = 1; j < i; j++){ + dp[i][j] = dp[i-1][j-1] + dp[i-1][j]; + + if(dp[i][j] > 1000000000) + dp[i][j] = 1000000001; + } + } + + // 사전에 수록되어 있는 문자열의 개수가 K보다 작을 경우 + if(dp[N + M][M] < K) { + answer.append("-1"); + } + else { + while (N != 0 || M != 0) { + if(dp[N + M - 1][M] >= K) { + answer.append("a"); + N--; + } + else { + answer.append("z"); + K -= dp[N + M - 1][M]; + M--; + } + } + } + + System.out.print(answer); + + } +} diff --git "a/jung0115/\353\213\244\354\235\264\353\202\230\353\257\271\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/Baekjoon_1563.kt" "b/jung0115/\353\213\244\354\235\264\353\202\230\353\257\271\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/Baekjoon_1563.kt" new file mode 100644 index 00000000..e881ba8c --- /dev/null +++ "b/jung0115/\353\213\244\354\235\264\353\202\230\353\257\271\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/Baekjoon_1563.kt" @@ -0,0 +1,37 @@ +// 12차시 2024.09.07.토 : 백준 - 개근상(1563) +import java.io.BufferedReader +import java.io.InputStreamReader + + +fun main() { + // ✅ Input + val br = BufferedReader(InputStreamReader(System.`in`)) + + val N = br.readLine().toInt() + + // ✅ Solve + // 출석 일수, 지각 일수, 연속 결석 일수 + val dp = Array(N + 1, {Array(2, {Array(3, {0})})}) + + dp[1][0][0] = 1 + dp[1][1][0] = 1 + dp[1][0][1] = 1 + + for(i: Int in 2..N) { + dp[i][0][0] = (dp[i-1][0][0] + dp[i-1][0][1] + dp[i-1][0][2]) % 1000000; + dp[i][0][1] = dp[i-1][0][0] % 1000000; + dp[i][0][2] = dp[i-1][0][1] % 1000000; + dp[i][1][0] = (dp[i][0][0] + dp[i-1][1][0] + dp[i-1][1][1] + dp[i-1][1][2]) % 1000000; + dp[i][1][1] = dp[i-1][1][0] % 1000000; + dp[i][1][2] = dp[i-1][1][1] % 1000000; + } + + var answer = 0 + for(i: Int in 0..1) { + for(j: Int in 0..2) { + answer += dp[N][i][j] + } + } + + print(answer % 1000000) +} \ No newline at end of file diff --git "a/jung0115/\353\213\244\354\235\264\353\202\230\353\257\271 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/Baekjoon_2624.kt" "b/jung0115/\353\213\244\354\235\264\353\202\230\353\257\271\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/Baekjoon_2624.kt" similarity index 100% rename from "jung0115/\353\213\244\354\235\264\353\202\230\353\257\271 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/Baekjoon_2624.kt" rename to "jung0115/\353\213\244\354\235\264\353\202\230\353\257\271\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/Baekjoon_2624.kt" diff --git "a/jung0115/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274/Programmers_62050.java" "b/jung0115/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274/Programmers_62050.java" new file mode 100644 index 00000000..85e901d5 --- /dev/null +++ "b/jung0115/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274/Programmers_62050.java" @@ -0,0 +1,72 @@ +// 7차시 2024.08.07.수 : 프로그래머스 - 지형 이동(Lv.4) +import java.util.PriorityQueue; +import java.util.Queue; + +class Solution { + public int solution(int[][] land, int height) { + int answer = 0; + int N = land.length; + + int[] dx = {1, 0, -1, 0}; + int[] dy = {0, 1, 0, -1}; + + boolean[][] visited = new boolean[N][N]; + + // 우선순위 큐 + Queue queue = new PriorityQueue<>(); + queue.add(new Point(0, 0, 0)); + + while (!queue.isEmpty()) { + Point current = queue.poll(); + + // 이미 방문한 곳 + if (visited[current.x][current.y]) continue; + + // 방문 표시, 비용 추가 + visited[current.x][current.y] = true; + answer += current.cost; + + // 상하좌우 이동 + for (int i = 0; i < 4; i++) { + int moveX = current.x + dx[i]; + int moveY = current.y + dy[i]; + + // 범위를 벗어나는 경우 + if (moveX < 0 || moveY < 0 || moveX >= N || moveY >= N) continue; + + // 높이 차이 + int cost = Math.abs(land[current.x][current.y] - land[moveX][moveY]); + + // 사다리가 필요한 경우 + if (cost > height) { + queue.add(new Point(moveX, moveY, cost)); + continue; + } + + // 사다리가 필요없는 경우 + queue.add(new Point(moveX, moveY, 0)); + } + } + + + return answer; + } + + class Point implements Comparable { + int x; + int y; + int cost; + + public Point(int x, int y, int cost) { + this.x = x; + this.y = y; + this.cost = cost; + } + + // 우선순위: 비용이 작은 순 + @Override + public int compareTo(Point o) { + return this.cost - o.cost; + } + } +} \ No newline at end of file diff --git "a/jung0115/\353\270\214\353\243\250\355\212\270\355\217\254\354\212\244/Baekjoon_1034.kt" "b/jung0115/\353\270\214\353\243\250\355\212\270\355\217\254\354\212\244/Baekjoon_1034.kt" new file mode 100644 index 00000000..9a0d9f8a --- /dev/null +++ "b/jung0115/\353\270\214\353\243\250\355\212\270\355\217\254\354\212\244/Baekjoon_1034.kt" @@ -0,0 +1,49 @@ +// 10차시 2024.08.28.수 : 백준 - 램프(1034) +import java.io.BufferedReader +import java.io.InputStreamReader +import java.util.StringTokenizer +import kotlin.math.max + +fun main() { + // ✅ Input + val br = BufferedReader(InputStreamReader(System.`in`)) + var st = StringTokenizer(br.readLine()) + + val N = st.nextToken().toInt() + val M = st.nextToken().toInt() + + val lamp = mutableListOf() + for(i: Int in 1..N) { + lamp.add(br.readLine()) + } + + val K = br.readLine().toInt() + + var answer = 0 + for(i: Int in 0..N-1) { + // 꺼져있는 램프 수 + var zeroCount = 0 + for(j: Int in 0..M-1) { + if(lamp[i][j] == '0') zeroCount++ + } + + // 불이 다 켜진 행의 수 + var rowCount = 0 + if(zeroCount <= K && zeroCount % 2 == K % 2) { + for(j: Int in 0..N-1) { + var isEqual = true + for(k: Int in 0..M-1) { + if(lamp[i][k] != lamp[j][k]) { + isEqual = false + break + } + } + if(isEqual) rowCount++ + } + + answer = max(answer, rowCount) + } + } + + print(answer) +} \ No newline at end of file diff --git "a/jung0115/\354\210\230\355\225\231/Baekjoon_1188.java" "b/jung0115/\354\210\230\355\225\231/Baekjoon_1188.java" new file mode 100644 index 00000000..2ec75041 --- /dev/null +++ "b/jung0115/\354\210\230\355\225\231/Baekjoon_1188.java" @@ -0,0 +1,23 @@ +// 9차시 2024.08.27.화 : 백준 - 음식 평론가(1188) +import java.io.InputStreamReader; +import java.io.BufferedReader; +import java.io.IOException; +import java.util.StringTokenizer; + +public class Baekjoon_1188 { + public static void main(String[] args) throws IOException { + BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(bf.readLine()); + int N = Integer.parseInt(st.nextToken()); // 소시지의 수 + int M = Integer.parseInt(st.nextToken()); // 평론가의 수 + + int answer = M - gcd(N, M); + System.out.println(answer); + } + + // 최대 공약수 - 유클리드 호제법 + static int gcd(int num1, int num2) { + if(num1 % num2 == 0) return num2; + return gcd(num2, num1 % num2); + } +} \ No newline at end of file diff --git "a/jung0115/\354\210\230\355\225\231/Baekjoon_1344.kt" "b/jung0115/\354\210\230\355\225\231/Baekjoon_1344.kt" new file mode 100644 index 00000000..0f99fca7 --- /dev/null +++ "b/jung0115/\354\210\230\355\225\231/Baekjoon_1344.kt" @@ -0,0 +1,37 @@ +// 11차시 2024.09.04.수 : 백준 - 축구(1344) +import java.io.BufferedReader +import java.io.InputStreamReader +import kotlin.math.pow + +fun combination(n: Int, r: Int): Double { + var result = 1.0 + for (i in 0 until r) { + result *= (n - i).toDouble() + result /= (i + 1).toDouble() + } + return result +} + +fun probability(p: Double, k: Int): Double { + return combination(18, k) * p.pow(k) * (1 - p).pow(18 - k) +} + +fun main() { + // ✅ Input + val br = BufferedReader(InputStreamReader(System.`in`)) + + var A: Double = br.readLine().toDouble() / 100.0 + var B: Double = br.readLine().toDouble() / 100.0 + + val primeNumbers = setOf(2, 3, 5, 7, 11, 13, 17) + var nonPrimeA = 0.0 + var nonPrimeB = 0.0 + for (i in 0..18) { + if (i !in primeNumbers) { + nonPrimeA += probability(A, i) + nonPrimeB += probability(B, i) + } + } + + print(1 - (nonPrimeA * nonPrimeB)) +} \ No newline at end of file diff --git "a/jung0115/\354\235\264\353\266\204 \355\203\220\354\203\211/Programmers_43238.kt" "b/jung0115/\354\235\264\353\266\204 \355\203\220\354\203\211/Programmers_43238.kt" new file mode 100644 index 00000000..78e90174 --- /dev/null +++ "b/jung0115/\354\235\264\353\266\204 \355\203\220\354\203\211/Programmers_43238.kt" @@ -0,0 +1,24 @@ +// 8차시 2024.08.19.월 : 프로그래머스 - 입국심사(Lv.3) +class Solution { + fun solution(n: Int, times: IntArray): Long { + var min: Long = 0 + var max: Long = (times.maxOrNull()!!.toLong() * n) + + while (min < max) { + val mid: Long = (min + max) / 2 + var complete: Long = 0 + + for (time in times) { + complete += mid / time + } + + if (complete >= n) { + max = mid + } else { + min = mid + 1 + } + } + + return min + } +} \ No newline at end of file diff --git "a/jung0115/\355\212\270\353\246\254/Baekjoon_7432.kt" "b/jung0115/\355\212\270\353\246\254/Baekjoon_7432.kt" new file mode 100644 index 00000000..688fc54d --- /dev/null +++ "b/jung0115/\355\212\270\353\246\254/Baekjoon_7432.kt" @@ -0,0 +1,64 @@ +// 6차시 2024.08.03.토 : 백준 - 디스크 트리(7432) +import java.io.BufferedReader +import java.io.InputStreamReader + +const val DEPTH_STRING = " " + +data class Node( + var directory: String, + var nodes: MutableList +) + +var answer: StringBuilder = StringBuilder() + +fun main() { + val br = BufferedReader(InputStreamReader(System.`in`)) + + val N = br.readLine().toInt() + + val root = Node("", mutableListOf()) + + for(i: Int in 1..N) { + val path = br.readLine() + val directories = path.split("\\") + + // 트리로 정리 + var parent = root + for(j: Int in 0..directories.size - 1) { + val currentDirectory = directories[j] + var index = -1 + + // 부모 노드에 이미 존재하는지 확인 + for(k: Int in 0..parent.nodes.size - 1) { + if(parent.nodes[k].directory.equals(currentDirectory)) { + index = k + break + } + } + // 존재하지 않을 경우 자식으로 추가 + if(index == -1) { + parent.nodes.add(Node(currentDirectory, mutableListOf())) + index = parent.nodes.size - 1 + } + + // 다음 자식을 체크하기 위해 depth 증가 + parent = parent.nodes[index] + } + } + + root.nodes.sortBy{ it.directory } + for(node in root.nodes) { + tree(node, "") // depth 1 + } + + print(answer) +} + +fun tree(current: Node, depth: String) { + answer.append(depth).append(current.directory).append("\n") + + current.nodes.sortBy{ it.directory } + for(node in current.nodes) { + tree(node, depth + DEPTH_STRING) // Depth 증가시켜주고 자식 노드도 탐색 + } +} \ No newline at end of file