๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Python/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต_Level 2] ์šฐ๋ฐ•์ˆ˜์—ด ์ •์ ๋ถ„

by 2soupsoup 2022. 12. 29.

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต_Level 2] ์šฐ๋ฐ•์ˆ˜์—ด ์ •์ ๋ถ„ ํ’€๋Ÿฌ ๊ฐ€๊ธฐ

 

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

์ฝœ๋ผ์ธ  ์ถ”์ธก์ด๋ž€ ๋กœํƒ€๋ฅด ์ฝœ๋ผ์ธ (Lothar Collatz)๊ฐ€ 1937๋…„์— ์ œ๊ธฐํ•œ ์ถ”์ธก์œผ๋กœ ๋ชจ๋“  ์ž์—ฐ์ˆ˜ n์— ๋Œ€ํ•ด ๋‹ค์Œ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๋ฉด ํ•ญ์ƒ 1๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ถ”์ธก์ž…๋‹ˆ๋‹ค.

1-1. ์ž…๋ ฅ๋œ ์ˆ˜๊ฐ€ ์ง์ˆ˜๋ผ๋ฉด 2๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.
1-2. ์ž…๋ ฅ๋œ ์ˆ˜๊ฐ€ ํ™€์ˆ˜๋ผ๋ฉด 3์„ ๊ณฑํ•˜๊ณ  1์„ ๋”ํ•ฉ๋‹ˆ๋‹ค.
2. ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ์ˆ˜๊ฐ€ 1๋ณด๋‹ค ํฌ๋‹ค๋ฉด 1๋ฒˆ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์–ด์ง„ ์ˆ˜๊ฐ€ 5 ๋ผ๋ฉด 5 ⇒ 16 ⇒ 8 ⇒ 4 ⇒2 ⇒ 1 ์ด ๋˜์–ด ์ด 5๋ฒˆ ๋งŒ์— 1์ด ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜๊ฐ€ ์ปค์กŒ๋‹ค ์ž‘์•„์ง€๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๋ชจ์Šต์ด ๋น„๊ตฌ๋ฆ„์—์„œ ๋น—๋ฐฉ์šธ์ด ์˜ค๋ฅด๋ฝ๋‚ด๋ฆฌ๋ฝํ•˜๋ฉฐ ์šฐ๋ฐ•์ด ๋˜๋Š” ๋ชจ์Šต๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ํ•˜์—ฌ ์šฐ๋ฐ•์ˆ˜ ๋˜๋Š” ์šฐ๋ฐ•์ˆ˜์—ด๋กœ ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด ์ถ”์ธก์ด ์ฐธ์ธ์ง€ ๊ฑฐ์ง“์ธ์ง€ ์ฆ๋ช…๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์•ฝ 1ํ•ด๊นŒ์ง€์˜ ์ˆ˜์—์„œ ๋ฐ˜๋ก€๊ฐ€ ์—†์Œ์ด ๋ฐํ˜€์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์€์ง€๋Š” ์šฐ๋ฐ•์ˆ˜์—ด์„ ์ขŒํ‘œ ํ‰๋ฉด ์œ„์— ๊บพ์€์„  ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜ํƒ€๋‚ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ดˆํ•ญ์ด K์ธ ์šฐ๋ฐ•์ˆ˜์—ด์ด ์žˆ๋‹ค๋ฉด, x = 0์ผ ๋•Œ y = K์ด๊ณ  ๋‹ค์Œ ์šฐ๋ฐ•์ˆ˜๋Š” x = 1์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์šฐ๋ฐ•์ˆ˜๊ฐ€ 1์ด ๋  ๋•Œ๊นŒ์ง€ ์ ๋“ค์„ ์ฐ๊ณ  ์ธ์ ‘ํ•œ ์ ๋“ค๋ผ๋ฆฌ ์ง์„ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊บพ์€์„  ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://school.programmers.co.kr/learn/courses/30/lessons/134239

