목록프로그래밍/안드로이드, 코틀린 (35)
몰?.루();
코틀린에는 이미 이진탐색이 기본적으로 구현되어있습니다. 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에 도착할 때 최소 비용,..
학부생 때는 이걸 C언어로 하다보니 DFS, BFS 구현은 둘째치더라도 인풋을 받아서 배열에 넣는 과정조차 정말 오래걸렸습니다. 근데 확실히 코틀린으로 하니까 인풋을 배열에 넣는 건 정말 쉬웠습니다. 제가 코틀린을 좋아하는 이유기도 합니다. 입력 // 입력 val inputs = """ 15 16 1 2 1 8 1 9 2 3 2 7 2 5 3 4 3 6 4 5 9 10 9 15 9 13 10 11 10 12 13 12 13 14 """.trimIndent().lines() println("============= inputs =============") inputs.forEach { println(it) } // 입력을 배열로 저장 val (v, e) = inputs[0].split(" ").map { ..
"ajvbieofsodfsddasoidjqlwnvsc" 여기서 d의 개수만 알고 싶을 때 val myString = "ajvbieofsodfsddasoidjqlwnvsc" myString.count { it == 'd' } // 4 몰랐는데 count에 람다식을 통해서 특정 문자 개수만 셀 수 있었습니다. (항상 문자열.count()로 인자 없이 그냥 문자열 개수 쓸 때만 써서 몰랐...) 같은 원리로 Int형에서 특정 숫자가 몇 개 있는지 알아낼 때도 사용할 수 있습니다. 단순히 그냥 Int를 String으로 변환하고, 같은 방법을 쓰면 됩니다. val myInt = 12312312542343212 myInt.toString().count { it == '2' } // 6 Int를 toString으로 ..
알고리즘 문제를 코틀린으로 풀고, 다른 사람들의 풀이법을 보다보면 저는 Array로 정수 배열을 저장하는데 사람들은 IntArray로 정수 배열을 저장하는 경우가 많았습니다. 무슨 차이가 있을까 싶어서 찾아봤는데 한국엔 자료가 잘 없어서 여기저기서 찾은 정보들을 취합해서 정리해보았습니다. 결론부터 말하자면 IntArray가 Array보다 미세하게 더 좋습니다. 자바 바이트 코드로 저장될 때가 다릅니다 // 코틀린 코드 fun main() { val a = IntArray(5) val b = Array(5) { 0 } } // 위 코틀린 코드를 자바로 변환시 public static final void main() { int[] a = new int[5]; Integer[] b = new Integer[5..