본문 바로가기
Language/Java

[Programmers | Java | 연습문제 풀이] 두 정수 사이의 합 - Solution with Loop 또는 Math

by ㅇ달빛천사ㅇ 2024. 6. 17.
728x90

KDT 실무형 스프링 백엔드 엔지니어 양성과정 6기 | Algorithm CODEKATA

두 정수 사이의 합

🏷 관련 주제 : Loop Math



문제 설명

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


제한 조건

  • ab가 같은 경우는 둘 중 아무 수나 리턴하세요.
  • ab는 -10,000,000 이상 10,000,000 이하인 정수입니다.
  • ab의 대소관계는 정해져있지 않습니다.

입출력 예

a b return
3 5 12
3 3 3
5 3 12

✔ Solution with Loop

class Solution {
    public long solution(int a, int b) {
        long answer = 0;

        for (int n = Math.min(a, b); n <= Math.max(a, b); n++) {
            answer += n;
        }

        return answer;
    }
}
채점 결과


✔ Solution with 등차수열의 합 공식

class Solution {
    public long solution(int a, int b) {
        int n = (b > a) ? b - a : a - b;
        long answer = (long) (a + b) * (n + 1) / 2;

        return answer;
    }
}
채점 결과


💥 오늘 만난 문제 & 나의 시도 💦 & 해결 방법 👍

📌 오늘 만난 문제 : 매개변수로 두 정수 a, b가 주어질 때, ab 사이에 속한 모든 정수의 합을 반환하시오.


1. 등차수열의 합 공식을 이용하기

1부터 n까지의 연속하는 n개의 자연수의 합은


$1 + 2 + 3 + 4 + \cdots + (n - 2) + (n - 1) + n$
$= \left\{1 + n\right\} + \left\{2 + (n - 1)\right\} +\left\{3 + (n - 2)\right\} + \cdots$
$= (n + 1) + (n + 1) + (n + 1) + \cdots$
$= \frac{n \cdot (n + 1)}{2}$

이 공식을 응용하여 a부터 b까지 연속하는 자연수의 합을 구하면(단, a ≤ b라고 하자.)


아래의 식은 a부터 b까지 연속한 자연수의 합이라는 의미로 (a + 1), (b - 1)이 들어가 있는데
ab의 값에 따라 (a + 1)또는 (b - 1)이 존재하지 않을 수도 있다.


$a + (a + 1) + \cdots + (b - 1) + b$
$\require{cancel}= \color{green} {\left\{\cancel{1} + \cancel{2} + \cancel{3} + \cdots + \cancel{(a - 1)} + a + \cdots + (b - 1) + b\right\}}$
$\require{cancel}\color{orange} {\quad - \left\{\cancel{1} + \cancel{2} + \cancel{3} + \cdots + \cancel{(a - 1)}\right\}}$
$= \color{green} {\frac{b \cdot (b + 1)}{2}} - \color{orange} {\frac{(a - 1) \cdot \left\{(a - 1) + 1\right\}}{2}}$
$= \color{green} {\frac{b \cdot (b + 1)}{2}} - \color{orange} {\frac{(a - 1) \cdot a}{2}}$
$= \frac{b \cdot(b + 1) - a \cdot (a - 1)}{2}$
$= \frac{(b^{2} + b) - (a^{2} - a)}{2}$
$= \frac{b^{2} + b - a^{2} + a}{2}$
$= \frac{(b^{2} - a^{2}) + (b - a)}{2}$
$= \frac{(b + a)\cdot(b - a)}{2}$


즉, a부터 b까지의 합은 (a <= b일 때,) (b - a) * (b + a) / 2로 구할 수 있다.


위의 공식을 활용하여 a부터 b까지의 자연수의 합을 구해보자.

매개변수로 받은 a, b는 대소관계가 명확하지 않으므로

1) 삼항연산자를 이용하여 큰 수에서 작은 수를 뺀 값을 int n에 할당하자.

int n = (b > a) ? b - a : a - b;

2) 등차수열의 합 공식을 활용하여 a부터 b까지의 자연수의 합을 long answer에 할당하자.

long answer = (long) (a + b) * (n + 1) / 2;

3) answer에 할당된 값을 반환하자.

return answer;


2. 반복문을 이용하기

반복문을 돌리는 변수의 초기값을 ab 중 작은 자연수, 조건을 ab중 큰 자연수 이하로 주고 변수의 값을 1씩 증가시키며 반복문을 돌면서 자연수들을 더해 문제를 해결해 보자.

1) 반환할 값을 할당할 변수 long answer 초기화

long answer = 0;

2) 반복문을 돌면서 ab 사이의 자연수를 answer에 더해주자.

반복문의 변수의 초기값은 ab중 작은 값으로 주기위해 Math.min(a, b)를 이용
반복문의 조건은 ab 중 큰 값 이하가 되어야 하므로 Math.max(a, b)를 이용


for (int n = Math.min(a, b); n <= Math.max(a, b); n++) {
       answer += n;
  }

3) answer에 할당된 값 반환

return answer;

💬 무엇을 새롭게 알았는지

수학 공식을 이용해 문제를 풀어보았다.
반복문을 돌리는 변수의 초기값을 0이 아닌 정수로 주고 반복문을 돌려 보았다.



📚 참고자료(References)

728x90