์€์ง€๋Š” ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ๊บพ์€์„  ๊ทธ๋ž˜ํ”„๋ฅผ ์ •์ ๋ถ„ ํ•ด๋ณด๊ณ  ์‹ถ์–ด ์กŒ์Šต๋‹ˆ๋‹ค. x์— ๋Œ€ํ•œ ์–ด๋–ค ๋ฒ”์œ„ [a, b]๊ฐ€ ์ฃผ์–ด์ง„๋‹ค๋ฉด ์ด ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ •์ ๋ถ„ ๊ฒฐ๊ณผ๋Š” ๊บพ์€์„  ๊ทธ๋ž˜ํ”„์™€ x = a, x = b, y = 0์œผ๋กœ ๋‘˜๋Ÿฌ ์Œ“์ธ ๊ณต๊ฐ„์˜ ๋ฉด์ ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์€์ง€๋Š” ์ด๊ฒƒ์„ ์šฐ๋ฐ•์ˆ˜์—ด ์ •์ ๋ถ„์ด๋ผ๊ณ  ์ •์˜ํ•˜์˜€๊ณ  ๋‹ค์–‘ํ•œ ๊ตฌ๊ฐ„์— ๋Œ€ํ•ด์„œ ์šฐ๋ฐ•์ˆ˜์—ด ์ •์ ๋ถ„์„ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ, ์šฐ๋ฐ•์ˆ˜์—ด ๊ทธ๋ž˜ํ”„์˜ ๊ฐ€๋กœ์ถ• ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘์€ ์Œ์ด ์•„๋‹Œ ์ •์ˆ˜, ๊ตฌ๊ฐ„์˜ ๋์€ ์–‘์ด ์•„๋‹Œ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ๊ฐ ๊บพ์€์„  ๊ทธ๋ž˜ํ”„๊ฐ€ ์‹œ์ž‘ํ•˜๋Š” ์ ๊ณผ ๋๋‚˜๋Š” ์ ์˜ x์ขŒํ‘œ์— ๋Œ€ํ•œ ์ƒ๋Œ€์ ์ธ ์˜คํ”„์…‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 5๋ฅผ ์ดˆํ•ญ์œผ๋กœ ํ•˜๋Š” ์šฐ๋ฐ•์ˆ˜์—ด์€ 5 ⇒ 16 ⇒ 8 ⇒ 4 ⇒ 2 ⇒ 1์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์ขŒํ‘œ ํ‰๋ฉด์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด (0, 5), (1, 16), (2, 8), (3, 4), (4, 2), (5, 1)์— ์ ์ด ์ฐํžˆ๊ณ  ์ ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋ฉด ๊บพ์€์„  ๊ทธ๋ž˜ํ”„๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์ด๋ฅผ [0,0] ๊ตฌ๊ฐ„์— ๋Œ€ํ•ด ์ •์ ๋ถ„ ํ•œ๋‹ค๋ฉด ์ „์ฒด ๊ตฌ๊ฐ„์— ๋Œ€ํ•œ ์ •์ ๋ถ„์ด๋ฉฐ, [1,-2] ๊ตฌ๊ฐ„์— ๋Œ€ํ•ด ์ •์ ๋ถ„ ํ•œ๋‹ค๋ฉด 1 ≤ x ≤ 3์ธ ๊ตฌ๊ฐ„์— ๋Œ€ํ•œ ์ •์ ๋ถ„์ž…๋‹ˆ๋‹ค.

์šฐ๋ฐ•์ˆ˜์˜ ์ดˆํ•ญ k์™€, ์ •์ ๋ถ„์„ ๊ตฌํ•˜๋Š” ๊ตฌ๊ฐ„๋“ค์˜ ๋ชฉ๋ก ranges๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ •์ ๋ถ„์˜ ๊ฒฐ๊ณผ ๋ชฉ๋ก์„ return ํ•˜๋„๋ก solution์„ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”. ๋‹จ, ์ฃผ์–ด์ง„ ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘์ ์ด ๋์ ๋ณด๋‹ค ์ปค์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ตฌ๊ฐ„์ด ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋•Œ์˜ ์ •์ ๋ถ„ ๊ฒฐ๊ณผ๋Š” -1๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

