🔴 문제
🔵 풀이 1
주어진 수를 담은 변수 'temp'가 1이 될 때까지 반복되는 while문을 만들면 될 것 같다. -> temp != 1 인 동안 반복하는 while문 작성
몇 번 돌았는지를 체크하고 반환하는 'count' 변수도 있어야 하겠다.
문제를 보면 500번째 반복까지는 괜찮아보인다. 'count'가 501인 순간 반복문을 break하고 -1을 return하게 하면 된다.
func solution(_ num:Int) -> Int {
guard num != 1 else { return 0 }
var temp = num
var count = 0
while temp != 1 {
count += 1
if count > 500 { break }
if temp % 2 == 0 { // collatz 연산 수행
temp /= 2
} else {
temp = temp * 3 + 1
}
if temp == 1 { return count } // 연산 결과가 1이면 count 반환
}
return -1 // count > 500 일 경우 반환
}
🔵 풀이 2 - collatz 연산 새로운 함수로 분리
다른 풀이를 보니, 콜라츠의 연산 부분을 다른 함수로 묶은 경우가 몇몇 보였다.
나도 짝수이면 2로 나누고, 홀수이면 3을 곱하고 1을 더하는 부분을 'collatz'라는 함수로 따로 만들어보겠다.
// collatz 함수 정의
func collatz(_ num:Int) -> Int {
if num % 2 == 0 {
return num / 2 // 짝수면 2로 나눈 값 반환
} else {
return num * 3 + 1 // 홀수면 3을 곱하고 1을 더한 값 반환
}
}
func solution(_ num:Int) -> Int {
guard num != 1 else { return 0 } // num이 1이면 0 반환
var temp = num
var count = 0
while temp != 1 {
count += 1
if count > 500 { break }
temp = collatz(temp) // collatz 연산 수행
if temp == 1 { return count } // 연산 결과가 1이면 count 반환
}
return -1
}
지금은 collatz함수를 만들기 전과 후의 차이가 별로 안 보이지만,
연산이 더 복잡하다면, 함수를 따로 생성하는 편이 코드 가독성을 높이는 데에 도움이 될 것 같다.
'Swift > Code Kata (알고리즘)' 카테고리의 다른 글
[Swift|코드카타] (프로그래머스) 입문 #25. 나누어 떨어지는 숫자 배열 (0) | 2024.02.19 |
---|---|
[Swift|코드카타] (프로그래머스) 입문 #24. 서울에서 김서방 찾기 - firstIndex(of:), enumerated() (2) | 2024.02.18 |
[Swift|코드카타] (프로그래머스) 입문 #22. 두 정수 사이의 합 - Array(), 등차수열의 합 (0) | 2024.02.16 |
[Swift|코드카타] (프로그래머스) 입문 #21. 하샤드 수 - reduce (0) | 2024.02.16 |
[Swift|코드카타] (프로그래머스) 입문 #20. 정수 내림차순으로 정렬하기 - sort(), sorted() (0) | 2024.02.15 |