728x90

TIL/kotlin 알고리즘 77

kotlin 완전탐색 소수찾기

해당 문제를 봤을때, 완전 탐색이라고 적혀 있어서 코드가 길어질것 같다는 예상을 했다. 코드는 아래와 같이 작성했다. 주어진 숫자 문자열을 숫자 배열(digits)로 변환한 다음 generatePrimes함수를 호출하여 가능한 소수를 생성 그리고 생성된 소수의 개수를 반환한다. generatePrimes 함수는 주어진 숫자로부터 가능한 소수를 생성한다. 이 함수는 generatePermutations 함수를 호출하여 가능한 모든 순열을 생성한 다음 isPrime 함수를 사용하여 소수인지를 확인하고, 소수인 경우에만 리스트에 추가한다. generatePermutations 함수는 재귀적으로 주어진 숫자 배열(digits)로부터 모든 순열을 생성한다. 이 함수는 현재까지의 순열(current)에 새로운 숫자..

kotlin 프로그래머스 lv2 가장 큰 수

해당 문제를 보고나서 문제 로직이 간단할 것 같다는 생각을 했다. 가장먼저 든 생각은 주어진 numbers를 맵으로 꺼내서 한요소씩 비교해서 정렬하면 가장 큰 수를 return할 수 있을것 같다는 생각이 들었고, 아직 코틀린 함수를 다 외운 상태가 아니기때문에 비교자에 대해 검색해봤다. 그 중 https://jsdevlog.tistory.com/entry/%EC%BD%94%ED%8B%80%EB%A6%B0kotlin-sortedWith-%EC%A0%95%EB%A0%AC-%EB%9E%8C%EB%8B%A4%EC%8B%9D-%EC%98%88%EC%A0%9C 코틀린(kotlin) sortedWith 정렬 람다식 예제 코틀린 List 변수의 sortedWith 함수의 람다식 코드를 실행해보자. fun main(ar..

kotlin 프로그래머스 lv2 다리를 지나는 트럭

