Where who wants to meet someone
콜라츠 추측 본문
728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/12943
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
내 답안 / 다른 사람들의 답안
func solution(_ num:Int) -> Int {
return collatz(num)
}
func collatz(_ num: Int, count: Int = 0) -> Int {
if num == 1 { return count }
if count > 500 { return -1 }
return collatz(num % 2 == 0 ? num / 2 : num * 3 + 1, count: count + 1)
}
- 처음엔 각 작업을 solution 안에서 해줬는데, 테스트 케이스 1, 3, 6에서 시간 초과가 발생했다.
- 이에 시간을 줄이고자 해당 작업을 재귀함수로 만들어 처리하여 풀 수 있었다.
- num이 1이면 count를 반환(처음에 해당하면 0을, 작업 결과물이 1이라면 그때까지의 count를 반환)
- count가 500회를 넘어가면 -1 반환
- 그 외의 경우에는 더 작업을 해야 하기 때문에 재귀함수로 짝수면 2를 나눈 값, 홀수면 3을 곱하고 1을 더한 값을 만들고 count에 1을 더한 값을 같이 전달하는 방식을 사용했다.
// 풀이 1
func odd(_ n: Int) -> Int {
return n * 3 + 1
}
func even(_ n: Int) -> Int {
return n / 2
}
func solution(_ num:Int) -> Int {
var ans = num
var count = 0
while ans != 1 && count < 500 {
ans = ans % 2 == 0 ? even(ans) : odd(ans)
count += 1
}
return count >= 500 ? -1 : count
}
// 풀이 2
func solution(_ num:Int) -> Int {
var number = num
if number == 1 { return 0 }
for i in 0..<500 {
if number%2 == 0 {
number = number/2;
} else {
number = number*3 + 1;
}
if number == 1 { return i+1};
}
return -1;
}
점수: +1
'프로그래머스 알고리즘 문제 기록 > Lv. 1' 카테고리의 다른 글
| 제일 작은 수 제거하기 (0) | 2024.05.14 |
|---|---|
| 핸드폰 번호 가리기 (0) | 2024.05.14 |
| 나누어 떨어지는 숫자 배열 (0) | 2024.05.14 |
| 없는 숫자 더하기 (0) | 2024.05.13 |
| 음양 더하기 (0) | 2024.05.13 |