안녕하세요! 피피아노입니다 🎵
이번 포스팅에서는 프로그래머스 문제인 두 정수 사이의 합 문제 풀이 방법에 대해서 한번 정리를 해보려고 합니다.
그럼 바로 시작하겠습니다.
문제 설명
먼저 문제부터 살펴 보겠습니다.
두 정수 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 사이에 포함된 모든 정수의 합을 계산하는 문제입니다.
문제 풀기
문제를 해결하기 위해 몇 가지 논리적인 단계가 필요합니다. 저는 크게 3가지로 나누었는데 더 좋은 방법이 있으면 댓글로 공유 부탁드립니다!
먼저 저는 입력값을 정렬했습니다. 이게 무슨 말이냐?
우선 정수가 a, b 2가지가 있는데 이 중에서 작은 값은 minValue, 큰 값을 maxValue로 지정해서 변수를 선언해주었습니다.
let minValue = min(a, b)
let maxValue = max(a, b)
그리고 등차수열의 합 공식을 활용해주었습니다. 등차수열의 합 공식을 사용한 이유는 a부터 b까지 사이의 수를 더하는 문제이니 당연히 a와 b 사이의 수가 1씩 증가하면서 나타날 것이기 때문에 수열의 특징이 나타나게 되므로 이 공식을 사용해줬습니다.
등차수열의 합 공식은
- S: 수열의 합
- n: 수열의 항의 개수
- a: 수열의 첫 번째 항
- l: 수열의 마지막 항
이렇게 나타낼 수 있습니다.
등차수열의 합 공식을 이용하려면 수열의 항의 개수를 알고 있어야 하기 때문에 수열의 항의 개수 구하는 코드도 작성해주었습니다.
let n = maxValue - minValue + 1
이제 준비는 다 끝났으니 등차수열의 합 공식을 코드로 구현해보겠습니다.
let sum = n * (minValue + maxValue) / 2
등차수열의 합 공식을 코드로 구현하게 되면 위와 같이 나타낼 수 있습니다.
전체코드
func solution(_ a:Int, _ b:Int) -> Int64 {
let minValue = min(a, b)
let maxValue = max(a, b)
let n = maxValue - minValue + 1
let sum = n * (minValue + maxValue) / 2
return Int64(sum)
}
여기서 주의할 점(?)은 solution 함수의 리턴값이 Int64이기 때문에 이와 맞춰줘야 하므로 그냥 return sum이라고 적으면 안 되고 위 코드처럼 return Int64(sum)으로 작성해주어야 합니다.
(물론 리턴값이 그냥 Int라면 return sum도 가능!!)
시간 복잡도 분석
위 코드는 반복문 없이 수열의 합 공식을 사용했기 때문에 시간 복잡도는 O(1)입니다. 즉, 입력값의 크기에 상관없이 항상 일정한 시간 내에 결과를 반환합니다.
회고 🎵
이번 문제를 풀면서 등차수열의 합 공식을 활용한 효율적인 해결 방법을 다시 한번 체감할 수 있었습니다. 처음에는 for 반복문을 사용해 하나씩 더하는 방식으로 접근했지만, 수가 클수록 시간이 오래 걸린다는 문제를 발견했고 이를 보완하기 위해 수학 공식을 적용했고, 코드가 훨씬 간결해지면서 성능도 크게 향상되었습니다.
이 문제를 풀면서 아쉬운 점은 초기 코드 작성 시에 반복문과 조건문을 사용하면서 비효율적인 코드를 작성하려고 했는데, 이런 실수를 줄이기 위해 문제를 수학적으로 접근할 수 있도록 연습을 더 해야겠다고 느꼈습니다..!
오늘은 여기까지 :)
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > Swift' 카테고리의 다른 글
[Swift] Actor 이해하기 (2/2) (4) | 2024.12.15 |
---|---|
[Swift] 삼총사 문제 풀이 및 회고 (6) | 2024.11.30 |
[Swift] stride와 enumerated 알아보기 (2) | 2024.11.24 |
[Swift] 과일 장수 문제 풀이 및 회고 (4) | 2024.11.20 |
[Swift] 제곱근 판별하기 (5) | 2024.11.16 |