목록프로그래밍 (38)
몰?.루();
두괄식으로 결론부터 조지자면 // 액티비티에 이 코드 삽입 val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as MyFragment fragment.myFragmentFuncion() 이렇게 하시면 됩니다. 메인 액티비티 소스 코드(MainActivity.kt) package com.example.test import android.os.Bundle import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { supe..
코틀린에는 확장 함수가 존재합니다. 이미 있는 클래스에 내가 원하는 기능의 함수를 추가할 수 있습니다. fun String.isHello(): Boolean { return (this == "hello") } 예를 들어 위와 같이 어떤 문자열이 "hello"인지 판단해주는 아주 쓸모 없는 확장 함수를 제가 직접 만들 수 있습니다. 이렇게 확장 함수를 만들어놓으면 "hello".isHello() // true "hi".isHello() // false 이런 식으로 String 뒤에 점(.)을 붙이고 isHello()를 해서 마치 코틀린 자체에서 isHello라는 String 함수를 추가해놓은 것처럼 사용할 수 있습니다. 근데 이 확장 함수 기능은 자바에는 없습니다. 자바 파일에 가서 아무리 "hello"...
코틀린에는 스코프 함수 5형제가 있습니다. 알아두면 매우 유용하지만 그만큼 헷갈리는 친구들이기도 하기 때문에 정리해보겠습니다. 키워드 객체 참조 리턴값 .let it 마지막 줄 .also it 참조 객체 .run this 마지막 줄 with this 마지막 줄 .apply this 참조 객체 이미 스코프 함수를 아시는데 잠깐 까먹은 분들은 위의 표만으로 충분하지만 처음보면 뭔 소린지 알 수 없기 때문에 예시를 들어보겠습니다. .let let의 객체 참조는 it을 쓰고 리턴값은 스코프 마지막 줄입니다. 보통 null-check를 할 때 많이 씁니다 let을 사용하지 않고는 코드를 다음과 같이 써야합니다. val num: Int? = getNumberFromServer() // 서버로부터 오는 값 var i..
미로를 만드는 알고리즘은 정말 많습니다. 하지만 그 중에선 미로같이 생기지 않은 미로를 만드는 알고리즘도 정말 많습니다. 이런 모양은 분명 미로긴한데 미로라고 하기엔 너무 이상하게 생겼습니다. 위키백과(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 해주고 나니 해결되었습니다.