๐Ÿงฉ Algorithm/SWEA

[Programmers] L1. ๊ธฐ์‚ฌ๋‹จ์›์˜ ๋ฌด๊ธฐ (Python)

devCloud 2024. 11. 7. 17:27
728x90

[๋ฌธ์ œ ๋งํฌ] ๐Ÿ‘‡

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr


ํ’€์ด ๋ฐฉ๋ฒ•

์•ฝ์ˆ˜ ๊ตฌํ•˜๊ธฐ

์•ฝ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 1๋ถ€ํ„ฐ sqrt(i)๊นŒ์ง€๋งŒ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, i๊ฐ€ 36์ด๋ผ๋ฉด 1 x 36, 2 x 18, 3 x 12, 4 x 9, 6 x 6 ๋“ฑ์˜ ์•ฝ์ˆ˜๋ฅผ ๊ฐ€์ง€๋ฉฐ, sqrt(36) ์ดํ›„๋กœ๋Š” ์ค‘๋ณต ๊ณ„์‚ฐ์ด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ฝ์ˆ˜์˜ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ์ด ํ›จ์”ฌ ๋นจ๋ผ์ ธ ์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • 6์˜ ์•ฝ์ˆ˜๋Š” [1, 2, 3, 4, 6, 9, 12, 18, 36] ์ด ์žˆ๋‹ค.
  • ์•ฝ์ˆ˜ 6 ์ดํ›„๋กœ๋Š” ๋‹ค์‹œ ์ž‘์€ ์ˆ˜์™€ ๊ณฑํ•˜๋ฉด์„œ ํ™•์ธํ•˜๋Š”๋ฐ ์ด๋ฏธ ์•ž์—์„œ ๊ณ„์‚ฐ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ๊ณ„์‚ฐ์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ œ๊ณฑ๊ทผ์„ ํ†ตํ•ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ด์„œ ์‹œ๊ฐ„ ๋‹จ์ถ•์„ ํ•ด์•ผ ํ•œ๋‹ค.

 

์ œ๊ณฑ๊ทผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•

 

1๏ธโƒฃ 1. math.sqrt()

import math
math.sqrt(36) # 6.0

 

2๏ธโƒฃ 2. ์ œ๊ณฑ(**)

36**0.5 # 6.0

 

 

โ˜… ์˜ˆ์‹œ

for i in range(1, number + 1):
    for j in range(1, int(i**0.5) + 1):
    	...

 

Solution

def solution(number, limit, power):
    answer = 0

    for i in range(1, number + 1):
        divisor_cnt = 0
        # ์•ฝ์ˆ˜ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ์„ 1๋ถ€ํ„ฐ sqrt(i)๊นŒ์ง€๋งŒ ์ง„ํ–‰
        for j in range(1, int(i**0.5) + 1):
            if i % j == 0:
                divisor_cnt += 1
                if j != i // j:  # ์ œ๊ณฑ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ๋‹ค๋ฅธ ์Œ์„ ์ถ”๊ฐ€
                    divisor_cnt += 1
                
            if divisor_cnt > limit:  # ์ œํ•œ ์ˆ˜์น˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ค‘๋‹จ
                divisor_cnt = power
                break

        answer += divisor_cnt if divisor_cnt <= limit else power

    return answer
  • j๋ฅผ 1๋ถ€ํ„ฐ sqrt(i)๊นŒ์ง€๋งŒ ์ˆœํšŒํ•˜์—ฌ ์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.
  • ์•ฝ์ˆ˜ j๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด, i // j๋„ ์•ฝ์ˆ˜๊ฐ€ ๋œ๋‹ค. ์ด๋•Œ, j์™€ i // j๊ฐ€ ๊ฐ™์ง€ ์•Š์œผ๋ฉด ์•ฝ์ˆ˜ ๊ฐœ์ˆ˜๋ฅผ ๋‘ ๋ฒˆ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • divisor_cnt๊ฐ€ limit์„ ์ดˆ๊ณผํ•˜๋ฉด power๋กœ ์„ค์ •ํ•˜๊ณ  break๋กœ ๋ฃจํ”„๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.
  • ์ตœ์ข… answer์— ์•ฝ์ˆ˜ ๊ฐœ์ˆ˜ ๋˜๋Š” power๋ฅผ ๋”ํ•ด ๋ฌด๊ฒŒ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

 

