Problem Solving/[ํ•ญํ•ด99] TIL

99ํด๋Ÿฝ ์ฝ”ํ…Œ ์Šคํ„ฐ๋”” 23์ผ์ฐจ TIL / ์™„์ „ํƒ์ƒ‰

geum 2024. 11. 19. 20:09

โœ๏ธ ๋ฌธ์ œ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Programmers] ์†Œ์ˆ˜ ์ฐพ๊ธฐ(https://school.programmers.co.kr/learn/courses/30/lessons/42839)

 

ํ•œ์ž๋ฆฌ ์ˆซ์ž๊ฐ€ ์ ํžŒ ์ข…์ด ์กฐ๊ฐ์ด ํฉ์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ํฉ์–ด์ง„ ์ข…์ด ์กฐ๊ฐ์„ ๋ถ™์—ฌ ์†Œ์ˆ˜๋ฅผ ๋ช‡ ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ข…์ด ์กฐ๊ฐ์— ์ ํžŒ ์ˆซ์ž๊ฐ€ ์ ํžŒ ๋ฌธ์ž์—ด numbers๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ข…์ด ์กฐ๊ฐ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์†Œ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

์ œํ•œ์‚ฌํ•ญ

  • numbers๋Š” ๊ธธ์ด 1 ์ด์ƒ 7 ์ดํ•˜์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • numbers๋Š” 0~9๊นŒ์ง€ ์ˆซ์ž๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • "013"์€ 0, 1, 3 ์ˆซ์ž๊ฐ€ ์ ํžŒ ์ข…์ด ์กฐ๊ฐ์ด ํฉ์–ด์ ธ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

 

๐Ÿค– ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

 

๐Ÿง ๋‚œ์ด๋„/์†Œ์š” ์‹œ๊ฐ„

โœ… ๋‚œ์ด๋„: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Level.2

โœ… ์†Œ์š” ์‹œ๊ฐ„: 20๋ถ„

โœ… ๊ถŒ์žฅ ์‹œ๊ฐ„: 1์‹œ๊ฐ„ 15๋ถ„

 

ํ”ผ๋กœ๋„ ๋ฌธ์ œ์˜ DFS ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํ‘ผ ๊ฑฐ๋ผ ์†Œ์š” ์‹œ๊ฐ„+30~35๋ถ„ ์ •๋„ ํ•ด์•ผ 100% ๋‚ด ํž˜์œผ๋กœ ํ‘ผ ์‹œ๊ฐ„์œผ๋กœ ์น  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

๐Ÿ’ก ํ’€์ด

1) ๋ฌธ์ œ ์ดํ•ด

์–ด์ œ ํ‘ผ ํ”ผ๋กœ๋„ ๋ฌธ์ œ์™€ ๋™์ผํ•˜๊ฒŒ ๋ฌธ์ œ์— ์ ํžŒ๋Œ€๋กœ ์ญ‰ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋‹ค. numbers๊ฐ€ ์ตœ๋Œ€ ๊ธธ์ด๋กœ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ 13,699๊ฐœ์˜ ์กฐํ•ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ์™„์ „ํƒ์ƒ‰์œผ๋กœ ์ถฉ๋ถ„ํžˆ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„์ด๋‹ค.

 

ํ”ผ๋กœ๋„ ๋ฌธ์ œ ๋•Œ์ฒ˜๋Ÿผ permutations ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ๊ธˆ๋ฐฉ ํ’€๋ ธ๊ฒ ์ง€๋งŒ ๋„ˆ๋ฌด ๋‚ด์žฅ ํ•จ์ˆ˜์— ์˜์กดํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„ ์ด๋ฒˆ์—๋Š” DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€์–ด๋ดค๋‹ค.

 

2) ์•„์ด๋””์–ด ํ๋ฆ„

๋ฌธ์ œ ํ’€์ด๋ฅผ ์œ„ํ•ด ์•„์ฃผ ๋Ÿฌํ”„ํ•˜๊ฒŒ ๋– ์˜ฌ๋ฆฐ ๊ตฌํ˜„ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ผ๋‹จ ํฐ ํ‹€๋งŒ ์ •๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๊ฐ„๋‹จํ•จ!

 

โ‘  ์ฃผ์–ด์ง„ numbers ๋ฌธ์ž์—ด๋กœ๋ถ€ํ„ฐ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž ๋ชจ๋‘ ๋งŒ๋“ค๊ธฐ

 

โ‘ก ์†Œ์ˆ˜ ํŒ๋ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

 

โ‘ข ์†Œ์ˆ˜ ํŒ๋ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด ๋งŒ๋“ค์–ด์ง„ ์ˆซ์ž ํ™•์ธ

 

โ‘ฃ ์ „์ฒด ์†Œ์ˆ˜ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ

 

3) DFS์˜ ์—ญํ•  ๋ฐ ์ž‘๋™ ๋ฐฉ์‹

1๏ธโƒฃ ์—ญํ• 

