https://school.programmers.co.kr/learn/courses/30/lessons/12943
JS
문제
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 미만인 정수입니다.
계획
wile문으로 주어진 수(num)가 1이 될 때 까지(num>1)
입력된 수가 짝수라면 2로 나눕니다. count++
입력된 수가 홀수라면 3을 곱하고 1을 더합니다. count++
return count
참고, 풀이
function solution(num) {
let count=0
while(num>1){
num = (num%2===0)? num/2 : num*3+1
count++
}
return count<500? count : -1;
}
점수가 높은(+7) 걸보아 나쁜 코드인것 같습니다.
작업 횟수가 500이 되면 계산을 끝내고 -1 반환
for문으로 500번 까지 돌리고 중간에 num이 1이 되면 작업횟수를 반환하기
부등호 안써도 값이 0이면 false로 나옴
num = num % 2 ? num * 3 + 1 : num / 2;
답
function solution(num) {
for (let count = 0; count < 500; count++) {
if (num === 1) return count;
num = num % 2 ? num * 3 + 1 : num / 2;
}
return -1;
}
코드 간략화하기
const solution = (num) => {
for (let i = 0; i < 500; i++, num = num % 2 ? num * 3 + 1 : num / 2)
if (num === 1) return i;
return -1;
};
쉼표 연산자(,)는 왼쪽에서 오른쪽으로 작업을 순차적으로 실행합니다.
단일 표현식을 요구하는 곳에 복수의 표현식을 사용하고 싶을 때 쉼표 연산자를 사용할 수 있습니다.
여러 표현식을 하나의 구문으로 묶을 수 있으며, 마지막 표현식의 결과가 반환됩니다.
가장 흔히 사용되는 곳은 for 반복문에 다수의 매개변수를 제공할 때입니다.
쉼표 연산자는 배열, 객체, 함수의 매개변수와 호출 인수에서 사용하는 쉼표와는 전혀 다릅니다.
증감식부분 (i++, num = num % 2 ? num * 3 + 1 : num / 2)
루프의 각 반복이 끝날 때 동시에 두 가지 작업을 수행합니다
if위치
for문에서 중괄호 {}가 생략된 상태에서는 루프 바로 뒤의 한 줄 코드가 본문으로 간주됩니다.
출처
쉽표 연산자 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Comma_operator
'내일배움 과제 > 기타 과제' 카테고리의 다른 글
알고리즘 25 - 나누어 떨어지는 숫자 배열 (1) | 2024.12.02 |
---|---|
알고리즘 24 서울에서 김서방 찾기 (0) | 2024.11.28 |
알고리즘 22번 두 정수 사이의 합 (0) | 2024.11.27 |
알고리즘 21번 - 추가공부 (0) | 2024.11.26 |
알고리즘 20-추가공부 (0) | 2024.11.25 |