33. 스파르타 코딩 클럽 - 6월 2일 코딩테스트 연습 (코드카타)
❓ 오늘의 문제
1. 약수의 합
- 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해 주세요.
- 제한 사항
- n은 0 이상 3000 이하인 정수입니다.
나의 정답 코드
// 방법 1 : 일반 방법
func solution(_ n:Int) -> Int {
if n == 0 {
return 0
}
var divNumList = [Int]()
for i in 1...n {
if n % i == 0 {
divNumList.append(i)
}
}
return divNumList.reduce(0, +)
}
// 방법 2 : 축약 방법
func solution(_ n:Int) -> Int {
if n == 0 { return 0 }
let divNumList = (1...n).filter { n % $0 == 0 }
return divNumList.reduce(0, +)
}
✓ TIL
[ 처음 코드 ]
func solution(_ n:Int) -> Int {
var divNumList = [Int]()
for i in 1...n {
if n % i == 0 {
divNumList.append(i)
}
}
return divNumList.reduce(0, +)
}
처음 코드이다.
설명하면
1부터 주어진 n까지 반복문을 돌면서
n을 i의 값으로 나눈 나머지가 0일 때 (즉, 약수일 때) divNumList에 i 값을 추가한다.
그 후 return 부분에서 reduce를 사용해서 divNumList 안에 값들을 더해주고
더해진 값을 최종 return 한다.
여기서 잠깐 reduce가 무엇인가?
돌아온 공식 문서 Time
reduce(_:_:) | Apple Developer Documentation
Returns the result of combining the elements of the sequence using the given closure.
developer.apple.com
Swift의 reduce는 컬렉션의 모든 요소를 하나의 값으로 결합할 때 사용하는 고차 함수입니다.
예를 들어 배열의 합, 곱, 문자열 결합 등 여러 요소를 단일 값으로 축약할 때 사용됩니다.
[ reduce 기본 문법 ]
let result = array.reduce(initialResult) { partialResult, element in
// 연산 내용
}
- initialResult: 축약을 시작할 때 사용할 초기값
- partialResult: 누적된 결괏값 (반복적으로 업데이트됨)
- element: 현재 반복 중인 배열의 요소
[ reduce 사용 예시 ]
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 출력: 15
- 0: 초기값
- $0: 이전까지의 합 (partialResult)
- $1: 현재 요소 (element)
[ reduce 내 코드에서 사용 예시 ]
return divNumList.reduce(0, +) // 초기값 : 0
// + 의 의미 : $0 + $1 생략
[ 일반 방법 정답 코드 ]
func solution(_ n:Int) -> Int {
if n == 0 {
return 0
}
var divNumList = [Int]()
for i in 1...n {
if n % i == 0 {
divNumList.append(i)
}
}
return divNumList.reduce(0, +)
}
아래 트러블 슈팅에서 정리한 테스트 16번에서 발생한 제한 사항 관련 문제를 해결 한 뒤 코드이다.
문제를 해결하고 난 뒤 코드를 좀 더 짧고 간단하게 작성해 볼 수 있을 거 같아서
축약 방법으로 코드를 작성해 보았다.
[ 축약 방법 정답 코드 ]
func solution(_ n:Int) -> Int {
if n == 0 { return 0 } // n 이 0일 때 예외 처리
let divNumList = (1...n).filter { n % $0 == 0 } // 약수 구하기
return divNumList.reduce(0, +) // 구한 약수들 다 더하기
}
filter를 사용해서 divNumList에 약수들을 구하고
reduce를 사용해서 구한 약수들을 다 더해주고 return 하는 방법의 코드를 작성했다.
🎯 Trouble Shooting
[ 테스트 16번 에러 - (signal: illegal instruction (core dumped)) ]
(signal: illegal instruction (core dumped)) 에러를 GPT에 물어봤더니
아래와 같은 문제점을 알려주었다.
문제는 내가 제한 사항을 참고하지 않고 그냥 코딩을 하다가 발생한 문제이다.
if n == 0 { return 0 } // n이 0일 때 예외 처리
코드를 추가해 주고 에러를 해결했다.