์ถ”๊ฐ€ ์„ค๋ช…

if j != i // j:  # ์ œ๊ณฑ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ๋‹ค๋ฅธ ์Œ์„ ์ถ”๊ฐ€
     divisor_cnt += 1
  • ์œ„ ์กฐ๊ฑด๋ฌธ์€ ์ค‘๋ณต ์•ฝ์ˆ˜๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, i = 36์ผ ๋•Œ, ์•ฝ์ˆ˜์Œ์„ ํ†ตํ•ด ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์•ฝ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  • ์•ฝ์ˆ˜์Œ์„ ํ™•์ธํ•  ๋•Œ, j๊ฐ€ 1๋ถ€ํ„ฐ sqrt(i)๊นŒ์ง€ ํƒ์ƒ‰๋œ๋‹ค.
    • j = 1 ์ผ ๋•Œ, i // j = 36. ๋”ฐ๋ผ์„œ ์•ฝ์ˆ˜๋Š” 1๊ณผ 36.
    • j = 2 ์ผ ๋•Œ, i // j = 18. ๋”ฐ๋ผ์„œ ์•ฝ์ˆ˜๋Š” 2์™€ 18.
    • j = 3 ์ผ ๋•Œ, i // j = 12. ๋”ฐ๋ผ์„œ ์•ฝ์ˆ˜๋Š” 3๊ณผ 12.
    • j = 4 ์ผ ๋•Œ, i // j = 9. ๋”ฐ๋ผ์„œ ์•ฝ์ˆ˜๋Š” 4์™€ 9.
    • j = 6 ์ผ ๋•Œ, i // j = 6. ์ด๋•Œ j์™€ i // j๊ฐ€ ๊ฐ™์€ 6์ด๋ฏ€๋กœ ์ œ๊ณฑ์ˆ˜์ด๋ฉฐ, ์ค‘๋ณตํ•ด์„œ ์นด์šดํŠธํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋”ฐ๋ผ์„œ j๊ฐ€ i // j์™€ ๊ฐ™์„ ๋•Œ๋Š” ์ค‘๋ณต ์•ฝ์ˆ˜์ด๋ฏ€๋กœ, ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด if j != i // j ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ‘ฉ‍๐Ÿ’ป ํšŒ๊ณ 

์‹œ๊ฐ„ ์ดˆ๊ณผ ๋‚œ ์ฝ”๋“œ

    answer = 0
    for i in range(1, number + 1):
        divisor_cnt = 0  # ์•ฝ์ˆ˜ ๊ฐœ์ˆ˜ ์ดˆ๊ธฐํ™”

        for j in range(1, i + 1):  # ์•ฝ์ˆ˜ ๊ตฌํ•˜๊ธฐ
            if i % j == 0:
                divisor_cnt += 1  # ์•ฝ์ˆ˜ ๊ฐœ์ˆ˜
                if divisor_cnt > limit:
                    break

        if divisor_cnt > limit:  # ์ œํ•œ ์ˆ˜์น˜ ์ดˆ๊ณผ์‹œ
            answer += power
        else:
            answer += divisor_cnt

 

์•ฝ์ˆ˜ ๊ตฌํ•  ๋•Œ๋Š” ์ œ๊ณฑ๊ทผ์„ ํ•ญ์ƒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž..

 

โœ… 2024.11.09 ์žฌํ’€์ด

๋งˆ์ง€๋ง‰์— ๊ณต๊ฒฉ๋ ฅ์„ ๊ฒฐ๊ณผ๊ฐ’์— ๋ˆ„์ ํ•  ๋•Œ ๋‹จ์ˆœํžˆ cnt๋งŒ ๋”ํ•ด๋„ ๋œ๋‹ค๋Š” ๊ฑธ ์•Œ์•˜๋‹ค.

answer += cnt

 

728x90