오늘도 알고리즘 문제 중에서 한가지를 가져와봤다.
문제 설명
두 정수 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의 대소관계는 정해져있지 않습니다
처음 생각했던 방법은 다음과 같다.
public class Solution {
public long solution(int a, int b) {
long answer = 0;
int count = b - a + 1;
answer = (long)(a + b) * count / 2;
return answer;
}
}
근데 문제는 b보다 a가 작은 경우는 이상없이 풀렸지만 a가 b보다 더 큰경우에는 b-a가 음수로 나와서 a와 b사이의 정수 개수를 셀 수 없었다.
그래서 절댓값을 구해주는 메서드를 사용해보려고 했다.
바로 Math.Abs이다.
https://learn.microsoft.com/ko-kr/dotnet/api/system.math.abs?view=net-7.0
Math.Abs 메서드 (System)
지정된 숫자의 절대 값을 반환합니다.
learn.microsoft.com
Math.Abs(value)를 사용하면 value값의 절댓값을 반환하게 된다.
따라서 이 메서드를 사용하면 위의 코드에서 b-a의 절댓값을 구할 수 있다.
public class Solution {
public long solution(int a, int b) {
long answer = 0;
int count = Math.Abs(a - b) + 1;
answer = (long)(a + b) * count / 2;
return answer;
}
}
하지만 이렇게 코드를 작성하면?
오류가 발생한다.
왜 그런지 살펴봤더니 using System;이 빠져있어서 그렇다고 한다.
추가했더니 잘 되는 모습이다.
테스트 1 | |
입력값 〉 | 3, 5 |
기댓값 〉 | 12 |
실행 결과 〉 | 테스트를 통과하였습니다. |
테스트 2 | |
입력값 〉 | 3, 3 |
기댓값 〉 | 3 |
실행 결과 〉 | 테스트를 통과하였습니다. |
테스트 3 | |
입력값 〉 | 5, 3 |
기댓값 〉 | 12 |
실행 결과 〉 | 테스트를 통과하였습니다. |
테스트 4 | |
입력값 〉 | 8, 11 |
기댓값 〉 | 38 |
실행 결과 〉 | 테스트를 통과하였습니다. |
테스트 5 | |
입력값 〉 | 7, 10 |
기댓값 〉 | 34 |
실행 결과 〉 | 테스트를 통과하였습니다. |
그러면 다른 방법은 없는가?
절댓값을 구하지 않고, a와 b의 크기를 비교해서 굳이 절댓값을 구할 필요가 없게 만들면 되는것 아닐까?
그래서 3항연산자를 사용해서 코드를 만들어보았다.
public class Solution {
public long solution(int a, int b) {
long answer = 0;
int start = (a < b) ? a : b;
int end = (a < b) ? b : a;
int count = end - start + 1;
answer = (long)(start + end) * count / 2;
return answer;
}
이렇게 만들면 작은값을 start에, 큰 값을 end에 넣어서 굳이 절댓값을 안구해도 문제를 풀 수 있다.
'TIL' 카테고리의 다른 글
2023/11/23 TIL (0) | 2023.11.23 |
---|---|
2023/11/22 TIL (1) | 2023.11.22 |
2023/11/20 TIL (0) | 2023.11.20 |
2023/11/17 TIL (0) | 2023.11.17 |
2023/11/16 TIL (0) | 2023.11.16 |