๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[Algorithm] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv.1 : ์ฝœ๋ผ์ธ  ์ถ”์ธก

by ์ฝ”๋”ฉ๊ณต์ฑ… 2022. 11. 15.
๋ฐ˜์‘ํ˜•

์ฝœ๋ผ์ธ  ์ถ”์ธก

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 ๋ฏธ๋งŒ์ธ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค.


์ž…์ถœ๋ ฅ ์˜ˆ

์ž…์ถœ๋ ฅ ์˜ˆ #1
๋ฌธ์ œ์˜ ์„ค๋ช…๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


์ž…์ถœ๋ ฅ ์˜ˆ #2
16 โ†’ 8 โ†’ 4 โ†’ 2 โ†’ 1 ์ด ๋˜์–ด ์ด 4๋ฒˆ ๋งŒ์— 1์ด ๋ฉ๋‹ˆ๋‹ค.


์ž…์ถœ๋ ฅ ์˜ˆ #3
626331์€ 500๋ฒˆ์„ ์‹œ๋„ํ•ด๋„ 1์ด ๋˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ -1์„ ๋ฆฌํ„ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

n result
6 8
16 4
626331 -1

๋ฌธ์ œ ํ’€์ด

0์ธ count๊ฐ€ 500์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† 1์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ์ด ๋•Œ num์ด 1์ด๋ผ๋ฉด count๋ฅผ ๋ฐ˜ํ™˜์‹œํ‚จ๋‹ค. num์ด ์ง์ˆ˜์ผ ๊ฒฝ์šฐ์—๋Š” num์„ 2๋กœ ๋‚˜๋ˆˆ ๊ฐ’์„, ํ™€์ˆ˜์ผ ๊ฒฝ์šฐ์—๋Š” num์— 3์„ ๊ณฑํ•œ ๊ฐ’์— 1์„ ๋”ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

function solution(num) {
    var count = 0;

    while (count < 500) {
        if (num === 1) {
            return count;
        }
        count ++;
        num = num % 2 === 0 ? num /2 : num *3 +1;
    }

    return -1;
}

๋‹ค๋ฅธ ํ’€์ด ๋ฐฉ์‹

์ถœ์ฒ˜ : ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์Šค์ฟจ

while๋ฌธ๊ณผ ํŽผ์นจ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

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;
}
// ์•„๋ž˜๋Š” ํ…Œ์ŠคํŠธ๋กœ ์ถœ๋ ฅํ•ด ๋ณด๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
console.log( collatz(6) );
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


Reference Book

JavaScript
HTML
CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘์ž…๋‹ˆ๋‹ค.