Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 소프티어
- Lv. 2
- 동적계획법
- bfs
- Python
- 오블완
- dfs
- 깊이 우선 탐색
- javascript
- C언어
- 너비 우선 탐색
- Dynamic Programming
- join
- softeer
- Lv. 3
- 티스토리챌린지
- 프로그래머스
- 파이썬
- LEVEL 2
- level 3
- Lv. 0
- select
- SQL 고득점 KIT
- Lv. 1
- programmers
- SQL
- DP
- Java
- group by
- 자바스크립트
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 4] 단어 퍼즐 {언어 : Python} 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12983?language=python3
정답 코드
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로 리팩토링을 하면 좋을 것 같다.
'알고리즘 > 풀었지만 다시 보기' 카테고리의 다른 글
코드트리 | 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 |