상세 컨텐츠

본문 제목

[Java] 두 정수 사이의 합

코딩뿌시기(연습)

by thisnorm 2025. 1. 16. 18:39

본문

 

문제 설명

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.

예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

 

 

제한 사항

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

 

 

 

 

입출력 예

 

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

 

 


이번 문제는 제한 조건만 봤을 때 내장 함수를 쓰거나 하지 않고

쭉 풀어서 쓴다면 바로 답이 나오는 경우라 일단 떠오르는대로 적어보았다.

 

class practice0116 {  
    public long solution(int a, int b) {  
        long answer = 0;  
        // a, b 값 범위 검사  
        if (-10000000 <= a && a <= 10000000  
                && -10000000 <= b && b <= 10000000) {  
            // a > b  
            if (a > b) {  
                for (int i = b; i <= a; i++) {  
                    answer += i;  
                }  
            }  
            // a < b  
            else if (a < b) {  
                for (int i = a; i <= b; i++) {  
                    answer += i;  
                }  
            }  
            // a == b  
            else {  
                answer = a;  
            }  
        }  
        return answer;  
    }  
    public static void main(String[] args) {  
        practice0116 solution = new practice0116();  
        System.out.println(solution.solution(3, 5));  // Expected output: 12  
    }  
}
 

a와 b 의 대소를 비교할 수 있는 내장함수를 쓴다면 start, end 변수 값에 넣고

if문 없이 코드를 더 효율적으로 작성할 수 있다.

그래서 찾아보니 Math.min(a, b) / Math.max(a, b)가 있었다.

 

 

코드를 다시 작성해보면

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

    // a, b 값 범위 검사  
    if (-10000000 <= a && a <= 10000000  
            && -10000000 <= b && b <= 10000000) {  
        
        // Math 클래스를 사용해 a와 b의 대소 관계를 간단히 처리  
        int start = Math.min(a, b);  
        int end = Math.max(a, b);  

        for (int i = start; i <= end; i++) {  
            answer += i;  
        }  
    }  

    return answer;  
}  

public static void main(String[] args) {  
    Practice0116 solution = new Practice0116();  
    System.out.println(solution.solution(3, 5));  // Expected output: 12  
}
 

 

 

그리고 좋아요 수가 가장 많은 사람의 코딩을 보았다.

class Solution {

    public long solution(int a, int b) {
        return sumAtoB(Math.min(a, b), Math.max(b, a));
    }

    private long sumAtoB(long a, long b) {
        return (b - a + 1) * (a + b) / 2;
    }
}
 

등차 수열의 합을 이용하여 코딩을 하였다.

 

 

시간 복잡도를 비교해보았을 때 내 알고리즘은 O(n)의 시간 복잡도를 가지고,

다른 사람꺼는 O(1)의 시간 복잡도를 가졌다.

또한 다른 사람의 알고리즘이 큰 입력 범위에서도 일관되게 빠르게 작업을 수행한다.

 

 

관련글 더보기