๐Ÿ’ป Programming/Algorithm

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

Jiwon() 2023. 8. 2. 22:38

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด
์‚ฌ์šฉ ์–ธ์–ด : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ JavaScript JS

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

1) โ“ ๋ฌธ์ œ ์„ค๋ช…

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์„ ๋ฐ˜ํ™˜ํ•ด ์ฃผ์„ธ์š”.

 

2) ๐Ÿšซ ์ œํ•œ ์‚ฌํ•ญ

  • ์ž…๋ ฅ๋œ ์ˆ˜, num์€ 1 ์ด์ƒ 8,000,000 ๋ฏธ๋งŒ์ธ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค.

 

3) โ˜‘๏ธ ์ž…์ถœ๋ ฅ ์˜ˆ

n result
6 8
16 4
626331 -1

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

  • ์ž…์ถœ๋ ฅ ์˜ˆ #1
    • ๋ฌธ์ œ์˜ ์„ค๋ช…๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์ž…์ถœ๋ ฅ ์˜ˆ #2
    • 16 → 8 → 4 → 2 → 1 ์ด ๋˜์–ด ์ด 4๋ฒˆ ๋งŒ์— 1์ด ๋ฉ๋‹ˆ๋‹ค.
  • ์ž…์ถœ๋ ฅ ์˜ˆ #3
    • 626331์€ 500๋ฒˆ์„ ์‹œ๋„ํ•ด๋„ 1์ด ๋˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ -1์„ ๋ฆฌํ„ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 


2. ์‚ฌ์šฉํ•œ ๋ฉ”์„œ๋“œ: if๋ฌธ, while๋ฌธ

์ฃผ์–ด์ง„ ์ˆ˜ num์ด 1์ธ ๊ฒฝ์šฐ์—๋Š” 0์„ returnํ•˜๊ณ , ์ž‘์—…์„ 500๋ฒˆ ๋ฐ˜๋ณตํ•  ๋•Œ๊นŒ์ง€ num์ด 1์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•˜๋ผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด๋“ค์ด ๋งŽ์•„์„œ if๋ฌธ๊ณผ while๋ฌธ์œผ๋กœ ์ ‘๊ทผํ•˜์—ฌ ํ’€์ด ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ–ˆ๋‹ค.

 

 


3. ๋‹ต์•ˆ

1) ๋‚˜์˜ ํ’€์ด

const solution = (num) => {
    let result = 0;
    if (num === 1) return 0
    
    while (num !== 1) {
        if (num%2 === 0) {
            result++
            num /= 2
        } else {
            result++
            num = num*3 + 1
        }
    }
    
    if (result>500) return -1
    else return result
}
  • ๋จผ์ € num์ด 1์ด ๋  ๋•Œ๊นŒ์ง€ ๋ช‡ ๋ฒˆ์˜ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€ ์นด์šดํŠธํ•˜๊ธฐ ์œ„ํ•ด result๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์˜€๋‹ค.
  • ๋ฌธ์ œ๋Œ€๋กœ๋ผ๋ฉด, ๋งŒ์•ฝ ์ฃผ์–ด์ง„ num์ด 1์ด๋ฉด ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ํ•„์š” ์—†์ด 0์„ ๋ฆฌํ„ดํ•˜๋ฉด ๋˜๋ฏ€๋กœ if (num === 1) return 0์„ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • num์ด 1์ด ์•„๋‹ˆ๋ผ๋ฉด 0์„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๊ณ  while๋ฌธ์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ num์ด ๊ฐ๊ฐ ์ง์ˆ˜์ผ ๋•Œ์™€ ํ™€์ˆ˜์ผ ๋•Œ, ๋‚˜๋ˆ„๊ธฐ2 ๋˜๋Š” ๊ณฑํ•˜๊ธฐ3+1์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค result++๋กœ ์ž‘์—… ์ˆ˜ํ–‰ ํšŸ์ˆ˜๋ฅผ ๋”ํ•ด์ฃผ์—ˆ๋‹ค.
  • while๋ฌธ ์•„๋ž˜๋กœ๋Š” ๋งŒ์•ฝ ์ž‘์—… ์ˆ˜ํ–‰ ํšŸ์ˆ˜๊ฐ€ 500๋ฒˆ์„ ์ดˆ๊ณผํ•˜๋ฉด -1์„ ๋ฆฌํ„ดํ•˜๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋„๋ก if (result>500) return -1์„ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž‘์—… ์ˆ˜ํ–‰ ํšŸ์ˆ˜์ธ result๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ํ–ˆ๋‹ค.

 

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์ด๋ฉด ((count >= 500 ? -1 : count)๋ฌธ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š”๋ฐ, ์ด ๋•Œ count๋Š” 0์ด๋ฏ€๋กœ count, ์ฆ‰ 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • num์ด 1์ด ์•„๋‹ˆ๋ฉด collatz((num % 2 == 0) ? num / 2 : (num * 3) + 1, ++count)์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋ฉฐ count์— ์ž‘์—… ์‹คํ–‰ ํšŸ์ˆ˜๋ฅผ ๋”ํ•œ๋‹ค.
  • count๊ฐ€ 500 ์ด์ƒ์ด ๋˜๋ฉด ์žฌ๊ท€ํ•จ์ˆ˜์—์„œ ๋น ์ ธ๋‚˜์™€ -1์„ ๋ฆฌํ„ดํ•œ๋‹ค.