두 정수 사이의 합

문제 링크

두 정수 사이의 합

분석

ab사이에 포함된 모든 정수의 합을 구하는 문제입니다.
ab의 값이 같을 경우 0이 아닌 ab의 값을 반환합니다.

해당 문제는 반복문으로 값을 하나씩 더해나가는 방법이 있습니다.
다른 방법으로 해당 문제는 ab 사이의 모든 정수는 등차수열의 형태를 가져 등차수열의 합을 구하는 공식을 사용할 수 있습니다.

반복문의 경우 ab중 어떤게 값이 더 큰지 확인하고, 작은 값에서 시작해서 1씩 커진 값을 더해 총 합을 반환하면 됩니다.

등차수열에 대한 설명은 링크로 대체하겠습니다.
등차수열과 등차수열의 합

이 방법은 반복문을 사용하지 않기 때문에 더 효율적이고 빠릅니다.

등차수열의 공식을 해당 문제에 대입한다면 항의 개수는 $\vert a - b \vert + 1$이고, 첫번째 항은 a 마지막 항은 b가 됩니다.

풀이

반복문을 사용하는 방법은 다음과 같습니다.

long long solution(int a, int b) {
    long long answer = 0;
    int temp;
    
    if (a > b)
    {
        temp = a;
        a = b;
        b = temp;
    }
    
    for (int i = a; i <= b; ++i)
    {
        answer += i;
    }
    
    return answer;
}

if문에서 항상 a에 더 큰 값이 오도록 값을 수정해줍니다.
그 다음 반복문에서 a부터 b까지 값을 1씩 증가시키며 총 합을 구합니다.


등차수열의 합을 구하는 공식을 사용한 방법은 다음과 같습니다.

#include <cstdlib>

long long solution(int a, int b) {
    long long answer = (long long)(a + b) * (std::abs(a - b) + 1) / 2;
    return answer;
}

(std::abs(a - b) + 1)는 항의 개수를 구합니다.
a - b를 하는 경우 b가 더 클 수 있으므로 std::abs함수를 사용해 절대값을 사용합니다.

성능 요약

반복문을 사용한 성능은 다음과 같습니다.

테스트 1 〉 통과 (0.01ms, 4.21MB)
테스트 2 〉 통과 (0.01ms, 4.13MB)
테스트 3 〉 통과 (0.01ms, 4.21MB)
테스트 4 〉 통과 (0.01ms, 4.25MB)
테스트 5 〉 통과 (0.01ms, 4.26MB)
테스트 6 〉 통과 (0.01ms, 4.21MB)
테스트 7 〉 통과 (0.01ms, 4.2MB)
테스트 8 〉 통과 (0.01ms, 4.21MB)
테스트 9 〉 통과 (0.01ms, 4.16MB)
테스트 10 〉 통과 (0.01ms, 4.21MB)
테스트 11 〉 통과 (0.01ms, 4.15MB)
테스트 12 〉 통과 (0.01ms, 4.21MB)
테스트 13 〉 통과 (0.01ms, 4.2MB)
테스트 14 〉 통과 (0.01ms, 4.13MB)
테스트 15 〉 통과 (0.01ms, 4.21MB)
테스트 16 〉 통과 (0.01ms, 4.14MB)


등차수열의 공식을 사용한 방법의 성능은 다음과 같습니다.

테스트 1 〉 통과 (0.01ms, 4.21MB)
테스트 2 〉 통과 (0.01ms, 3.63MB)
테스트 3 〉 통과 (0.01ms, 3.69MB)
테스트 4 〉 통과 (0.01ms, 3.68MB)
테스트 5 〉 통과 (0.01ms, 4.14MB)
테스트 6 〉 통과 (0.01ms, 4.14MB)
테스트 7 〉 통과 (0.01ms, 4.14MB)
테스트 8 〉 통과 (0.01ms, 4.21MB)
테스트 9 〉 통과 (0.01ms, 4.13MB)
테스트 10 〉 통과 (0.01ms, 4.17MB)
테스트 11 〉 통과 (0.01ms, 4.21MB)
테스트 12 〉 통과 (0.01ms, 4.02MB)
테스트 13 〉 통과 (0.01ms, 4.06MB)
테스트 14 〉 통과 (0.01ms, 4.02MB)
테스트 15 〉 통과 (0.01ms, 3.6MB)
테스트 16 〉 통과 (0.01ms, 4.14MB)

Programmers 카테고리 내 다른 글 보러가기

댓글남기기