두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
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)의 시간 복잡도를 가졌다.
또한 다른 사람의 알고리즘이 큰 입력 범위에서도 일관되게 빠르게 작업을 수행한다.
[Java] 나누어 떨어지는 숫자 배열 (3) | 2025.01.20 |
---|---|
[Java] 서울에서 김서방 찾기 (1) | 2025.01.20 |
[Java] 자리수의 합으로 하샤드 수 판별하기 (2) | 2025.01.15 |
[Java] 정수 내림차순으로 배치하기 (1) | 2025.01.14 |
[Java] 문자열을 정수로 바꾸기 (0) | 2025.01.13 |