2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[Swift] Programmers - 콜라츠 추측

2024. 2. 28. 10:00ㆍIOS/Swift-Algorithm (Programmers)
SMALL

https://school.programmers.co.kr/learn/courses/30/lessons/12943?language=swift

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

* 콜라츠 추측 *

1937 Collatz 사람에 의해 제기된 추측은, 주어진 수가 1 때까지 다음 작업을 반복하면,

모든 수를 1 만들 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.

예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 되어 8 만에 1 됩니다.

작업을 번이나 반복해야 하는지 반환하는 함수, solution 완성해 주세요.

, 주어진 수가 1 경우에는 0, 작업을 500 반복할 때까지 1 되지 않는다면 –1 반환 주세요.

 

 

* 제한사항 *

입력된 , "num" 1 이상 8,000,000 미만인 정수입니다.

 

* 알고리즘 분석 & 이해 *

이 알고리즘은 콜라츠라는 사람이 추측을 한 알고리즘인데,

주어진 수 대해서 주어진 규칙에 따라 반복 작업을 하고, 1이 될 때까지 반복 횟수를 구하는 알고리즘이 되네요

주어진 수 짝수면 2로 나누고, 홀수면 3을 곱하고 1을 더하는 작업 수행하고, 1이 될 때까지 반복하고 반복 횟수를 반환합니다.

만약 1이 되지 않고 반복을 500번 수행해도 1이 되지 않는다면 -1을 반환해야 합니다.

* 로직구상 *

이 알고리즘의 로직의 핵심은 반복적인 작업(for-in) 필요 하니까

우선 입력된 수가 1인 경우에는 0을 반환해야 해서 이걸 먼저 처리해야하고

다음은 반복 횟수를 세기 위해 반복문을 사용해서 주어진 수가 1이 될 때까지

주어진 작업을 수행하고 반복 횟수를 증가시켜주도록 해주는데,

이때, 주어진 수가 짝수인지 홀수인지 확인하여 작업을 수행합니다.

반복문이 끝나는 조건은 주어진 수가 1이 되었거나 반복 횟수가 500이 되는 경우인데,

이때, 1이 되지 않고 500번을 반복했다면 -1을 반환하는 것으로 마무리를 해주면 될 것 같습니다.

* 코드구성 *

먼저, 함수를 선언해 줍시다.

func solution(_ num: Int) -> Int {

정수를 입력받아 정수를 반환해주는 함수이죠.

 

다음으로는 우리가 주어진 문제에서 "입력된 수가 1인 경우에는 바로 0을" 이라는 구문이 있었죠

    // 주어진 수가 1인 경우
    if num == 1 {
        return 0
    }

입력된 수가 1인 경우에 대한 처리를 먼저 해주어야 하기 때문에

조건문을 먼저 입력 해주어야 하죠

이 구문은 "만약 입력된 수가 1이라면 함수는 0을 반환하는 조건문" 입니다.

    var count = 0 // 반복 횟수를 세기 위한 변수
    var currentNum = num // 현재 수를 저장하기 위한 변수

반복 횟수를 저장할 변수인 count와 주어진 수를 저장할 변수인 currentNum을 초기화해주고

다음 구문에서 반복문을 시작해주어야 해요

    // 주어진 수가 1이 되거나 반복 횟수가 500이 될 때까지 반복
    while currentNum != 1 && count < 500 {

주어진 수가 1이 아니고(count가 500 미만이면) 반복하는 구문이 됩니다.

 

        // 주어진 수가 짝수인 경우
        if currentNum % 2 == 0 {
            currentNum /= 2
        } else { // 주어진 수가 홀수인 경우
            currentNum = currentNum * 3 + 1
        }

주어진 수가 짝수인지 홀수인지 확인하여 작업을 수행 하는데,

짝수인 경우에는 2로 나누고, 홀수인 경우에는 3을 곱하고 1을 더해주고

        count += 1 // 반복 횟수 증가
    }

반복 횟수를 "1" 증가시켜줍시다.

    // 반복 횟수가 500을 넘어가면 -1 반환
    if count >= 500 {
        return -1
    }

문제에서도 반복이 500회를 초과하면 -1을 반환하라 되어있죠?

조건문으로 카운트를 500을 초과한다면 -1을 반환하도록 설정해줍시다.

    return count // 반복 횟수 반환
}

그 외의 경우에는 반복 횟수를 반환 하게 해줍시다.

 

총 코드는 아래와 같습니다.

func solution(_ num: Int) -> Int {
    // 주어진 수가 1인 경우
    if num == 1 {
        return 0
    }
    
    var count = 0 // 반복 횟수를 세기 위한 변수
    
    var currentNum = num // 현재 수를 저장하기 위한 변수
    
    // 주어진 수가 1이 되거나 반복 횟수가 500이 될 때까지 반복
    while currentNum != 1 && count < 500 {
        if currentNum % 2 == 0 { // 짝수인 경우
            currentNum /= 2
        } else { // 홀수인 경우
            currentNum = currentNum * 3 + 1
        }
        count += 1 // 반복 횟수 증가
    }
    
    // 반복 횟수가 500을 넘어가면 -1 반환
    if count >= 500 {
        return -1
    }
    
    return count // 반복 횟수 반환
}
728x90