프로그래머스 입문 알고리즘 문제 정리 - 코틀린(Kotlin)

2023. 1. 21. 00:24알고리즘/문제

 

모든 문제의 출처는 프로그래머스에 있습니다.

https://school.programmers.co.kr/learn/challenges/beginner?order=acceptance_desc&page=1 

 

코딩테스트 입문 | 프로그래머스 스쿨

코딩테스트에 처음 도전하는 사람들을 위한 입문 문제 모음. 쉬운 문제부터 하나씩 도전해 보면서 코딩테스트에 자신감도 붙이고 문제 해결 능력을 키워보세요!

school.programmers.co.kr

1. 문자열 안에 문자 반복 repeat() , joinToString()

fun solution(my_string: String, n: Int): String = my_string.map {
        it.toString().repeat(n)
    }.joinToString("")
n 횟수만큼 my_string의 문자 h, e, l, l, o 를 반복한 string을 만들어서 리스트를 반환한다.
그리고 리스트의 각 문자열을 joinToString("") 을 통해 하나의 문자열로 합쳐서 String 을 반환한다.
- map , repeat(int) , joinToString(seperator) 

 

 

2. 삼각형 완성조건(1) let { (x,y,z) 로 표현 가능 

fun solution(sides: IntArray): Int = sides.sorted().let { (x, y, z) ->
    if(x+y>z) 1 else 2
}
sorted > 가장 긴 변을 찾고 ex ) 3, 6, 2 ->  2, 3, 6
let { (x, y, z) ->  }
정렬된 리스트 it을 x,y,z 로 표현하여 가장 긴 변이 z 나머지 두변 x,y 
if 문 true 1 false  2
- let { (x,y,z) 로 표현 가능 

3. 자릿수 더하기

처음 풀이

class Solution {
    fun solution(n: Int): Int {
        var answer: Int = 0
        var num = n
         while(num>0) {
        answer += num%10
        num /= 10
    }
        return answer
    }
}
for문으로 Int를 10으로 나누어서 더해가는 식으로 하였다.
이렇게 하면 while 한번으로 n의 시간복잡도와 대략 0.01m 의 성능을 보여주는데 
아래의 다른 방식으로도 풀 수 있다.
class Solution {
    fun solution(n: Int): Int =  n.toString().toList().sumOf { it.digitToInt() }
}
위와 같이 입력값 n을 string으로 변경하고 list로 바꾼 후에 각 char의 digitToInt로 더해서도 구할 수 있다.
코드는 간결하고 짧지만
시간이 0.01에서 케이스에따라 늘어남을 알 수 있다.
성능은 while을 사용해서 하는게 더 좋다.

4. 세균 증식

class Solution {
    fun solution(n: Int, t: Int): Int {
        var answer: Int = 1*n
        for(i in 1..t) {
        answer *= 2
    }
        return answer
    }
}
class Solution {
    fun solution(n: Int, t: Int): Int  = n shl t
}
shift 연산자를 몰랐다 생각을 안했다. 아직 틀에 박혔다.
비트연산자를 잘 활용해야겠다.
두배만큼 증식한다 = 2를 계속 곱한다. =  2의 t승을 곱한다. ->  shr 연산자
- 왼쪽으로 비트 열 이동 <<  n shl num
- 오른쪽으로 비트 열 이동 >> n shr num 

7 = 0000 0111 > 7 shl 2 = 0001 1100 = 28

7*1 7*2 7*2*2 7*2*2*2

2 = 0000 0010 > 2 shl 10 = 1000 0000 0000 = 2048

 

5. 외계행성의 나이 - 아스키코드

class Solution {
    fun solution(age: Int): String = age.toList().map {
            (it.digitToInt()+97).toChar()
        }.joinToString("")
}
아스키코드 변환을 이용하여 결과를 구하면 된다.
중요한건 아스키코드 값을 알고있냐 없냐.
a = 65 , A = 97, 0 = 48 암기하자.

6. 최댓값 만들기 (2) - max(a: , b: ) 이용

쉬운거지만 Kotlin 에 max() 함수를 이용하면 더욱 간편하게 구할 수 있었다.
max() 함수를 몰라서 두개를 구해가지고 했는데
주어진 intArrayOf 를 sorted() 하고 그중에 맨앞에 두개와 맨뒤에 두개를 곱한 값을 max(a,b) 에 넣으면 둘중에 더 큰값을 반환한다.

 

5. 중복된 문자 제거 - toSet() 이용

 

6. 팩토리얼 - 재귀함수 이용

fun factorial(n: Int): Int = if(n==1) 1 else n*factorial(n-1)

7. 2차원으로 만들기 - chunked(n)

class Solution {
    fun solution(num_list: IntArray, n: Int) = num_list.toList().chunked(n)
}
chunked(n) 을 사용하면 n에 맞게 list를 잘라준다.