프로그래머스 입문 알고리즘 문제 정리 - 코틀린(Kotlin)
2023. 1. 21. 00:24ㆍ알고리즘/문제
모든 문제의 출처는 프로그래머스에 있습니다.
https://school.programmers.co.kr/learn/challenges/beginner?order=acceptance_desc&page=1
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를 잘라준다.
'알고리즘 > 문제' 카테고리의 다른 글
프로그래머스 알고리즘 Level1 코틀린 명예의 전당 (0) | 2023.01.22 |
---|---|
프로그래머스 알고리즘 Level 1 코틀린 가장 가까운 글자 (0) | 2023.01.22 |
프로그래머스 알고리즘 Level1 코틀린 크기가 작은 부분문자열 (0) | 2023.01.21 |
프로그래머스 알고리즘 Level1 코틀린 2023 KAKAO BLIND RECRUITMENT 개인정보 수집 유효 기간 (0) | 2023.01.21 |
알고리즘 입문 문제 1일차 & 2일차 (0) | 2023.01.02 |