ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 23. 콜라츠 추측
    코딩 테스트/Level 1 2019. 10. 21. 23:06
    반응형

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

     

    파이썬

    def solution(num):
        count  = 0
        while count < 500 and num > 1:
            count += 1
            if num % 2:
                num = num * 3 + 1
            else:
                num = num / 2
        return -1 if count == 500 else count

    3항 연산자를 쓰면.. 

    def solution(num):
        count  = 0
        while count < 500 and num > 1:
            count += 1
            num = (num * 3 + 1) if (num % 2) else (num / 2)
        return -1 if (count == 500) else count
    테스트 1 〉	통과 (0.07ms, 10.7MB)
    테스트 2 〉	통과 (0.09ms, 10.7MB)
    테스트 3 〉	통과 (0.08ms, 10.6MB)
    테스트 4 〉	통과 (0.06ms, 10.7MB)
    테스트 5 〉	통과 (0.15ms, 10.6MB)
    테스트 6 〉	통과 (0.06ms, 10.7MB)
    테스트 7 〉	통과 (0.16ms, 10.7MB)
    테스트 8 〉	통과 (0.06ms, 10.7MB)
    테스트 9 〉	통과 (0.06ms, 10.7MB)
    테스트 10 〉	통과 (0.15ms, 10.7MB)
    테스트 11 〉	통과 (0.15ms, 10.7MB)
    테스트 12 〉	통과 (0.06ms, 10.7MB)
    테스트 13 〉	통과 (0.03ms, 10.7MB)
    테스트 14 〉	통과 (0.07ms, 10.7MB)
    테스트 15 〉	통과 (0.07ms, 10.7MB)
    테스트 16 〉	통과 (0.07ms, 10.8MB)

    짝수를 2로 나누는 부분은 소수점 이하가 나올 이유가 없다.
    이럴 땐 정수부분까지만 계산하는 // 를 사용하면 속도가 빨라진다.

    def solution(num):
        count  = 0
        while count < 500 and num > 1:
            count += 1
            num = (num * 3 + 1) if (num % 2) else (num // 2)
        return -1 if (count == 500) else count
    테스트 1 〉	통과 (0.05ms, 10.7MB)
    테스트 2 〉	통과 (0.06ms, 10.8MB)
    테스트 3 〉	통과 (0.05ms, 10.7MB)
    테스트 4 〉	통과 (0.05ms, 10.7MB)
    테스트 5 〉	통과 (0.10ms, 10.7MB)
    테스트 6 〉	통과 (0.05ms, 10.8MB)
    테스트 7 〉	통과 (0.10ms, 10.7MB)
    테스트 8 〉	통과 (0.06ms, 10.7MB)
    테스트 9 〉	통과 (0.04ms, 10.7MB)
    테스트 10 〉	통과 (0.11ms, 10.7MB)
    테스트 11 〉	통과 (0.09ms, 10.7MB)
    테스트 12 〉	통과 (0.04ms, 10.6MB)
    테스트 13 〉	통과 (0.03ms, 10.7MB)
    테스트 14 〉	통과 (0.05ms, 10.6MB)
    테스트 15 〉	통과 (0.05ms, 10.8MB)
    테스트 16 〉	통과 (0.04ms, 10.7MB)

     

    자바스크립트

    function solution(num) {
        let count = 0
        while (count < 500 && num > 1) {
            count++
            num = (num % 2) ? (num * 3 + 1) : (num / 2)
        }
        return (count == 500) ? -1 : count
    }

     

    자바

    while만 쓰기 심심해서 for로... 

    class Solution {
        public int solution(int num) {
            long longNum = num;
            int count = 0;
            for (; count < 500 && longNum > 1; count++) {
                longNum = (longNum % 2 == 0) ? longNum / 2 : longNum * 3 + 1;
            }
            return (count == 500) ? -1 : count;
        }
    }

     

    고에선 3항 연산자가 없죠... 

    func solution(num int) (count int) {
        for count = 0; num > 1 && count < 500; count++ {
            if num%2 == 0 {
                num /= 2
            } else {
                num = num*3 + 1
            }
        }
        if count == 500 {
            count = -1
        }
        return
    }

     

    코틀린

    class Solution {
        fun solution(num: Int): Int {
            var longNum = num.toLong()
            var count = 0
            while (count < 500 && longNum > 1) {
                count++
                longNum = if (longNum % 2 == 0L) longNum / 2 else longNum * 3 + 1
            }
            return if (count == 500) -1 else count
        }
    }

     

    C#

    public class Solution
    {
        public int solution(int num)
        {
            int i = 0;
            long longNum = num;
            for (; i < 500 && longNum != 1; i++)
                longNum = (longNum % 2 == 0) ? longNum / 2 : longNum * 3 + 1;
            return (longNum == 1) ? i : -1;
        }
    }

     

    반응형
Designed by Tistory.