โ๏ธ ๋ฌธ์
[ํ๋ก๊ทธ๋๋จธ์ค/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 ํค์๋์ ์๋ฏธ!
'Problem Solving > [ํญํด99] TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
99ํด๋ฝ ์ฝํ ์คํฐ๋ 25์ผ์ฐจ TIL / ์์ ํ์ (0) | 2024.11.21 |
---|---|
99ํด๋ฝ ์ฝํ ์คํฐ๋ 24์ผ์ฐจ TIL / ์์ ํ์ (1) | 2024.11.20 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 22์ผ์ฐจ TIL / ์์ ํ์ (1) | 2024.11.18 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 21์ผ์ฐจ TIL / ์์ ํ์ (0) | 2024.11.17 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 19์ผ์ฐจ TIL / ๊ทธ๋ฆฌ๋ (0) | 2024.11.15 |