โ“ ์ œํ•œ ์กฐ๊ฑด

  • 2 ≤ k ≤ 10,000
  • 1 ≤ ranges์˜ ๊ธธ์ด ≤ 10,000
    • ranges์˜ ์›์†Œ๋Š” [a, b] ํ˜•์‹์ด๋ฉฐ 0 ≤ a < 200, -200 < b ≤ 0 ์ž…๋‹ˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ๋ชจ๋“  ์ž…๋ ฅ์— ๋Œ€ํ•ด ์ •์ ๋ถ„์˜ ๊ฒฐ๊ณผ๋Š” 227์„ ๋„˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณธ ๋ฌธ์ œ๋Š” ์ •๋‹ต์— ์‹ค์ˆ˜ํ˜•์ด ํฌํ•จ๋˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ž…์ถœ๋ ฅ ์˜ˆ์˜ ์†Œ์ˆ˜ ๋ถ€๋ถ„. 0์ด ์ฝ”๋“œ ์‹คํ–‰ ๋ฒ„ํŠผ ํด๋ฆญ ํ›„ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฐ๊ด๊ฐ’, ๊ธฐ๋Œ“๊ฐ’ ํ‘œ์‹œ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ—๏ธ ์ž…์ถœ๋ ฅ ์˜ˆ

k ranges result
5 [[0,0],[0,-1],[2,-3],[3,-3]] [33.0,31.5,0.0,-1.0]

์ž…์ถœ๋ ฅ ์˜ˆ #1
5๋กœ ์‹œ์ž‘ํ•˜๋Š” ์šฐ๋ฐ•์ˆ˜์—ด์€ 5 ⇒ 16 ⇒ 8 ⇒ 4 ⇒ 2 ⇒ 1์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„์—์„œ ๊บพ์ด๋Š” ์ง€์ ์„ ๊ฒฝ๊ณ„๋กœ 5๊ฐœ์˜ ๊ตฌ์—ญ์œผ๋กœ ๋‚˜๋ˆ ๋ณด๋ฉด ๊ฐ๊ฐ์˜ ๊ตฌ๊ฐ„ ๋„“์ด๋Š” 10.5, 12, 6, 3, 1.5์ž…๋‹ˆ๋‹ค.


๐Ÿ’ก ํ’€์ด

