목록프로그래밍/안드로이드, 코틀린 (35)
몰?.루();
미로를 만드는 알고리즘은 정말 많습니다. 하지만 그 중에선 미로같이 생기지 않은 미로를 만드는 알고리즘도 정말 많습니다. 이런 모양은 분명 미로긴한데 미로라고 하기엔 너무 이상하게 생겼습니다. 위키백과(https://en.wikipedia.org/wiki/Maze_generation_algorithm)에 갖가지 방법이 소개되어있지만 하나같이 설명이 개떡같이 되어있으며 심지어는 그 개떡같은 설명을 찰떡같이 알아듣고 꾸역꾸역 구현해도 이상한 결과가 나오기도 합니다. 위키백과에 설명되어있는 Randomized Prim's algorithm(랜덤 프림 알고리즘)을 따라해서 구현한 한 사람은 자신이 구현한 미로가 이따구로 나온다면서 스택오버플로우에 질문 글(https://stackoverflow.com/quest..
fun main() { val (n, s) = readln().split(" ").map { it.toInt() } val inputs = readln().split(" ").map { it.toInt() } dfs(null, inputs, n, s, 0) println(answer) } var answer = 0 fun dfs(sum: Int?, inputs: List, n: Int, s: Int, startIndex: Int) { if (sum == s) { answer++ } for (i in startIndex until n) { dfs((sum ?: 0) + inputs[i], inputs, n, s, i + 1) } } 무난한 백트래킹 문제이므로 dfs를 이용해서 풀 수 있습니다. 다만 주의해..
fun main() { val n = readln().toInt() val inputs = readln().split(" ").map { it.toLong() } val arr = ArrayList() for (i in 1 .. n) arr.add(i) if (inputs[0] == 1L) { val answer = IntArray(n) solve1(arr, inputs[1], 0, answer) answer.forEach { print("$it ") } } else { val target = inputs.subList(1, inputs.size).map { it.toInt() }.toIntArray() println(solve2(arr, target, 0, 1)) } } fun solve1(arr: A..
dfs를 이용해 브루트포스 방식으로 풀었다. 즉, 카메라를 회전 시킬 수 있는 모든 경우의 수를 다 테스트하며 각 경우에서 가장 사각지대가 적은 경우를 찾아내었다. import kotlin.math.min var answer = Int.MAX_VALUE fun main() { val (n, m) = readln().split(" ").map { it.toInt() } val map = ArrayList() val cameras = ArrayList() repeat(n) { r -> val arr = readln().split(" ").map { it.toInt() }.toIntArray() arr.forEachIndexed { c, i -> if (i in 1 .. 5) { cameras.add(Came..
import kotlin.math.pow fun main() { val (n, r, c) = readln().split(" ").map { it.toInt() } println(find(2.0.pow(n).toInt(), r, c)) } fun find(l: Int, r: Int, c: Int): Int { // l은 한 변의 길이 if (r == 0 && c == 0) { return 0 } else if (r == 0 && c == 1) { return 1 } else if (r == 1 && c == 0) { return 2 } else if (r == 1 && c == 1) { return 3 } if (r < l / 2 && c < l / 2) { // 왼쪽 위 사분면 return find(l ..
import java.util.PriorityQueue fun main() { val n = readln().toInt() val arr = PriorityQueue() repeat(n) { arr.add(readln().toLong()) } var answer = 0L while (arr.size > 1) { val a = arr.poll() val b = arr.poll() val s = a + b arr.add(s) answer += s } println(answer) } 무조건 오름차순으로 정렬된 배열이 필요할 땐 PriorityQueue를 쓰는 게 좋다는 걸 배울 수 있었던 문제입니다. 이걸 몰라서 괜히 LinkedList 쓰고 binarySearch 쓰고 별 쑈를 다 했네...
Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.5.1. 프로젝트 만들자마자 실행했는데 이런 에러가 뜨길래 찾아보니 코틀린 버전 문제라서 코틀린 버전을 최신 버전으로 올려주니 해결되었습니다. 사진과 같이 Project 수준의 Gradle을 열고 kotlin 버전을 최신버전으로 바꾸고(저는 1.7.10인데 시간 지나면 달라질 수 있으니 https://kotlinlang.org/docs/releases.html 여기서 각자 확인해주세요) 마지막으로 우상단에 있는 Sync Now 해주고 나니 해결되었습니다.
브루트포스 + 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()..