[Flutter] ShellRoute와 NavigatorKey로 복잡한 네비게이션 구조 관리하기 GoRouter에서 ShellRoute와 여러 NavigatorKey를 사용하는 방식은 복잡한 네비게이션 흐름을 관리하는 데 도움이 되며, 특히 바텀 네비게이션이나 사이드 네비게이션을 사용하여 여러 탭이 있는 앱에서 유용합니다. 아래에 ShellRoute와 NavigatorKey의 역할과, 기존의 단순한 GoRoute 구조와 비교했을 때의 차이점을 설명하겠습니다.1. NavigatorKey의 역할NavigatorKey는 네비게이터의 상태를 추적하거나 특정 네비게이터 인스턴스에 대해 명시적으로 접근할 때 사용됩니다. GoRouter 설정에서 rootNavigatorKey와 shellNavigatorKey를 설정하면 다음과 같은 효과가 있습니다:_rootNavigatorKey: 앱의 최상위 네비게이터를 참조.. [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.. 이전 1 2 3 4 다음