목록프로그래밍 (38)
몰?.루();
브루트포스 + dfs + bfs를 모두 사용하는 문제입니다. dfs를 통해서 빈 공간에 벽을 3개 세우는 모든 경우의 수대로 벽을 세워보고, 벽을 3개 세웠을 때마다 bfs를 통해서 바이러스를 퍼트려보고, 다 퍼트린 후 남은 안전 구역이 몇 개 인지 세는 방식입니다. 쉽게 말해 노가다죠. 뭔가 엄청난 방식이 있을 줄 알았는데 다른 분들 풀이를 봐도 다 이렇게 하더라구요. import java.util.LinkedList import kotlin.math.max var answer = 0 fun main() { val (n, m) = readLine()!!.split(" ").map { it.toInt() } val map = Array(n) { readLine()!!.split(" ").map { it...
여러가지 정렬 기준에 대해 정렬하는 문제입니다. fun main() { val n = readLine()!!.toInt() val inputs = ArrayList(n) repeat(n) { val line = readLine()!!.split(" ") inputs.add(Info(line[0], line[1].toInt(), line[2].toInt(), line[3].toInt())) } // inputs.sortedBy { it.name }.sortedByDescending { it.math }.sortedBy { it.english }.sortedByDescending { it.korean }.forEach { println(it.name) } inputs.sortedWith(compareBy({..
import java.util.LinkedList fun main() { repeat(readLine()!!.toInt()) { val (a, b) = readLine()!!.split(" ").map { it.toInt() } fun bfs() { val visited = BooleanArray(10000) val queue = LinkedList() queue.add(Pair(a, "")) while (queue.isNotEmpty()) { val head = queue.poll() if (head.first == b) { // 종료 조건 println(head.second) return } if (!visited[head.first.d()]) { queue.add(Pair(head.first.d()..
코틀린에는 이미 이진탐색이 기본적으로 구현되어있습니다. fun main() { val arr = IntArray(100) { it * 2 } // [0, 2, 4, ..., 198] // 찾는 원소 있을 때 println(arr.binarySearch(100)) // 출력: 50 println(arr.binarySearch(0)) // 출력: 0 println(arr.binarySearch(36)) // 출력 18 // 찾는 원소 없을 때 println(arr.binarySearch(-5)) // 출력: -1 println(arr.binarySearch(3)) // 출력: -3 println(arr.binarySearch(199)) // 출력: -101 } .binarySearch()를 통해 이진탐색을 ..
val n = 10000 val arr = IntArray(n) { it } repeat(n) { val a = (arr.indices).random() val b = (arr.indices).random() val temp = arr[a] arr[a] = arr[b] arr[b] = temp } arr.forEach { print("$it ") } 0부터 n - 1까지 난수를 중복없이 발생시키고 출력하는 코드입니다. 방식은 0 ~ n - 1까지 순서대로 들어가있는 IntArray를 만들고, n번만큼 랜덤하게 swap을 진행하여 마치 카드 패 섞듯 arr 함수를 엉망진창으로 만드는 방식입니다. 흔히 쓰는 랜덤값 하나 뽑고 배열에 그 값이 이미 있는 값인지 아닌지 for문 돌면서 검사하고 없으면 채택하고 ..
무난한 백트래킹 문제인데 나온지 얼마 안 된 문제이다보니 인터넷에 코틀린 코드가 하나도 없더군요... data class food(val p: Int, val f: Int, val s: Int, val v: Int, val price: Int) fun main() { // 인풋 val n = readLine()!!.toInt() val temp = readLine()!!.split(" ").map { it.toInt() } val mp = temp[0] val mf = temp[1] val ms = temp[2] val mv = temp[3] val foods = ArrayList(n) repeat(n) { val temp = readLine()!!.split(" ").map { it.toInt() } ..
반례 찾아보려고 검색해봤더니 이 문제는 코틀린 코드가 인터넷에 하나도 없길래 저라도 올려봅니다. 굉장히 근본없는 풀이방법일 가능성이 높으니 참고용으로만 쓰시길... 112 이렇게 되어있는 전화번호를 1,1,2로 자른 후에 트리 형태로 저장하고, 1126을 저장할 때 기존에 1,1,2가 저장된 게 있으니 순서대로 따라가다가 마지막 2에서 해당 노드가 leaf 노드라는 말은 앞에서 1,1,2로 끝나는 번호가 있었다는 말이므로 NO를 출력하고 탐색을 종료합니다. 반대로 만약 1126이 먼저 들어오고 112가 나중에 들어온 경우에도 NO를 출력하고 탐색을 종료합니다. (이땐 1,1,2,6에서 2는 leaf가 아니지만 1,1,2를 넣을 때 2번이 leaf이므로 탐색이 종료됩니다.) 참고로 112가 있어도 3112..
백준에서 가장 곤란한 점 중 하나는 틀린 경우 틀렸습니다. 라고만 알려주고 어떤 입력에서 틀렸는지 알려주지 않는다는 점입니다. 이는 비단 백준만의 문제가 아니라 거의 모든 온라인 저지 사이트가 그렇습니다. 해당 코드가 어떤 인풋에서 틀렸는지를 알려주면, 그 사이트에서 사용하는 테스트 케이스가 뭐가 있는지 모두 알아낼 수 있다는 뜻이고, 그럼 그냥 알고리즘이고 뭐고 if문으로 모든 input마다 분기를 나눠서 단순히 정답을 print해버리면 모든 문제가 간단히 파훼 되어버리기 때문에 알려주지 않습니다. 그 덕분에 순수하게 내 코드가 왜 틀렸는지, 반례가 뭔지 알고 싶은 사람들에겐 답답한 상황이 나옵니다. 그래서 제가 쓰는 방법은 인풋을 랜덤하게 대입하고, 제 코드랑 인터넷에 있는 정답 코드랑 비교해서 다른..
정말 간단한 문제라서 슈루룩 풀어버리고 다음 문제로 넘어가려고 했는데 이게 웬 걸? 시간 초과가 떴습니다.. 처음엔 그래서 그냥 출력 문젠가 싶어서 println을 BufferedWriter로 바꾸어 보았는데도 시간 초과가 뜨더군요. 다시보니 문제 제한 시간이 1초뿐이고 입력은 10만 개까지도 들어와서 그게 문제였습니다. 그래서 고쳐서 낸 코드는 다음과 같습니다. fun main() { readLine() // n val arr1 = readLine()!!.split(" ").sorted() readLine() // m val arr2 = readLine()!!.split(" ").map { if (arr1.binarySearch(it) >= 0) 1 else 0 } arr2.forEach { print..
구글에 검색해봤는데 이 문제 코틀린 코드는 정말 찾아보기 힘들더라구요. 특히 그나마 몇 개 있는 코드들도 Java스러운 느낌이 강하게 드는 코드라 코틀린스럽게 짜본 코드를 공유 및 개인 저장 차원에서 올려봅니다. import java.util.PriorityQueue const val INF = 1000000 fun main() { // 1. 인풋 val (v, e) = readLine()!!.split(" ").map { it.toInt() } val start = readLine()!!.toInt() val edges = Array(v + 1) { ArrayList() } val dist = IntArray(v + 1) { INF } // start에서 (여기저기 거쳐서) i에 도착할 때 최소 비용,..