썸네일 [Android] Retrofit2 URL Encoding 방지하기 공공데이터 사이트에서 api를 받아서 활용하는중에 계속 같은에러가 발생하였습니다. 에러를 찾아보니 GsonBuilder().setLenient().create() 를 컨버터에 붙여주면 된다는 글이 있었지만 해결되지 않았습니다. json 규격도 다 맞고, 혹시나 url이 잘못됐나 싶어 포스트맨으로도 확인해보았으나 데이터가 제대로 들어왔습니다. 인터셉터에서 띄워주는 로그를 보니 공공데이터에서 받은 서비스키가 다르게 나오고있었습니다. 제가 작성한 url 중 서비스키가 d49%3Do29%2R 이런식이었다면 d49%25253Do29%25252R 이렇게 나오고 있었는데 원인을 찾아보니 자동으로 utf-8로 인코딩 돼서 서비스키가 변경되어 나오는 것이었습니다. 공공데이터에서 받은 서비스키가 인코딩 서비스키였는데 인코..
[알고리즘] 백준 10989번 : 수 정렬하기 3 (Kotlin) www.acmicpc.net/problem/10989 10989번: 수 정렬하기 3 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다. www.acmicpc.net 이 문제는 시간초과에 대해 신경써야 하는 문제이므로 비교적 성능이 무거운 Scanner의 사용을 배제한다 1. 아슬아슬하게 채점된 BufferedReader + BufferedWriter + Arrays.sort() fun main() { val br = BufferedReader(InputStreamReader(System.`in`)) val bw = BufferedWriter(OutputStreamWriter(System.o..
[알고리즘] 백준 2798번 : 블랙잭 (Kotlin) www.acmicpc.net/problem/2798 2798번: 블랙잭 첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는다. 합이 M을 넘지 않는 카드 3장을 찾을 수 있 www.acmicpc.net 1. Scanner fun main() = with(Scanner(System.`in`)) { val N: Int = nextInt() val M: Int = nextInt() val arr = IntArray(N) var result = 0 for (i in 0 until N) { arr[i] = nextInt() } for (i in 0 until N - 2) { for (..
[알고리즘] 백준 10870번 : 피보나치 수 5 (Kotlin) www.acmicpc.net/problem/10870 10870번: 피보나치 수 5 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 www.acmicpc.net 1. 재귀 fun main() { val br = BufferedReader(InputStreamReader(System.`in`)) val input = br.readLine().toInt() print(fibonacci(input)) } fun fibonacci(N: Int): Int { return if (N < 2) N else fibonacci(N - 1) + f..
[알고리즘] 백준 1929번 : 소수 구하기 (Koltin) www.acmicpc.net/problem/1929 1929번: 소수 구하기 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다. www.acmicpc.net 1. Scanner + sqrt fun main() = with(Scanner(System.`in`)) { val N = nextInt() val M = nextLine().trim().toInt() val check = BooleanArray(M + 1) for (i in check.indices) check[i] = true val sqrt = sqrt(M.toDouble()).toInt() for (i in 2..sqrt) { if (c..
[알고리즘] 백준 2839번 : 설탕 배달 (Kotlin) www.acmicpc.net/problem/2839 2839번: 설탕 배달 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그 www.acmicpc.net 알고리즘은 정말 생각하면 할수록 더 나은 풀이가 나오는것 같습니다..! 1. 제가 처음 풀었을때의 코드입니다 fun main() = with(System.`in`.bufferedReader()) { var input = readLine().toInt() var count = 0 while (true) { if (input % 5 == 0) { print("${input / 5 + count}") break } else i..
[알고리즘] 백준 1152번 : 단어의 개수 (Kotlin) www.acmicpc.net/problem/1152 1152번: 단어의 개수 첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 www.acmicpc.net 1. 만들다보니 코드가 간단했습니다 fun main(args: Array) = with(BufferedReader(InputStreamReader(System.`in`))) { print("${StringTokenizer(readLine(), " ").countTokens()}") } 2. 한줄처리도 가능합니다 fun main() { print("${StringTokenizer(BufferedReader(I..
[알고리즘] 백준 2562번 : 최댓값 (Kotlin) www.acmicpc.net/problem/2562 2562번: 최댓값 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어 www.acmicpc.net 1-1. Scanner 를 이용한 방식 fun main(args: Array) = with(Scanner(System.`in`)) { val maxArray = arrayListOf() var maxLine = 0 var maxNum = 0 for (i in 0 until 9) { val inputNum = nextInt() maxArray.add(inputNum) if (max..
[알고리즘] 백준 10952번 : A+B-5 (Kotlin) www.acmicpc.net/problem/10952 10952번: A+B - 5 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 1. Scanner 를 이용한 방식 import java.util.* fun main(args: Array) = with(Scanner(System.`in`)) { while (true) { val A = nextInt() val B = nextInt() if (A == 0 && B == 0) { break } println("${A + B}") } } 2. BufferedReader 를 이용한 방식 import java.io.BufferedReader import java.io.InputStreamReader impo..
[알고리즘] 백준 10871번 : X보다 작은 수 (Kotlin) 알고리즘의 공부가 필요하겠다 싶어서 공부를 시작하게 됐는데 문제를 이해하는게 어렵네요ㅋㅋ 문제를 이해하면 로직은간단한거같은데 문제를 이해하는게 관건일듯 싶습니다 www.acmicpc.net/problem/10871 10871번: X보다 작은 수 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다. www.acmicpc.net 1. Scanner와 IntArray를 이용한 방식 import java.util.* fun main(args: Array) = with(Scanner(System.`in`)) { val n = nextInt() val x = nextI..
[Android] 코루틴 Under the hood 이번시간에는 코루틴이 내부적으로 어떻게 동작하는지 확인해보겠습니다 [Continuation Passing Style] CPS == Callbacks //Kotlin suspend fun createPost(token : Token, item : Item) : Post { _ } // Java/JVM Object createPost(Token token, Item item, Continuation cont) { _ } 작성한 코루틴이 컴파일 될때 내부적으로 JVM에서 Byte 코드로 변환되면서 Continuation이 하나가 더 생기게 됩니다. (CPS) [Labels] //Kotlin suspend fun postItem(item : Item) { // LABLE 0 val token = requestT..
[Android] 코루틴 Coroutine Context and Dispatchers 이번에는 coroutine context와 dispatchers 에 대해 알아보겠습니다 [Dispatchers and threads] Coroutine 은 CoroutineContext 에 의해 실행됩니다 CoroutineContext 의 요소에 여러 요소를 설정할수 있는데 요소들 중에는 Job, Dispatchers 등이 있습니다 Dispatchers 는 Coroutine이 어떤 thread 나 thread pool 에서 실행될지를 결정하는 요소입니다 모든 Coroutine builder 는 옵셔널로 CoroutineContext 를 파라미터로 받습니다. ex) launch, async 이것을 통해 dispatcher를 지정할 수 있습니다 fun main() = runBlocking { launch {..