두 정수 사이의 합 그리고 테스트케이스 4번 7번 9번

https://programmers.co.kr/learn/courses/30/lessons/12912?language=javascript

 

코딩테스트 연습 - 두 정수 사이의 합

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다. 제한 조건 a와 b가 같은 경우

programmers.co.kr

C++ 만 테스트 케이스 통과 가능하다. 4번, 7번, 9번

풀이 방법은 3가지 정도가 된다.

1. 모든 값 더하기

function solution(a, b) {
    if(a==b) return a;
    if(b < a){
        let tmp = a;
        a = b;
        b = tmp;
    }
    let total = 0;

    for(let i = a; i <= b; i++) total += i;
    return total;
}

2. 절반으로 나누어서 더하기

function solution(a, b) {
    if(a==b) return a;
    if(b < a){
        let tmp = a;
        a = b;
        b = tmp;
    }
    let total = 0;
    while(a<=b){
        if(a==b) total += a;
        else total += a+b;
        a++;
        b--;
    }  
    return total;
}

3. 등차 수열의 합

- 갯수 * (첫째항 + 끝항) / 2

음수가 있음으로 다음과 같은 부분을 주의 필요함

- 음수시작, 양수 종료

- 음수 시작 , 음수 종료

function solution(a, b) {
    if(a==0 && b == 0) return 0;
    var answer = 0;
    if(b < a){ //a가 작은거, b가 큰거
        let tmp = a;
        a = b;
        b = tmp;
    }

    return sum(a,b);

    function sum(low,high){
        let lowSum = 0;
        let highSum = 0;
        let positive = true;

        if(low < 0 && high < 0) {
            low = -1 * low;
            high = -1 * high;
            let tmp = low;
            low = high;
            high = tmp;

            positive = false;
        }
        low = low - 1;
        lowSum = low*(low+1)/2;
        highSum = high*(high+1)/2;

        return positive ? highSum - lowSum : -(highSum - lowSum);
    }
}

(상기는 0을 제외하고 low, high sum을 구해서 빼는 방식으로 처리 했음)

상기 코드를 최적화 하면 아래와 같이 고칠 수 있다.

- ((a~b까지의 갯수) * ((첫항 + 마지막항)) / 2

아래 식으로 최적화 가능하다.

(프로그래머스에 다른사람 풀이를 보고 쓴것이다)

(a+b) * (Math.abs(b-a)+1)/2;

- (Math.abs(b-a)+1) : 이게 a에서 b까지의 갯수 구하는 공식 (음수일 경우도 작동)

- (a+b) : 첫항 + 마지막 항

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

 

728x90
반응형

'Problem Solving' 카테고리의 다른 글

문자열 내 p와 y의 개수  (0) 2020.09.03
문자열 내 마음대로 정렬하기  (0) 2020.09.03
나누어 떨어지는 숫자  (0) 2020.09.03
같은 숫자는 싫어  (0) 2020.09.03
가운데 글자 가져오기  (0) 2020.09.02