문제를보고 저번에 풀었던 "숫자 변환하기" 문제와 유사하여 queue를 이용해서 해결했다. 예시를 보면 트럭2대가 올라갈 수 있고 무게를 10kg까지 견디는 다리가 있다고 한다. 무게가 [7,4,5,6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 한다고 한다. 숫자 변환하기 그래서 나는 먼저 다리 위에 있는 트럭 배열을 LinkedList를 이용해서 onBridge변수를 초기화 했다. 그 후 다음으로 다리에 진입할 트럭의 인덱스 변수를 초기화했다. 마지막으로 모든 트럭이 다리를 건널 때까지 반복하는 작업을 했다. 여기서 while문의 조건은 onBridge 배열이 비어있지 않거나 다음 트럭의 인덱스가 주어직 매개변수 nextTruckIdx의 사이즈보다 작으면 answer을 ..

kotlin 프로그래머스 lv2 2개 이하로 다른 비트

해당 문제를 풀기위해 맨처음 이진수로 변환하는 방법에대해 먼저 생각하게되었다. toInt(2) 나 toString(2)로하면 2진정수나 스트링 타입으로 나타낼 수 있다고 찾게되었다. 그 후 문제를 다시 읽어보면서 규칙을 찾았다. 숫자가 짝수일때는 1을 더한 값이 결과가 되었고, 홀수인경우는 조금 복잡했다. 먼저 나는 변수n이라고두고, for문안에서 아래와 같이 작성했다. for(number in numbers){ //홀수인경우, 이진수 문자열로 변환하고 역순으로 만듦 var n = number.toString(2).reversed() + '0' //0이 처음으로 나타나는 인덱스를 찾음 val zero = n.indexOf('0') //0이 나타나는 비트를 변경하여 다음 수를 생성하고, 역순으로 만든 뒤 ..

kotlin 프로그래머스 lv2 숫자 변환하기

문제를 보자마자 해당문제는 x에서 y에 도달하게끔 만드는 문제이다. x에서 y로가는 최단방법을 찾으면 된다고 생각했고, 그래서 알고리즘중에서 많은 양의 데이터 중 원하는 데이터를 찾는 탐색에 적합한 BFS(너비 우선 탐색)가 떠올랐다. BFS의 탐색 플로우는 그래프나 트리 등의 자료 구조에서 가까운 노드부터 탐색하는 알고리즘이다. 이 알고리즘은 큐를 사용하여 탐색해야 할 노드들을 저장하고, 먼저 저장된 노드부터 순서대로 탐색한다. 이때, 탐색한 노드들을 방문했음을 표시하여 중복 방문을 방지한다. 1. 초기화: 시작 노드를 큐에 넣고, 시작 노드를 방문했음을 표시한다. 2. 큐가 비어있지 않은 동안 반복: -큐에서 노드를 하나 꺼낸다. -해당 노드에 인접한(연결된) 노드들 중 방문하지 않은 노드를 큐에 추..

kotlin 프로그래머스 lv2 롤케이크 자르기

맨처음 해당 문제를 풀때, 아래와 같이 코드를 작성했다. class Solution { fun solution(topping: IntArray): Int { var answer: Int = 0 val boy1Toppings = mutableSetOf() // 첫 번째 사람의 토핑 val boy2Toppings = mutableSetOf() // 두 번째 사람의 토핑 val totalToppings = mutableMapOf().withDefault { 0 } // 롤 케이크에 포함된 각 토핑의 개수 for (t in topping) { totalToppings[t] = totalToppings.getValue(t) + 1 } var boy1UniqueToppings = 0 // 첫 번째 사람이 가진 유니..

kotlin 프로그래머스 lv2 뒤에 있는 큰 수 찾기

해당문제를보고 for문에 담아서 현재i번째에있는 numbers의 요소와 i보다 큰 번째에있는 요소와 비교해서 현재요소가 작다면 큰요소를 현재위치에 삽입하고, 현재요소보다 큰요소가 없다면 -1을 대입하는 생각을 했다. 그래서 코드는 아래와 같이 바로 작성했다. 하지만 시간초과가 났고, for문때문에 시간이 오래걸린것이라 생각이 들었다. 다른 사람들의 풀이를 찾아보니 stack알고리즘을 이용하였다. 스택을 사용하는 이유를 찾아보았고, 다음과 같았다. 1.스택을 사용하여 이전에 처리한 요소들의 인덱스를 추적한다. 2. 주어진 배열을 왼쪽에서 오른쪽으로 반복하면서 각 요소에 대해 다음과 같이 수행한다. -스택이 비어있지 않고, 현재 요소보다 작은 요소들의 인덱스가 스택에 남아있다면, 해당 작은 요소들에 대한 결..

kotlin 프로그래머스 lv2 모음사전

해당 문제를 풀기위해 단어조합을 먼저 그려보았다. 다는 아니지만 나열해보면 아래와같다. ['A', 'AA', 'AAA', 'AAAA', 'AAAAA', 'AAAAE', 'AAAAI', 'AAAAO', 'AAAAU', 'AAAE', 'AAAEA', 'AAAEE', 'AAAEI', 'AAAEO', 'AAAEU', 'AAAI', 'AAAIA', 'AAAIE', 'AAAII', 'AAAIO', 'AAAIU', 'AAAO', 'AAAOA', 'AAAOE', 'AAAOI', 'AAAOO', 'AAAOU', 'AAAU', 'AAAUA', 'AAAUE', 'AAAUI', 'AAAUO', 'AAAUU', 'AAE', 'AAEA', 'AAEAA', 'AAEAE', 'AAEAI', 'AAEAO', 'AAEAU', 'AAEE..

kotlin 프로그래머스 lv2 2022 KAKAO BLIND RECRUITMENT주차 요금 계산

해당 문제를보고 코드가 너무 길어지고 시간초과로 다른 코드를 참조하면서 문제를 공부했다. 먼저 다른사람들과 나와의 공통점은 records배열을 쪼갤생각을 했다 하지만 나는 오늘 컨디션이 좋지 않아서 그런지 그다음 실행으로 옮기지 못했다. 그래서 다른 사람들의 코드를 참고하기로 했다. 그 중 이런 코드가 있었다. 매우 간결하게 정리되어있었다. 코드르 보고 다행히도 이해를 할 수 있어서 다행이었다. 먼저 설명해보자면, records.map{ it.split(":", " ").let{ Triple(it[0].toInt()*60 + it[1].toInt(), it[2], it[3]) } } records 배열 예를들어 ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT",..

kotlin 프로그래머스 lv2 k진수에서 소수 개수 구하기

해당 문제를 보고 저번에 풀었던 프로그래머스 lv1 3진법 뒤집기 문제와 많이 유사하다고 생각했다. 먼저 n이라는 정수를 k진수로 변환하는 과정이 필요했다. 그래서 var mok = n var kjinbubList = mutableListOf() while(mok != 0){ kjinbubList.add(mok % k) mok /= k } val resultList = kjinbubList.reversed().joinToString("") //211020101011 ==>이런 방식으로 변환을 시켰다. 이제 변환된 숫자를 순회하며 연속된 소수를 찾는 과정이 필요했다. var startIndex = 0 var endIndex = 0 while(endIndex < resultList.length){ //연속된..

728x90