프로그래머스 1단계) 콜라츠추측
2021. 12. 2. 19:39ㆍAlgorithm/알고리즘
728x90
반응형
문제
첫번째 제출
func solution(_ num:Int) -> Int {
var num = num
var sum = 0
repeat {
if num % 2 == 0 {
num = num/2
sum += 1
} else {
num = num * 3 + 1
sum += 1
}
} while (num != 1)
switch num {
case 626331:
return -1
default:
return sum
}
}
두번째 제출
func solution(_ num:Int) -> Int {
var num = num
var sum = 0
repeat {
if sum == 500 && num != 1 {
break
}
if num % 2 == 0 {
num = num/2
sum += 1
} else {
num = num * 3 + 1
sum += 1
}
} while (num != 1)
switch num {
case 1:
return sum
default:
return -1
}
}
제출해서 통과한 답안
func solution(_ num:Int) -> Int {
var num = num
var sum = 0
while sum != 500 && num != 1 {
if num % 2 == 0 {
num = num/2
sum += 1
} else {
num = num * 3 + 1
sum += 1
}
}
//500백번 돌렸는데 or 그냥 num이 1이야
if num == 1 {//num이 1이야
return sum
} else { //500백번 돌렸는데 num이 1이 아니야
return -1
}
}
최적화 시켜본 답안
func solution(_ num:Int) -> Int {
var num = num
var sum = 0
while sum != 500 && num != 1 {
var check = num % 2 == 0
num = check ? num/2 : (num * 3) + 1
sum += 1
}
sum = num == 1 ? sum : -1
return sum
}
주의할점
1. check는 bool값을 저장해주는거지 우항과 같은지 비교해보는게 아냐 == -> =로 수정해야함
2. 연산자 사이 띄어쓰기 해줘야해 sum +=1 -> sum += 1
3. 삼항연산자 사용하려면 항상 물음표 앞에는 bool타입이 와야해
유의미한 답안
func solution(_ num:Int) -> Int {
var num1 = num
var cnt = 0
while num1 != 1 && cnt != 500{
var check = num1 % 2 == 0
num1 = check ? num1 / 2 : (num1 * 3)+1
cnt+=1
}
cnt = num1 == 1 ? cnt : -1
return cnt
}
느낀점
보니깐..문제를 제대로 안읽는 경향이 있네 "작업을 500번 반복해도 1이되지 않는다면 -1을 반환"이라는 말은 왜 안읽었는지?
문제를 꼼꼼히 읽어보고 푸는자세 매우 중요해.
삼항연산자 이용하는 센스 길러보자
repeat while같은 잘 안쓰는 문법을 쓰는것보다, 좀 익숙하게 많이 쓰이는 문법을 쓰는게 좋겠어.
그리고 똑같은 문제를 읽더라도 지금 받아들이는게 다르니까, 문제를 해석? 하는 능력을 길러보자.
이 문제의 "단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요."는
500번까지만 while문을 돌려도 된다는 의미야 맞지.
이것처럼 헷갈렸던 부분. 어떻게 해석해야하는지.
할 수있어 까짓거
728x90
반응형
'Algorithm > 알고리즘' 카테고리의 다른 글
프로그래머스 1단계) 제일 작은 수 제거하기 (0) | 2021.12.03 |
---|---|
프로그래머스 1단계) 최대공약수와 최소공배수 (0) | 2021.12.03 |
프로그래머스 1단계) 평균구하기 (0) | 2021.12.02 |
프로그래머스 1단계) 하샤드수 (0) | 2021.12.02 |
프로그래머스 레벨1) 핸드폰 번호 가리기 (0) | 2021.12.01 |