주어진 문제
주어진 코드
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
}
'Swift랑 친해지기 > programmers 풀기' 카테고리의 다른 글
[프로그래머스] x만큼 간격이 있는 n개의 숫자(swift) (0) | 2022.06.09 |
---|---|
[프로그래머스] 수박수박수박수박수박수? (Swift) (0) | 2022.01.29 |
[프로그래머스] 평균구하기 (Swift) (0) | 2022.01.24 |
[프로그래머스] 직사각형 별찍기 (Swift) (0) | 2022.01.21 |
[프로그래머스] 나머지가 1이 되는 수 찾기 (Swift) (0) | 2022.01.21 |