Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        250x250
    
    
  | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
                            Tags
                            
                        
                          
                          - Dynamic Programming
- SQL
- softeer
- bfs
- join
- Python
- programmers
- javascript
- Baekjoon
- 자바스크립트
- Java
- 백준
- 너비 우선 탐색
- Lv. 1
- 오블완
- SQL 고득점 KIT
- Lv. 3
- 파이썬
- LEVEL 2
- 동적계획법
- Lv. 0
- dfs
- level 3
- group by
- 깊이 우선 탐색
- DP
- Lv. 2
- 소프티어
- 프로그래머스
- 티스토리챌린지
                            Archives
                            
                        
                          
                          - Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 4] 단어 퍼즐 {언어 : Python} 본문
728x90
    
    
  문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12983?language=python3
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
정답 코드
from collections import deque
def solution(strs, t):
    n = len(t)
    answer = -1
    lengthDict = dict()
    for s in strs:
        length = len(s)
        if not lengthDict.get(length, 0):
            lengthDict[length] = dict()
        lengthDict[length][s] = 1
    listT = list(t)
    visited = [0] * (n+1)
    dq = deque([])
    for i in range(min(n, 5), 0, -1):
        string = "".join(listT[:i])
        if lengthDict.get(i, 0) and lengthDict[i].get(string, 0):
            dq.append(i)
            visited[i] = 1
    
    while dq:
        length = dq.popleft()
            
        for i in range(min(length+5, n), length, -1):
            string = "".join(listT[length:i])
            newLen = i - length
            if lengthDict.get(newLen, 0) and lengthDict[newLen].get(string, 0) and visited[i] == 0:
                visited[i] = visited[length] + 1
                dq.append(i)
    if visited[n]:
        answer = visited[n]
    return answer풀이 방법
- 길이를 key로 dict()를 value로 하는 딕셔너리를 만든다.
- 이 딕셔너리에 길이에 맞게 strs의 요소들을 저장한다.
- t를 list로 분해한다.
- 인덱싱을 이용해서 1~5만큼의 길이로 제단하고 딕셔너리에 있는지 확인한다.
- visited를 이용해서 현재 지점에 값이 있을 경우 이미 도달한 최소 count가 있는 것이므로 중복해서 탐색하는 일을 없게 만든다.
- 이후 visited의 n번째 인덱스에 값이 있으면 strs의 요소들로 t를 만들 수 있는 것이므로 visited[n]값을 answer로 치환하면 끝!

느낀점
- 시간초과가 나는 이유를 이미 탐색한 부분을 중복해서 탐색하기 때문이라고 판단했다.
- 예를들어 abcdabcdabcd가 t이고 strs의 요소가 [abcd, a, b, c, d]라고 한다면
- abcd만큼 탐색 했을 때가 최소 이고
- a + b + c + d만큼 탐색했을 때는 이미 abcd가 visited[4]부분에 값을 저장했고 이 값이 최소이므로 탐색을 하지 못하게 만든다는 말이다.
 
- 해가 거듭될 수록 같은 레벨이라도 오래된 문제는 비교적 쉬운 것 같다.
- 다음에 javascript로 리팩토링을 하면 좋을 것 같다.
728x90
    
    
  '알고리즘 > 풀었지만 다시 보기' 카테고리의 다른 글
| 코드트리 | HashMap / 세 수의 합 {언어 : Python} (0) | 2025.01.14 | 
|---|---|
| 백준 GOLD 4 [1504번] 특정한 최단 경로 {언어 : Python} (0) | 2024.12.24 | 
| 프로그래머스 [Lv. 4] 가사 검색 {언어 : JavaScript} (3) | 2024.12.09 | 
| 프로그래머스 [Lv. 4] [3차] 자동완성 {언어 : JavaScript} (0) | 2024.12.04 | 
| 프로그래머스 [Lv. 4] 쿠키 구입 {언어 : JavaScript} (0) | 2024.11.27 | 
 
                   
                   
                  