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 15a6d258..825382ae 100644 --- a/jung0115/README.md +++ b/jung0115/README.md @@ -12,4 +12,11 @@ | 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 | \ No newline at end of file +| 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 | +| 15차시 | 2024.09.28.토 | 이분 탐색 | [가장 긴 증가하는 부분 수열 2(12015)](https://www.acmicpc.net/problem/12015) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/169 | +| 16차시 | 2024.10.05.토 | 시뮬레이션 | [주차 요금 계산(Lv.2)](https://school.programmers.co.kr/learn/courses/30/lessons/92341) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/173 | +| 17차시 | 2024.10.11.금 | 그리디 알고리즘 | [마법의 엘리베이터(Lv.2)](https://school.programmers.co.kr/learn/courses/30/lessons/148653) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/175 | +| 18차시 | 2024.10.12.토 | 다이나믹 프로그래밍 | [뉴스 전하기(1135)](https://www.acmicpc.net/problem/1135) | https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/177 | \ 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/\352\267\270\353\246\254\353\224\224\354\225\214\352\263\240\353\246\254\354\246\230/Programmers_148653.kt" "b/jung0115/\352\267\270\353\246\254\353\224\224\354\225\214\352\263\240\353\246\254\354\246\230/Programmers_148653.kt" new file mode 100644 index 00000000..1da1697b --- /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/Programmers_148653.kt" @@ -0,0 +1,26 @@ +// 17차시 2024.10.11.금 : 프로그래머스 - 마법의 엘리베이터(Lv.2) +class Solution { + fun solution(storey: Int): Int { + var answer: Int = 0 + var storeyClone = storey + + while (storeyClone > 0) { + val num = storeyClone % 10 + storeyClone /= 10 + + if (num < 5) { + answer += num + } else if (num == 5) { + // 5일 때, 다음 자릿수를 확인 + if (storeyClone % 10 >= 5) storeyClone++ + + answer += 5 + } else { + answer += (10 - num) + storeyClone++ + } + } + + return answer + } +} \ 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_1135.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_1135.kt" new file mode 100644 index 00000000..db2a4df4 --- /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_1135.kt" @@ -0,0 +1,46 @@ +// 18차시 2024.10.12.토 : 백준 - 뉴스 전하기(1135) +import java.io.BufferedReader +import java.io.InputStreamReader +import java.util.StringTokenizer + +lateinit var employees: Array> +lateinit var dp: Array + +fun main() { + val br = BufferedReader(InputStreamReader(System.`in`)) + + var N = br.readLine().toInt() // 직원의 수 + + val st = StringTokenizer(br.readLine()) + employees = Array(N) { mutableListOf() } + dp = Array(N) { -1 } + + st.nextToken() + for(i: Int in 1..N-1) { + employees[st.nextToken().toInt()].add(i) + } + + println(dfs(0)) +} + +fun dfs(employee: Int): Int { + if (dp[employee] != -1) return dp[employee] + + // 더 이상 전화할 사람이 없음 + if (employees[employee].isEmpty()) return 0 + + // 자식들에게 전화하는 시간 + // 내림차순 정렬 + val times = employees[employee].map { dfs(it) }.sortedDescending() + + // 각 자식에게 전화 거는 시간 계산 + var maxTime = 0 + for (i in times.indices) { + // 자식에게 전화 + 그 자식이 전화 거는 시간 + maxTime = maxOf(maxTime, times[i] + i + 1) + } + + dp[employee] = maxTime + + return dp[employee] +} \ 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_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/\354\210\230\355\225\231/tempCodeRunnerFile.kt" "b/jung0115/\354\210\230\355\225\231/tempCodeRunnerFile.kt" deleted file mode 100644 index e0d2b191..00000000 --- "a/jung0115/\354\210\230\355\225\231/tempCodeRunnerFile.kt" +++ /dev/null @@ -1,39 +0,0 @@ -// 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 - - // 2, 3, 5, 7, 11, 13, 17 - //val notPrimeNumber = listOf( 0, 1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18 ) - 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\213\234\353\256\254\353\240\210\354\235\264\354\205\230/Programmers_92341.kt" "b/jung0115/\354\213\234\353\256\254\353\240\210\354\235\264\354\205\230/Programmers_92341.kt" new file mode 100644 index 00000000..c6216b4e --- /dev/null +++ "b/jung0115/\354\213\234\353\256\254\353\240\210\354\235\264\354\205\230/Programmers_92341.kt" @@ -0,0 +1,71 @@ +// 16차시 2024.10.05.토 : 프로그래머스 - 주차 요금 계산(Lv.2) +import java.util.HashMap + +data class Record ( + val time: Int, + val carNum: Int, + val isIn: Boolean +) + +class Solution { + fun solution(fees: IntArray, records: Array): IntArray { + val sortRecords: MutableList = mutableListOf() + + // 주어진 기록을 파싱해서 Record 리스트로 변환 + for(record: String in records) { + val current = record.split(" ") + + val timeSplit = current[0].split(":") + val time: Int = timeSplit[0].toInt() * 60 + timeSplit[1].toInt() + val carNum: Int = current[1].toInt() + val isIn: Boolean = current[2] == "IN" + + sortRecords.add(Record(time, carNum, isIn)) + } + + // 입차 중인 차량들의 입차 시간을 저장하는 맵 + val inCars: HashMap = HashMap() + // 자동차 번호별 총 주차 시간을 저장하는 맵 + val parkingTimes: HashMap = HashMap() + + // 각 레코드를 처리 + for(record: Record in sortRecords) { + if (record.isIn) { + // 입차 시 입차 시간을 기록 + inCars[record.carNum] = record.time + } else { + // 출차 시 주차 시간을 계산하고 누적 + val inTime: Int = inCars.remove(record.carNum) ?: 0 + val parkingTime = record.time - inTime + parkingTimes[record.carNum] = parkingTimes.getOrDefault(record.carNum, 0) + parkingTime + } + } + + // 출차하지 않은 차량은 23:59에 출차된 것으로 간주 + val endTime = 23 * 60 + 59 + for((carNum, inTime) in inCars) { + val parkingTime = endTime - inTime + parkingTimes[carNum] = parkingTimes.getOrDefault(carNum, 0) + parkingTime + } + + // 자동차 번호 순으로 결과를 계산 + val result: MutableList> = mutableListOf() + for((carNum, parkingTime) in parkingTimes) { + var cost: Int = fees[1] // 기본 요금 + val overTime = parkingTime - fees[0] + + // 기본 시간을 넘은 경우 추가 요금을 계산 + if (overTime > 0) { + cost += (overTime / fees[2]) * fees[3] + if (overTime % fees[2] > 0) { + cost += fees[3] + } + } + + result.add(Pair(carNum, cost)) + } + + // 자동차 번호 순으로 정렬 후 요금만 반환 + return result.sortedBy { it.first }.map { it.second }.toIntArray() + } +} \ No newline at end of file diff --git "a/jung0115/\354\235\264\353\266\204\355\203\220\354\203\211/Baekjoon_12015.java" "b/jung0115/\354\235\264\353\266\204\355\203\220\354\203\211/Baekjoon_12015.java" new file mode 100644 index 00000000..afef76f8 --- /dev/null +++ "b/jung0115/\354\235\264\353\266\204\355\203\220\354\203\211/Baekjoon_12015.java" @@ -0,0 +1,55 @@ +package jung0115.이분탐색; +// 15차시 2024.09.28.토 : 백준 - 가장 긴 증가하는 부분 수열 2(12015) + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Baekjoon_12015 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int[] A = new int[N]; + for(int i = 0; i < N; i++) { + A[i] = Integer.parseInt(st.nextToken()); + } + + int[] longIncrease = new int[N]; + int lastIndex = 0; + longIncrease[lastIndex] = A[0]; + + for(int i = 1; i < N; i++) { + int num = A[i]; + + // 이전값보다 큼 -> 증가 + if(longIncrease[lastIndex] < num) { + longIncrease[++lastIndex] = num; + } + // 이전값보다 작음 + else { + int left = 0; + int right = lastIndex + 1; + + while (left < right) { + int mid = (left + right) / 2; + + if(longIncrease[mid] < num) { + left = mid + 1; + } + else { + right = mid; + } + } + + // num보다 작은 값 중 제일 뒤에 있는 숫자의 뒤 + longIncrease[left] = num; + } + } + + System.out.print(lastIndex + 1); + } +} diff --git "a/jung0115/\354\235\264\353\266\204 \355\203\220\354\203\211/Baekjoon_1477.kt" "b/jung0115/\354\235\264\353\266\204\355\203\220\354\203\211/Baekjoon_1477.kt" similarity index 100% rename from "jung0115/\354\235\264\353\266\204 \355\203\220\354\203\211/Baekjoon_1477.kt" rename to "jung0115/\354\235\264\353\266\204\355\203\220\354\203\211/Baekjoon_1477.kt" 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" similarity index 100% rename from "jung0115/\354\235\264\353\266\204 \355\203\220\354\203\211/Programmers_43238.kt" rename to "jung0115/\354\235\264\353\266\204\355\203\220\354\203\211/Programmers_43238.kt"