해결된 질문
작성
·
136
0
안녕하세요, 강의를 듣고 계신 여러분!
여러분의 학습을 돕기 위해 질문 안내를 드리고자 합니다.
단순한 의문은 chatGPT를 이용해도 해답을 찾을 수 있는 경우가 종종 있습니다!
강의의 어느 파트에서 의문을 느끼고, 어떤 부분이 궁금한지를 명확히 제시해 주시면 답변에 도움이 됩니다!
자신은 어떻게 이해했는지 또한 적어주면 좋습니다!
강의 중 브루트포스 알고리즘 마지막
백준 1342번 행운의 문자열 문제입니다.
순열로 접근한 처음 코드 시간 초과 후
선생님 강의 설명을 들으면서 백트래킹으로 수정했는데요,
근데,, 로직은 거의 차이가 없고
다만 초기화나 선언 등 순서의 차이 같은데,
저는 시간 초과를 해결 하지 못했고,
선생님 코드를 복붙,,, 했더니 성공하더라구요 😓
그래서 어떤 차이 분석을 할 수 있을지 질문 남깁니다.
코드는 아래와 같고 풀이2번을 참고하였습니다.(시간초과 코드입니다)
import sys
input = sys.stdin.readline
s = input()
choice = []
dic = dict()
chars = set()
cnt = 0
for l in s:
chars.add(l)
if l not in dic: dic[l] = 0
dic[l] += 1
def dfs(level):
global cnt, choice, dic
if level == len(s):
cnt += 1
return
for l in chars:
if dic[l] == 0: continue
if (not choice) or (choice[-1] != l):
dic[l] -= 1
choice.append(l)
dfs(level + 1)
dic[l] += 1
choice.pop()
dfs(0)
print(cnt)
답변 2
1
안녕하세요. zhu님!
sys.stdin.readline을 사용하신게 문제로 보여집니다.
sys.stdin.readline은 입력의 끝에 개행 문자를 포함합니다. 이를 처리하지 않으면 문자열의 길이가 예상보다 길어질 수 있으며, 이는 문자열을 순회하는 DFS 함수의 성능에 영향을 미칠 수 있습니다.
아무래도 채점 과정에 사용한 문자열 중 개행 문자와 관련된 문자열이 포함되어 시간 초과가 난 것으로 추측됩니다.
따라서 input = sys.stdin.readline을 빼주시거나, s = input().rstrip()로 개행을 제거하여 문자열을 받으면 정상적으로 시간초과 없이 정답처리 되는 것을 확인 하실 수 있습니다.
혹시라도 sys.stdin.realine을 사용하시려면, 다음과 같이 사용하시는걸 추천드립니다.
import sys
input = lambda: sys.stdin.readline().rstrip()
또 궁금하신 점 있으시면 언제든 질문 부탁드립니다.
감사합니다. :)
1
안녕하세요, 인프런 AI 인턴입니다.
주신 코드를 분석해보면, 시간 초과의 주된 원인은 아마도 매 dfs 호출 시마다 for l in chars:
루프가 chars의 모든 원소에 대해 실행되기 때문일 것입니다. 여기서 chars
는 입력된 문자열에서 중복을 제거한 문자들의 집합입니다. 이 접근법은 특히 문자열 s의 길이가 길고, 사용되는 문자의 종류가 많을 때, 각 dfs 단계에서 많은 반복을 발생시킬 수 있습니다.
최적화 방안으로는, 백트래킹 과정에서 불필요한 반복을 줄이기 위해 이미 사용한 문자나 특정 조건을 만족하지 않는 문자에 대한 검사를 더 효율적으로 할 수 있는 방법을 모색해보는 것입니다. 예를 들어, 선택된 문자열의 조건을 만족하면 다음 문자 선택에 있어서 더 좋은 선택을 할 수 있는 방향으로 로직을 조정할 수 있습니다.
또 하나의 중요한 부분은 실행 시간에 영향을 미칠 수 있는 입력 방식입니다. input = sys.stdin.readline
은 입력을 더 빠르게 받기 위해 사용되지만, 문자열의 마지막에 ‘\n’이 포함될 수 있으니 처리에 유의해야 합니다. 만약 코드 상에서 이 부분이 적절히 처리되지 않았다면, 기대와 다른 동작을 할 수 있습니다.
선생님의 코드와 주신 코드 사이의 차이 분석에 있어서, 선언의 순서나 초기화 방식 외에도, 각각의 조건문과 반복문이 알고리즘의 효율성에 어떻게 영향을 미치는지를 세심하게 분석해보는 것이 중요합니다. 특히 백트래킹 알고리즘은 그 구조상 작은 차이가 전체 성능에 큰 영향을 미칠 수 있으므로, 선생님의 코드와의 세부적인 차이를 다시 한번 꼼꼼히 확인해보시기 바랍니다.