Swift랑 친해지기/programmers 풀기

[프로그래머스] 콜라츠 추측 (Swift)

데브킹덕 2022. 1. 25. 17:08

주어진 문제

 

주어진 코드

func solution(_ num:Int) -> Int {
    return 0
}

 

 

내가 풀이한 코드

func solution(_ num:Int) -> Int {
    var result = 0
    var n :Int
    n = num

while n != 1 {
    result += 1
    if n % 2 == 0 
    {
        n = n / 2
    }
    else 
    {
        n = n * 3 + 1
    } 
    if result == 500 {
        return -1
    }
} 
 return result
}

 

풀이한 순서

1. 문제가 뭐를 요구하는지 머리를 굴렸다. 

먼저 주어진 코드를 보며 떠올렸다.

 

1-1

어떤 정수 num이라는 값을 입력받게 된다

1-2

그 수가 짝수면 2로 나누고,

홀수면 3을 곱하고 1을 더한다.

1-3

1-2 방법을 500번 미만으로 반복 해서 값이 1이 나오면 반복횟수를 리턴한다

1-4

1-2 방법을 500번 반복해도 값이 나오지 않으면 -1을 리턴한다. 

1-5

제한 사항으로 num은 1이상 8000000 미만인 정수를 염두해 둔다

 

2. 먼저 짝수면 2로 나누고, 홀수면 3을 곱하고 1을 더한다를 구현했다.

 근데 저 빨간줄 뭐임??

대충 매개변수 num은 let이라 값을 변환할 수 없다라는 뜻 같다. 

여기서 맨붕이 왔지만 잠깐 생각해보니??

num 값을 받는 변수 n을 하나 만들어서 num 대신 n을 넣으면 어떻게 될까 생각했다.

3.  이제 이 조건문을 올바르게 반환 하려면 반복문이 필요했다.

먼저 500번 미만일 경우 반복 횟수를 가져오기 위해서 result 변수를 하나 선언하고 초기화했다.

횟수이기에 초기화는 0으로 했다.

var result = 0

 

정확히 얼마나 Loop를 돌려야 하는지 가늠이 안가서 if문 보다는 while 문을 써야 겠다고 생각했다.

while 문 옆에 조건이 어떤게 들어가야 할지 처음에 엄청 헷갈렸다.

3-1. 500번이상 반복문을 돌게 되면  while  문을 빠져 나가게끔 할까??

while result != 500 {
  result += 1
}

  그렇게 되면 루프가 돌때마다 result의 값이 하나 증가해야 하며,

num이 1로 입력 받았을때를 가정했을때 생각해 while 문에 어떤게 들어가야 맞는지 다시 곱씹어봤다.

즉 ,result + = 1 

if n == 1 구문이 어디에 들어가야 할지가 중요했고 시행착오도 많이 겪었다.

다음 밑에 두 예시처럼 코딩하게  되면은 result 값을 + 1 해서 옳바른 반환이 되지 않고, 연산을 통해 옳바른 값을 얻지 못한다.

2. 그래서 while의 조건에 n이 1이 아닐때까지  Loop를 돌리면 쉽게 접근할 수 있다는 결과를 찾아냈다.

while n != 1 {
    result += 1
    if n % 2 == 0 
    {
        n = n / 2
    }
    else 
    {
        n = n * 3 + 1
    } 
    if result == 500 {
        return -1
    }
} 
 return result
}