DFS๋Š” 2)-โ‘  ๊ณผ์ •์—์„œ ์“ฐ์ธ๋‹ค. ์ข€ ๋” ํ’€์–ด์„œ ์„ค๋ช…ํ•˜๋ฉด '์ˆซ์ž๋ฅผ ์ด์–ด ๋ถ™์—ฌ ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• '์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์žฌ๊ท€๋ฅผ ํ†ตํ•ด ํ•œ ์ž๋ฆฌ ์ˆ˜, ๋‘ ์ž๋ฆฌ ์ˆ˜, ... ์ฒ˜๋Ÿผ ์ ์ฐจ ๊ธธ์ด๋ฅผ ๋Š˜๋ ค๊ฐ€๋ฉฐ numbers ๋ฌธ์ž์—ด์—์„œ ์ƒˆ๋กœ์šด ์ˆซ์ž๋ฅผ ์ฐพ์•„ ๋‚˜๊ฐ„๋‹ค. ์ฆ‰ DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด permutations ํ•จ์ˆ˜ ์—†์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

2๏ธโƒฃ ์ž‘๋™ ๋ฐฉ์‹

  • DFS ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๋งŒ๋“  ์ˆซ์ž, ๋‚จ์€ ์ˆซ์ž๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ  ์ด๋•Œ ๋‘ ์ธ์ž์˜ ์ž๋ฃŒํ˜•์€ ๋ชจ๋‘ ๋ฌธ์ž์—ด
  • ํ˜„์žฌ ๋งŒ๋“  ์ˆซ์ž๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ๋ฉด ์ˆซ์ž ํ›„๋ณด ์ง‘ํ•ฉ์— ์ถ”๊ฐ€
  • ํ˜„์žฌ ๋งŒ๋“  ์ˆซ์ž์™€ ๋‚จ์€ ์ˆซ์ž๋ฅผ ํ™œ์šฉํ•ด DFS ํ•จ์ˆ˜ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
# DFS ํ˜ธ์ถœ ํ๋ฆ„

numbers = "123"
candidates = set()

def DFS(path, remaining):
    if path:
        candidates.add(int(path))

    for i in range(len(remaining)):
        DFS(path + remaining[i], remaining[:i] + remaining[i+1:])

DFS("", numbers)

print(candidates)

 

DFS("", "123"): path๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ for๋ฌธ ์‹คํ–‰

DFS("1", "23"): path๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— candidates ์ง‘ํ•ฉ์— 1 ์ถ”๊ฐ€

DFS("12", "3"): candidates ์ง‘ํ•ฉ์— 12 ์ถ”๊ฐ€

DFS("123", ""): candidates ์ง‘ํ•ฉ์— 123 ์ถ”๊ฐ€

 

์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ numbers ๋ฌธ์ž์—ด์—์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ˆซ์ž๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 

4) ์†Œ์ˆ˜ ํŒ๋ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์†Œ์ˆ˜ ํŒ๋ณ„์€ ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

๋‚˜๋Š” ์†Œ์ˆ˜ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ๋ณดํ†ต ์ „์ฒด ์†Œ์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋‘๋Š”๋ฐ ์ด ๋ฌธ์ œ์—์„œ๋Š” ์ข€ ๋” ๋น ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์จ๋ดค๋‹ค. ํ•˜๋‚˜๋ผ๋„ ๋‚˜๋ˆ„์–ด์ง€๋Š” ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด False๋ฅผ ๋ฆฌํ„ดํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ๋น ์ ธ๋‚˜์˜ค๊ณ , ๋ฏธ๋ฆฌ ๋น ์ ธ๋‚˜์˜ค์ง€ ๋ชปํ•˜๋ฉด True๋ฅผ ๋ฆฌํ„ดํ•ด์„œ ์†Œ์ˆ˜๋กœ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์ผ๋‹ค.

 

5) ๊ตฌํ˜„

def is_prime(number):
    if number < 2:
        return False
    else:
        for i in range(2, int(number**0.5)+1):
            if number%i == 0:
                return False
        
        return True
    
def solution(numbers):
    answer = 0
    
    # DFS๋กœ ์ˆซ์ž ์ƒ์„ฑ(permutations ํ•จ์ˆ˜๋ฅผ ์•ˆ ์“ฐ๋Š” ๋ฐฉ๋ฒ•)
    def DFS(current_num, remaining):
        nonlocal candidates
        
        if current_num:
            candidates.add(int(current_num))
            
        for i in range(len(remaining)):
            DFS(current_num+remaining[i], remaining[:i]+remaining[i+1:])
    
    candidates = set()
    
    DFS("", numbers)
    
    for num in candidates:
        if num != 0 and is_prime(num):
            answer += 1
            
    return answer

 

6) ์–ด๋ ค์› ๋˜ ์ /๋ฐฐ์šด ์ 

๐Ÿšจ ์–ด๋ ค์› ๋˜ ์ 

  • ์ฐธ๊ณ ํ•  ์ฝ”๋“œ๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฒŒ ์‰ฝ์ง€ ์•Š์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค. - ์˜ค๋Š˜์€ permutations ํ•จ์ˆ˜๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  ์™„์ „ํƒ์ƒ‰ ๋ฌธ์ œ๋ฅผ ํ•˜๋‚˜ ๋” ํ’€์–ด๋ด์•ผ๊ฒ ๋‹ค.

โ— ๋ฐฐ์šด ์ 

  • nonlocal ํ‚ค์›Œ๋“œ์˜ ์˜๋ฏธ!