ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 9. 두 정수 사이의 합
    코딩 테스트/Level 1 2019. 10. 7. 23:35
    반응형

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

     

    프로그래머스

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

    programmers.co.kr

     

    파이썬

    3항 연산자를 이용했습니다.
    가독성이 별로.. 

    def solution(a, b):
        return sum(range(a, b + 1)) if (a < b) else sum(range(b, a + 1))
    테스트 1 〉	통과 (0.05ms, 10.7MB)
    테스트 2 〉	통과 (0.04ms, 10.7MB)
    테스트 3 〉	통과 (0.04ms, 10.8MB)
    테스트 4 〉	통과 (307.00ms, 10.6MB)
    테스트 5 〉	통과 (209.68ms, 10.7MB)
    테스트 6 〉	통과 (164.13ms, 10.7MB)
    테스트 7 〉	통과 (89.08ms, 10.7MB)
    테스트 8 〉	통과 (140.28ms, 10.7MB)
    테스트 9 〉	통과 (110.46ms, 10.7MB)
    테스트 10 〉	통과 (22.00ms, 10.8MB)
    테스트 11 〉	통과 (0.15ms, 10.7MB)
    테스트 12 〉	통과 (0.27ms, 10.6MB)
    테스트 13 〉	통과 (0.13ms, 10.7MB)
    테스트 14 〉	통과 (0.04ms, 10.8MB)
    테스트 15 〉	통과 (0.06ms, 10.8MB)
    테스트 16 〉	통과 (0.09ms, 10.7MB)

    내장함수 min, max를 이용했습니다.
    가독성 개선!

    def solution(a, b):
        return sum(range(min(a, b), max(a, b) + 1))
    테스트 1 〉	통과 (0.07ms, 10.7MB)
    테스트 2 〉	통과 (0.04ms, 10.7MB)
    테스트 3 〉	통과 (0.04ms, 10.7MB)
    테스트 4 〉	통과 (307.54ms, 10.7MB)
    테스트 5 〉	통과 (210.52ms, 10.8MB)
    테스트 6 〉	통과 (393.65ms, 10.7MB)
    테스트 7 〉	통과 (89.14ms, 10.8MB)
    테스트 8 〉	통과 (139.95ms, 10.7MB)
    테스트 9 〉	통과 (109.55ms, 10.7MB)
    테스트 10 〉	통과 (23.47ms, 10.7MB)
    테스트 11 〉	통과 (0.12ms, 10.7MB)
    테스트 12 〉	통과 (0.27ms, 10.7MB)
    테스트 13 〉	통과 (0.14ms, 10.7MB)
    테스트 14 〉	통과 (0.04ms, 10.7MB)
    테스트 15 〉	통과 (0.06ms, 10.6MB)
    테스트 16 〉	통과 (0.09ms, 10.7MB)

    등차수열의 합공식을 이용해 봅시다. 
    최고죠~!

    def solution(a, b):
        return (a + b) * (abs(b - a) + 1) / 2
    테스트 1 〉	통과 (0.04ms, 10.7MB)
    테스트 2 〉	통과 (0.04ms, 10.6MB)
    테스트 3 〉	통과 (0.04ms, 10.7MB)
    테스트 4 〉	통과 (0.05ms, 10.8MB)
    테스트 5 〉	통과 (0.05ms, 10.7MB)
    테스트 6 〉	통과 (0.05ms, 10.7MB)
    테스트 7 〉	통과 (0.05ms, 10.7MB)
    테스트 8 〉	통과 (0.05ms, 10.6MB)
    테스트 9 〉	통과 (0.05ms, 10.6MB)
    테스트 10 〉	통과 (0.05ms, 10.7MB)
    테스트 11 〉	통과 (0.04ms, 10.7MB)
    테스트 12 〉	통과 (0.04ms, 10.7MB)
    테스트 13 〉	통과 (0.04ms, 10.7MB)
    테스트 14 〉	통과 (0.04ms, 10.7MB)
    테스트 15 〉	통과 (0.04ms, 10.7MB)
    테스트 16 〉	통과 (0.04ms, 10.7MB)

     

    자바스크립트

    function solution(a, b) {
        return (a+b)*(Math.abs(b-a)+1)/2;
    }

     

    자바

    형의 범위를 먼저 파악해야 합니다. 

    자바의 int의 범위는 -2,147,483,648 ~ 2,147,483,647입니다. 

    문제에서 제시한 a와 b는 -10,000,000 이상 10,000,000 이하 정수입니다.

    a, b를 더하거나 빼도 모두 int의 범위 안에 있네요. 

     

    미리 형 변환을 하면 범위에 대한 걱정을 덜해도 됩니다. 

    class Solution {
        public long solution(int a, int b) {
            long al = a;
            long bl = b;
            return (al + bl) * (Math.abs(al - bl) + 1) / 2;
        }
    }

    하지만 이게 더 깔끔합니다. 

    class Solution {
        public long solution(int a, int b) {
            return (long)(a + b) * (Math.abs(a - b) + 1) / 2;
        }
    }

    (암시적으로 두는 것보다) 명시적으로 다 붙여주는 것도 좋습니다. 

    파이썬에는 '명시적인 것이 암시적인 것보다 낫다.'는 철학이 있습니다. 자바에서 파이썬 이야기하는 게 애매합니다만...

    class Solution {
        public long solution(int a, int b) {
            return (long)(a + b) * (long)(Math.abs(a - b) + 1) / 2;
        }
    }

     

    고니까 고전적으로 풀어봤습니다.

    func solution(a, b int) (sum int64) {
        if a > b {
            temp := a
            a = b
            b = temp
        }
        for i := a; i <= b; i++ {
            sum += int64(i)
        }
        return
    }

    a, b = b, a 와 등차수열 합공식을 이용해 봅시다. 

    func solution(a, b int) int64 {
    	if a > b {
    		a, b = b, a
    	}
    	return int64((a+b)*(b-a+1)/2)
    }

     

    코틀린

    형의 범위를 확인하지 않고 toLong()으로 도배를 해서 풀었습니다.

    블로그에 올리려니 꽤 거슬립니다.

    import kotlin.math.abs
    
    class Solution {
        fun solution(a: Int, b: Int) = (a.toLong() + b.toLong()) * (abs(a.toLong() - b.toLong()) + 1) / 2
    }

    깔끔하네요. 

    import kotlin.math.abs
    
    class Solution {
        fun solution(a: Int, b: Int) = (a + b).toLong() * (abs(a - b).toLong() + 1) / 2
    }

    암시적 형변환을 이용한다면 이런 방법도 있습니다. 

    import kotlin.math.abs
    
    class Solution {
        fun solution(a: Int, b: Int) = (a + b) * (abs(a - b) + 1L) / 2
    }

     

    C#

    using System; 
    public class Solution
    {
        public long solution(int a, int b) =>
            (long)(a + b) * (Math.Abs(b - a) + 1) / 2;
    }

     

    RUST

    fn solution(a: i32, b: i32) -> i64 {
        let a = a as i64;
        let b = b as i64;
        (a + b) * ((b - a).abs() + 1) / 2
    }
    
    fn main() {
        println!("{}", solution(10, 1));
    }
    반응형
Designed by Tistory.