[프로그래머스][C++] 두 정수 사이의 합
두 정수 사이의 합
문제 링크
분석
a
와 b
사이에 포함된 모든 정수의 합을 구하는 문제입니다.
a
와 b
의 값이 같을 경우 0이 아닌 a
나 b
의 값을 반환합니다.
해당 문제는 반복문으로 값을 하나씩 더해나가는 방법이 있습니다.
다른 방법으로 해당 문제는 a
와 b
사이의 모든 정수는 등차수열의 형태를 가져 등차수열의 합을 구하는 공식을 사용할 수 있습니다.
반복문의 경우 a
와 b
중 어떤게 값이 더 큰지 확인하고, 작은 값에서 시작해서 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)
댓글남기기