ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 8. 약수의 합
    코딩 테스트/Level 1 2019. 10. 6. 22:01
    반응형

    https://programmers.co.kr/learn/courses/30/lessons/12928

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

    파이썬

    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));
    }
    반응형
Designed by Tistory.