-
8. 약수의 합코딩 테스트/Level 1 2019. 10. 6. 22:01반응형
https://programmers.co.kr/learn/courses/30/lessons/12928
파이썬
def solution(n): answer = 0 for i in range(1, n + 1): if not n % i: answer += i return answer
for문을 리스트 컴프리헨션으로 바꾸면 파이써닉해 보이죠?
def solution(n): return sum([i for i in range(1, n + 1) if not n % i])
재사용되지 않는 리스트 컴프리헨션은 제너레이터 익스프레션으로 바꿔줄 수 있어요.
좀 더 파이써닉하죠.def solution(n): return sum(i for i in range(1, n + 1) if not n % i)
절반만 검사하면 O(n/2)가 됩니다.
def solution(n): return sum(i for i in range(1, n // 2 + 1) if not n % i) + n
제곱근까지만...
def solution(n): return sum((i + temp) if i != (temp := n // i) else i for i in range(1, int(n ** .5) + 1) if not n % i)
자바스크립트
function solution(n) { let sumFactor = 0; for (let i = 1; i <= n / 2; i++) { if (n % i == 0) { sumFactor += i; } } return n + sumFactor; }
재귀로 풀어봅니다.
자바스크립트에서도 문장의 마지막 ';'을 생략할 수 있습니다. (구분이 꼭 필요한 경우는 제외)
function solution(n) { return n + sumFactor(n, 0, 0) } function sumFactor(n, count, total) { if (count > n / 2) { return total } if (!(n % count)) { total += count } return sumFactor(n, count + 1, total) }
삼항 연산자와 재귀를 이용하면 위 풀이를 한 문장으로 줄일 수도 있습니다.
자바
class Solution { public int solution(int n) { int answer = 0; for (int i = 1; i <= n / 2; i++) { if (n % i == 0) { answer += i; } } return n + answer; } }
고
func solution(n int) (result int) { for i := 1; i <= n/2; i++ { if n%i == 0 { result += i } } result += n return }
func solution(n int) int { result, last := 0, n/2 for i := 1; i <= last; i++ { if n%i == 0 { result += i } } return result + n }
코틀린
함수형으로 풀어보았습니다.
class Solution { fun solution(n: Int) = if (n <= 1) n else n + IntArray(n / 2) { it + 1 }.filter { n % it == 0 }.reduce { a, b -> a + b } }
작성한 제가 봐도 가독성이 좋지 않습니다. ㅠ,.ㅠ
class Solution { fun solution(n: Int) = if (n <= 1) n else n + IntArray(n / 2) { it + 1 } .filter { n % it == 0 } .reduce { a, b -> a + b } }
좀 나아진 것 같나요?
C#
public class Solution { public int solution(int n) { int answer = 0; for (int i = 1; i <= n/2; i++) if (n % i == 0) answer += i; return answer + n; } }
RUST
fn solution(n: i32) -> i32 { let mut result = 0; for i in 1..=n { if n % i == 0 { result += i; } } result } fn main() { println!("{}", solution(4)); }
반응형