๐Ÿ“Œ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  • ์ฝœ๋ผ์ธ  ์ถ”์ธก
    • ์ˆ˜๊ฐ€ 1์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
      • while ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ํŠน์ • ์กฐ๊ฑด(k==1)์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
      • ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด k๊ฐ€ ์ง์ˆ˜์™€ ํ™€์ˆ˜์ผ ๊ฒฝ์šฐ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ์—ฐ์‚ฐ
  • ์šฐ๋ฐ•์ˆ˜์—ด์„ ์ขŒํ‘œ ํ‰๋ฉด ์œ„์— ๊บพ์€์„  ๊ทธ๋ž˜ํ”„
    • ์ขŒํ‘œ (x, y)๋Š” x๋Š” ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•œ ํšŸ์ˆ˜, y๋Š” ํ•ด๋‹น ์—ฐ์‚ฐ ํ›„์˜ ์ˆ˜
      • ๋”ฐ๋ผ์„œ ์•ž์„œ ์ง„ํ–‰ํ•œ ๋ฐ˜๋ณต๋ฌธ์—์„œ ์—ฐ์‚ฐ ํ›„์˜ ์ˆ˜๋ฅผ y_lst๋กœ ์ˆœ์ฐจ์  ์ €์žฅ
  • ๊บพ์€์„  ๊ทธ๋ž˜ํ”„๋ฅผ ์ •์ ๋ถ„
    • ๋‹จ, ์šฐ๋ฐ•์ˆ˜์—ด ๊ทธ๋ž˜ํ”„์˜ ๊ฐ€๋กœ์ถ• ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘์€ ์Œ์ด ์•„๋‹Œ ์ •์ˆ˜, ๊ตฌ๊ฐ„์˜ ๋์€ ์–‘์ด ์•„๋‹Œ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ๊ฐ ๊บพ์€์„  ๊ทธ๋ž˜ํ”„๊ฐ€ ์‹œ์ž‘ํ•˜๋Š” ์ ๊ณผ ๋๋‚˜๋Š” ์ ์˜ x์ขŒํ‘œ์— ๋Œ€ํ•œ ์ƒ๋Œ€์ ์ธ ์˜คํ”„์…‹์„ ์˜๋ฏธ
      • ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘์€ ์ž…๋ ฅ๊ฐ’ ๊ทธ๋Œ€๋กœ ์ธ์‹
      • ๊ตฌ๊ฐ„์˜ ๋์€ (๊ฐ€๋กœ์ถ•์˜ ๊ธธ์ด + ์ž…๋ ฅ๊ฐ’ - 1)๋กœ ์ธ์‹
    • ๋‹จ, ์ฃผ์–ด์ง„ ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘์ ์ด ๋์ ๋ณด๋‹ค ์ปค์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ตฌ๊ฐ„์ด ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋•Œ์˜ ์ •์ ๋ถ„ ๊ฒฐ๊ณผ๋Š” -1๋กœ ์ •์˜
      • ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘๊ณผ ๋ ๋น„๊ต ํ•„์š” ⇒ ์“ธ๋ชจ์—†๋Š” ์—ฐ์‚ฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์„  ๋น„๊ต ํ›„ ์—ฐ์‚ฐ
        • ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘ > ๊ตฌ๊ฐ„ ๋ : -1
        • ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘ == ๊ตฌ๊ฐ„ ๋ : 0
        • ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘ < ๊ตฌ๊ฐ„ ๋ : ์—ฐ์‚ฐ ์ง„ํ–‰
    • ์ •์ ๋ถ„
      • ์šฐ๋ฐ•์ˆ˜์—ด์„ ๊บพ์€์„  ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์„ ์ ๋ถ„์„ ์ง„ํ–‰ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ๊ตฌ๊ฐ„์„ ๋‚˜๋ˆ„์–ด ์ง„ํ–‰
      • ์ด๋•Œ, x๋Š” ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•œ ํšŸ์ˆ˜๋กœ ์ •์ˆ˜๊ฐ’์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๊ฐ„์€ [0,1], [1,2]...๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ
      • ๊ฐ๊ฐ ๊ตฌ๊ฐ„์—์„œ ์ผ์ฐจ ํ•จ์ˆ˜์˜ ๋ชจ์–‘์„ ๊ฐ€์ง€๋ฏ€๋กœ ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ ์ง„ํ–‰์„ ์œ„ํ•ด ์ •์ ๋ถ„ ๊ณต์‹์ด ์•„๋‹Œ ์‚ฌ๋‹ค๋ฆฌ๊ผด ๋„“์ด ๊ณต์‹์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ (๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๊ตฌ๊ฐ„ ๋‚ด ์‚ฌ๋‹ค๋ฆฌ๊ผด ํ•ฉ๊ณ„ ๊ตฌํ•จ)

 

๐Ÿ“Œ python code

def solution(k, ranges):
    answer = []
    y_lst = [k] # ์ดˆ๊ธฐ k๊ฐ’
    
    # ์ฝœ๋ผ์ธ  ์ถ”์ธก
    while k != 1 :
        if k % 2 == 0 :
            k = k//2
        else :
            k = k*3 + 1
        y_lst.append(k)
    
    for r in ranges :
        # ๊ตฌ๊ฐ„ ์‹œ์ž‘์ 
        a = r[0]
        # ๊ตฌ๊ฐ„ ๋์ 
        b = len(y_lst)+r[1]-1
        
        # ๊ตฌ๊ฐ„ ์‹œ์ž‘์ ๊ณผ ๋์  ๋น„๊ต
        # ๊ฐ’์ด ์‹ค์ˆ˜ํ˜•์œผ๋กœ ์š”๊ตฌ๋˜์–ด -1.0๊ณผ 0.0 ์„ ๋„ฃ์–ด์คŒ
        if a > b :
            answer.append(-1.0)
        elif a == b :
            answer.append(0.0)
        else :
            n = 0 # ์‚ฌ๋‹ค๋ฆฌ๊ผด ๋„“์ด ํ•ฉ๊ณ„
            for A in range(a, b) :
                n += 0.5*(y_lst[A] + y_lst[A+1])
            answer.append(n)
            
    return answer

 

๋Œ“๊ธ€