1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12943
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 나의 풀이
function solution(num) {
let answer = 0;
while(num > 1) {
num%2 == 0 ? num /= 2 : num = num *3 +1
answer++;
if(answer >= 500) {
num = -1;
answer = -1;
};
}
return answer;
}
3. 다른 사람 풀이
프로그래머스의 다른 사람의 풀이를 분석함
case 1) 비슷한 접근법인데 더 깔끔
while의 조건에서 num과 answer 둘다 체크하고
return문에서 삼항연산자로 예외 answer값을 처리해주었다.
function collatz(num) {
var answer = 0;
while(num !=1 && answer !=500){
num%2==0 ? num = num/2 : num = num*3 +1;
answer++;
}
return num == 1 ? answer : -1;
}
case 2) 재귀함수
function collatz(num, count = 0) {
return (num == 1) ? ((count >= 500) ? -1 : count) : collatz((num % 2 == 0) ? num / 2 : (num * 3) + 1, ++count);
}
// 조건: num이 1이면
(num == 1) ?
// 조건: count가 500이상인지 체크해서 -1반환하거나 count값 반환
((count >= 500) ? -1 : count) :
// 조건: num이 1이 아닐때 재귀함수 호출
collatz(
// 첫번째 매개변수(num값 받아야함)에 num값 계산해서 넘겨줌
(num % 2 == 0) ? num / 2 : (num * 3) + 1,
// 두번째 매개변수(count값 받아야함)에 count값 세서 넘겨줌
++count
)
case 3) 같은 재귀함수인데 함수를 기능별로 잘 쪼갠듯 하다 ! 함수 쪼개는거 참고해야지
const solution = (num) => collatzGuessCount(num, 0);
const collatzGuessCount = (num, acc) =>
(num === 1) ? ((acc > 500) ? -1 : acc) : collatzGuessCount(processCollatz(num), acc + 1);
const processCollatz = (num) => (num % 2 === 0) ? (num / 2) : (num * 3 + 1);
4. 배운 점
- return은 '함수' 종료하고 탈주
- break 반복문 탈출
- continue 반복문의 현재단계에서 탈출하고 다음단계로 감
'알고리즘, CS' 카테고리의 다른 글
[특강] 클린코드_의미 있는 변수명 짓기 (0) | 2023.08.01 |
---|---|
[프로그래머스 Lv. 1] 음양 더하기 (0) | 2023.07.31 |
HTTP (0) | 2023.07.06 |
[프로그래머스 Lv. 0] 2차원으로 만들기 (0) | 2023.06.16 |
[프로그래머스 Lv. 0] 모스부호 (1) (0) | 2023.06.15 |