Problem Solving/[ν•­ν•΄99] TIL

99클럽 μ½”ν…Œ μŠ€ν„°λ”” 7일차 TIL / 완전탐색

geum 2024. 11. 3. 13:57

✏️ 문제

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

 

사전에 μ•ŒνŒŒλ²³ λͺ¨μŒ 'A', 'E', 'I', 'O', 'U'λ§Œμ„ μ‚¬μš©ν•˜μ—¬ λ§Œλ“€ 수 μžˆλŠ”, 길이 5 μ΄ν•˜μ˜ λͺ¨λ“  단어가 μˆ˜λ‘λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μ „μ—μ„œ 첫 번째 λ‹¨μ–΄λŠ” "A"이고, κ·Έλ‹€μŒμ€ "AA"이며, λ§ˆμ§€λ§‰ λ‹¨μ–΄λŠ” "UUUUU"μž…λ‹ˆλ‹€. 단어 ν•˜λ‚˜ wordκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 이 단어가 μ‚¬μ „μ—μ„œ λͺ‡ 번째 단어인지 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

 

μ œν•œμ‚¬ν•­

  • word의 κΈΈμ΄λŠ” 1 이상 5 μ΄ν•˜μž…λ‹ˆλ‹€.
  • wordλŠ” μ•ŒνŒŒλ²³ λŒ€λ¬Έμž 'A', 'E', 'I', 'O', 'U'둜만 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ€– μž…μΆœλ ₯ μ˜ˆμ‹œ

 

🧐 λ‚œμ΄λ„/μ†Œμš” μ‹œκ°„

βœ… λ‚œμ΄λ„: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ Level.2

βœ… μ†Œμš” μ‹œκ°„: 23λΆ„ 45초

βœ… ꢌμž₯ μ‹œκ°„: 1μ‹œκ°„ 15λΆ„

 

πŸ’‘ 풀이

1) 문제 μœ ν˜• νŒŒμ•…

 

μ™„μ „νƒμƒ‰μœΌλ‘œ ν’€ 수 μžˆλŠ” 문젠데 완전탐색 λŒλ¦¬λŠ” 방법도 μ—¬λŸ¬κ°€μ§€κ°€ 있기 λ•Œλ¬Έμ— μ–΄λ–€ λ°©λ²•μœΌλ‘œ 풀지 κ³ λ―Όν•΄λ³΄μ•˜λ‹€.

 

2) 아이디어 흐름

β‘  μ€‘λ³΅μˆœμ—΄?

첫 번째둜 λ– μ˜€λ₯Έ μ•„μ΄λ””μ–΄λŠ” μ€‘λ³΅μˆœμ—΄μ„ μ“°λŠ” κ²ƒμ΄μ—ˆλ‹€. 길이 1~5κΉŒμ§€ κ°€λŠ₯ν•œ λͺ¨λ“  단어λ₯Ό λ§Œλ“€κ³  μ •λ ¬ν•΄μ€€ λ’€ 주어진 단어 word의 인덱슀+1을 좜λ ₯ν•΄μ£Όλ©΄ λλ‚˜λŠ” 방법이닀. νŒŒμ΄μ¬μ—μ„œ μ œκ³΅ν•˜λŠ” itertools.product(~)λ₯Ό μ‚¬μš©ν•˜λ©΄ μ€‘λ³΅μˆœμ—΄μ„ μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

단어 길이가 μ΅œλŒ€ 5이고 λͺ¨μŒ 5개만 ν™œμš©ν•˜λŠ” 문제라 μ€‘λ³΅μˆœμ—΄λ‘œλ„ λ¬΄λ‚œν•˜κ²Œ 톡과될 것 κ°™λ‹€. ν•˜μ§€λ§Œ 파이썬 λ‚΄μž₯ 라이브러리λ₯Ό 쓰지 μ•Šκ³  직접 κ΅¬ν˜„ν•΄μ„œ 문제λ₯Ό ν’€κ³  μ‹Άμ—ˆκΈ° λ•Œλ¬Έμ— 이 방법은 일단 PASS!

 

β‘‘ BFS? DFS?

κ·Έ λ‹€μŒμœΌλ‘œ λ– μ˜¬λ¦° 방법은 λŒ€ν‘œμ μΈ 완전탐색 방법인 BFS와 DFSλ‹€. λ‚΄κ°€ 손에 읡은 방식이 BFS라 BFS λ°©μ‹μœΌλ‘œ ν’€μ–΄λ³΄κΈ°λ‘œ ν–ˆλ‹€.

 

β‘’ BFS κΈ°λ³Έ ν‹€ ꡬ상

개인적으둜 BFS의 핡심은 '큐에 μ μ ˆν•œ 값을 넣을 수 μžˆλŠ”μ§€/νμ—μ„œ popν•œ 값을 잘 ν™œμš©ν•  수 μžˆλŠ”μ§€'라고 μƒκ°ν•œλ‹€. 이 두 가지λ₯Ό μ‹ κ²½ μ“°λ©΄μ„œ 였늘자 λ¬Έμ œμ— λ§žλŠ” BFS κΈ°λ³Έ 틀을 생각해봀닀.

 

Step. 1: queue μ΄ˆκΈ°κ°’ μ„€μ •

❎ deque(["A"])

