Where who wants to meet someone

콜라츠 추측 본문

프로그래머스 알고리즘 문제 기록/Lv. 1

콜라츠 추측

Lust3r 2024. 5. 14. 10:51
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