Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 큐 자바 코드
- 스택 큐 차이
- 안드로이드 레트로핏 사용법
- 2022 플러터 안드로이드 스튜디오
- 안드로이드 라이선스
- Rxjava Observable
- android retrofit login
- 안드로이드 유닛테스트란
- 안드로이드 os 구조
- 플러터 설치 2022
- rxjava disposable
- android ar 개발
- 안드로이드 라이선스 종류
- 안드로이드 유닛 테스트
- rxjava cold observable
- 멤버변수
- 클래스
- 서비스 쓰레드 차이
- jvm 작동 원리
- rxjava hot observable
- ar vr 차이
- jvm이란
- 스택 자바 코드
- 자바 다형성
- ANR이란
- 안드로이드 레트로핏 crud
- 서비스 vs 쓰레드
- 2022 플러터 설치
- 안드로이드 유닛 테스트 예시
- 객체
Archives
- Today
- Total
나만을 위한 블로그
[Algorithm] 프로그래머스 - 팩토리얼 (Kotlin) 본문
728x90
반응형
i 팩토리얼(i!)은 1부터 i까지 정수의 곱을 의미한다. 5! = 5 * 4 * 3 * 2 * 1이다
정수 n이 주어질 때 조건을 만족하는 가장 큰 정수 i를 리턴하는 solution()을 완성하라
처음 풀 때에는 손도 대지 못해서 포기했던 문제인데 제한사항과 입출력 예를 보니 그제서야 어떻게 하면 좋을지 떠올랐다. 아쉽지만 이미 다른 사람의 풀이를 봤으니 어쩔 수 없다.
class Solution {
fun solution(n: Int): Int {
var answer = 0
for (i in 10 downTo 1) {
if (factorial(i) <= n) {
answer = i
break
}
}
return answer
}
private fun factorial(n: Int): Int {
return if (n == 1) 1
else n * factorial(n - 1)
}
}
다른 풀이를 확인한 결과 위의 코드를 더 짧게 작성한다면 아래와 같이 쓸 수 있다.
class Solution {
fun solution(n: Int) = (2..n).find { n < factorial(it) }?.dec() ?: n
private tailrec fun factorial(n: Int, run: Int = 1): Int = if (n == 1) run else factorial(n - 1, run * n)
}
tailrec 키워드는 꼬리재귀(tail recursive)란 뜻으로, 추가 연산 없이 자기 스스로 재귀적으로 호출하다가 어떤 값을 리턴하고 끝나는 함수를 말한다. 이걸 써서 좋은 점은 재귀함수가 호출되면서 소비되는 스택을 아낄 수 있다는데 와닿지는 않는다. 아래는 참고한 블로그다.
https://codechacha.com/ko/kotlin-tailrect/
Kotlin - tailrec(꼬리재귀)에 대해서 알아보기
tailrec은 꼬리재귀(tail recursive)라는 의미로, 추가 연산 없이 재귀적으로 호출하다가 어떤 값을 리턴하는 함수를 의미합니다. 재귀함수를 루프로 변경하면 좋은 점은 재귀로 인해 소비되는 스택을
codechacha.com
그리고 dec()의 설명과 원형은 아래와 같다.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/dec.html
dec - Kotlin Programming Language
kotlinlang.org
1씩 감소한 값을 반환한다
public operator fun dec(): Int
설명만 써놓기는 애매했는지 공식 홈페이지에 예제 스니펫이 있다.
val a = 3
val b = a.dec()
println(a) // 3
println(b) // 2
var x = 3
val y = x--
println(x) // 2
println(y) // 3
val z = --x
println(x) // 1
println(z) // 1
반응형
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
[Algorithm] 프로그래머스 - 문자열 정렬하기 (1) (Kotlin) (0) | 2022.12.29 |
---|---|
[Algorithm] 프로그래머스 - 모음 제거 (Kotlin) (0) | 2022.12.29 |
[Algorithm] 프로그래머스 - 최댓값 만들기(1) (Kotlin) (0) | 2022.12.28 |
[Algorithm] 프로그래머스 - 합성수 찾기 (Kotlin) (0) | 2022.12.28 |
[Algorithm] 프로그래머스 - 주사위의 개수 (Kotlin) (0) | 2022.12.28 |
Comments