μ²˜μŒμ—λŠ” 큐에 A만 μΆ”κ°€ν•΄λ‘” μƒνƒœλ‘œ while문을 λŒλ©΄μ„œ 완전탐색을 μˆ˜ν–‰ν–ˆλŠ”λ° 이 경우 E, I, O, U둜 μ‹œμž‘ν•˜λŠ” 단어가 μ•„μ˜ˆ λ‚˜μ˜¬ μˆ˜κ°€ μ—†λ‹€λŠ” κ±Έ κΉ¨λ‹¬μ•˜λ‹€. 

 

βœ… deque(["A", "E", "I", "O", "U"])

첫 번째 방법이 잘λͺ»λμŒμ„ κΉ¨λ‹«κ³  E, I, O, U둜 μ‹œμž‘ν•˜λŠ” 단어λ₯Ό μ–΄λ–»κ²Œ λ§Œλ“€ 수 μžˆμ„μ§€ κ³ λ―Όν•˜λ‹€κ°€ ν•œ κΈ€μž μ•ŒνŒŒλ²³λ§Œ 큐에 미리 μ €μž₯해두면 λ˜κ² κ΅¬λ‚˜ μ‹Άμ—ˆλ‹€. 이 방식을 μ‚¬μš©ν•˜λ©΄ νμ—μ„œ μˆœμ„œλŒ€λ‘œ popν•˜λŠ” 과정을 톡해 A μ΄μ™Έμ˜ λͺ¨μŒ μ•ŒνŒŒλ²³μœΌλ‘œ μ‹œμž‘ν•˜λŠ” 단어도 μžμ—°μŠ€λŸ½κ²Œ λ§Œλ“€μ–΄μ§ˆ 수 μžˆλ‹€.

 

Step. 2: 단어 집합 μ΄ˆκΈ°κ°’ μ„€μ •

βœ… 단어 집합 = λ°©λ¬Έ 처리용 리슀트 μ—­ν• 

BFSλ‚˜ DFS둜 문제λ₯Ό ν’€ λ•Œ boolean μžλ£Œν˜•μœΌλ‘œ μ •μ˜λ˜λŠ” λ°©λ¬Έ 처리 λ¦¬μŠ€νŠΈλŠ” ν•„μˆ˜μ΄λ‹€. ν•˜μ§€λ§Œ μ € 방식은 이 λ¬Έμ œμ—μ„œ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜κΈ°μ—λŠ” 어렀움이 μžˆμ–΄ λ³΄μ˜€κΈ° λ•Œλ¬Έμ— 단어λ₯Ό μ €μž₯ν•΄λ‘˜ 집합을 μ •μ˜ν•΄μ€¬λ‹€.

 

ν˜„μž¬ 단어가 이미 λ§Œλ“€μ–΄μ§„ 단어인지 μ•„λ‹Œμ§€ ν™•μΈν•˜λŠ” κ³Όμ •μ—μ„œ λ¦¬μŠ€νŠΈλ³΄λ‹€ 집합이 μ’€ 더 λΉ λ₯΄κ²Œ μ²˜λ¦¬λ˜μ§€ μ•Šμ„κΉŒ? ν•˜λŠ” λ§ˆμŒμ—μ„œ set()을 μ‚¬μš©ν–ˆλ‹€.

 

Step. 3: λ‹¨μ–΄ λ§Œλ“€κΈ°

이제 νμ—μ„œ μ•ŒνŒŒλ²³μ„ ν•˜λ‚˜μ”© κΊΌλ‚΄κ³  "AEIOU"λ₯Ό  forλ¬Έ λŒλ©΄μ„œ νμ—μ„œ κΊΌλ‚Έ μ•ŒνŒŒλ²³μ— 이어 λΆ™μ—¬μ€€λ‹€. μƒˆλ‘­κ²Œ λ§Œλ“€μ–΄μ§„ 단어 길이가 5 μ΄ν•˜μΌ λ•Œλ§Œ 단어 집합에 이미 μžˆλŠ” 단어인지 ν™•μΈν•˜κ³  없을 κ²½μš°μ—λŠ” 큐에 λ„£μ–΄ 계속 νƒμƒ‰ν•΄λ‚˜κ°„λ‹€.

 

3) κ΅¬ν˜„

from collections import deque

def solution(word):
    answer = 0
    
    queue = deque(["A", "E", "I", "O", "U"])
    
    word_set = set()
    
    for char in "AEIOU":
        word_set.add(char)
    
    while queue:
        curr_word = queue.popleft()
        
        for char in "AEIOU":
            make_word = curr_word+char
            
            if len(make_word) <= 5:
                if make_word not in word_set:
                    word_set.add(make_word)
                    queue.append(make_word)
    
    word_list = sorted(list(word_set))
    
    return word_list.index(word)+1

 

4) μ–΄λ €μ› λ˜ 점/배운 μ 

🚨 μ–΄λ €μ› λ˜ 점

  • μ—†μŒ

❗ 배운 점

  • BFS/DFS 문제 풀이λ₯Ό ν•  λ•Œ λ°©λ¬Έ μ²˜λ¦¬λŠ” 무쑰건 boolν˜• λ¦¬μŠ€νŠΈμ•Ό! 이게 μ•„λ‹ˆλΌ 문제 상황에 맞게 λ°©λ¬Έ 처리 역할을 μˆ˜ν–‰ν•  수 μžˆλŠ” 리슀트λ₯Ό 슀슀둜 μ •μ˜ν•˜λŠ” 것도 μ€‘μš”ν•˜λ‹€.