๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๐Ÿ’ก/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์†Œ์ˆ˜ ์ฐพ๊ธฐ _ ํŒŒ์ด์ฌ

by @ENFJ 2024. 6. 16.

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

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

* ์†Œ์ˆ˜๋Š” 1๊ณผ ์ž๊ธฐ ์ž์‹ ์™ธ์— ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

 

1. ์ˆซ์ž ์กฐ๊ฐ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ˆซ์ž ์กฐํ•ฉ ์ฐพ๊ธฐ

python ์˜ itertools ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ชจ๋“  ์กฐํ•ฉ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” permutations ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

from itertools import permutations

def get_all_combinations(numbers):
	all_combinations = set() # set ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต๋œ ์ˆซ์ž๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
    
    # 1์ž๋ฆฌ๋ถ€ํ„ฐ len(numbers) ์ž๋ฆฌ๊นŒ์ง€์˜ ๋ชจ๋“  ์กฐํ•ฉ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
    for i in range(1, len(numbers) + 1):
    	# permutations ๋ฅผ ์‚ฌ์šฉํ•ด i ์ž๋ฆฌ์˜ ๋ชจ๋“  ์กฐํ•ฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
        for combo in permutations(numbers, i ):
        # tuple์„ ๋ฌธ์ž์—ด๋กœ ํ•ฉ์ณ์„œ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
        number = int(''.join(combo))
        # set์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
        all_combinations.add(number)
   return all_combinations

 

 

  • permutations(numbers, i)๋Š” numbers์—์„œ i๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์„ ํƒํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ˆœ์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ''.join(combo)๋Š” tuple๋กœ ๋œ ์กฐํ•ฉ์„ ๋ฌธ์ž์—ด๋กœ ํ•ฉ์นฉ๋‹ˆ๋‹ค.
  • int()๋Š” ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • set์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต๋œ ์ˆซ์ž๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

 

2. ์†Œ์ˆ˜ ํŒ๋ณ„ ํ•จ์ˆ˜ ์ž‘์„ฑ

 

์ฃผ์–ด์ง„ ์ˆซ์ž๊ฐ€ ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

def is_prime(n):
	if n < = 1:
    	return False # 1 ์ดํ•˜์˜ ์ˆซ์ž๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
	if n == 2:
    	return True # 2๋Š” ์†Œ์ˆ˜์ž…๋‹ˆ๋‹ค.
	if n % 2 == 0 :
    	return False  # ์ง์ˆ˜๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
	# 3๋ถ€ํ„ฐ n์˜ ์ œ๊ณ ๊ธ‰๊นŒ์ง€์˜ ํ™€์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    for i in range (3, int(n ** 0.5) + 1 , 2):
    	if n % i == 0:
        	return False # i ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด ์†Œ์ˆ˜๊ฐ€ ์•„๋‹˜
	return True # ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์œผ๋ฉด ์†Œ์ˆ˜ ์ž…๋‹ˆ๋‹ค.
    

#ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ
print(is_prime(29)) # True
print(is_prime(30)) # False

 

  • 1 ์ดํ•˜์˜ ์ˆซ์ž๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • 2๋Š” ์œ ์ผํ•œ ์ง์ˆ˜ ์†Œ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ์ˆ˜๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • 3๋ถ€ํ„ฐ n\sqrt{n}๊นŒ์ง€์˜ ๋ชจ๋“  ํ™€์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋ณด์•„ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด ์†Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

 

for ๋ฌธ ๊ตฌ์กฐ ์„ค๋ช…

for i in range(3, int(n ** 0.5) + 1, 2): ๊ตฌ๋ฌธ์€ 3๋ถ€ํ„ฐ n\sqrt{n}๊นŒ์ง€์˜ ํ™€์ˆ˜๋งŒ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ์†Œ์ˆ˜ ํŒ๋ณ„์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

range ํ•จ์ˆ˜ ์ดํ•ด
range(start, stop, step) ํ•จ์ˆ˜๋Š” start์—์„œ ์‹œ์ž‘ํ•˜์—ฌ stop ์ „๊นŒ์ง€ step ๊ฐ„๊ฒฉ์œผ๋กœ ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

 

for i in range(3, int(n ** 0.5) + 1, 2):

 

์ด ๋ถ€๋ถ„์„ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. start = 3: 3๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. 2๋Š” ์ด๋ฏธ ์ฒ˜๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™€์ˆ˜์ธ 3๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. stop = int(n ** 0.5) + 1: n\sqrt{n}์˜ ์ •์ˆ˜ ๋ถ€๋ถ„์— 1์„ ๋”ํ•œ ๊ฐ’๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, n์ด 25๋ผ๋ฉด 25=5\sqrt{25} = 5์ด๋ฏ€๋กœ, range(3, 6, 2)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  3. step = 2: 2์”ฉ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ™€์ˆ˜๋งŒ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

3. ๋ชจ๋“  ์กฐํ•ฉ์— ๋Œ€ํ•ด ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„

์•ž์„œ ๋งŒ๋“  ์กฐํ•ฉ๊ณผ ์†Œ์ˆ˜ ํŒ๋ณ„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ตœ์ข…์ ์œผ๋กœ ์†Œ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์…‰๋‹ˆ๋‹ค.

def solution(numbers):
	all_combinations = get_all_combinations(numbers)
    prime_count = 0
    for number in all cobinations:
    	if is_prime(number):
        	prime_count += 1
	return prime_count

# ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ
print(solution("17")) # 3
print(solution("011")) # 2

 

  • get_all_combinations(numbers)๋ฅผ ํ˜ธ์ถœํ•ด ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ˆซ์ž ์กฐํ•ฉ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์กฐํ•ฉ ์ˆซ์ž๊ฐ€ ์†Œ์ˆ˜์ธ์ง€ is_prime(number) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์ˆ˜์ธ ๊ฒฝ์šฐ prime_count๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค

 

 

์ „์ฒด ์ฝ”๋“œ

from itertools import permutations

def get_all_combinations(numbers):
    all_combinations = set()
    for i in range(1, len(numbers) + 1):
        for combo in permutations(numbers, i):
            number = int(''.join(combo))
            all_combinations.add(number)
    return all_combinations

def is_prime(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    for i in range(3, int(n ** 0.5) + 1, 2):
        if n % i == 0:
            return False
    return True

def solution(numbers):
    all_combinations = get_all_combinations(numbers)
    prime_count = 0
    for number in all_combinations:
        if is_prime(number):
            prime_count += 1
    return prime_count

# ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ
print(solution("17"))  # 3
print(solution("011")) # 2