개발 노트/알고리즘 문제

백준 11478 서로 다른 부분 문자열의 개수

LeeInGyu 2025. 3. 21. 19:42

백준 11478 서로 다른 부분 문자열의 개수

링크: 11478 서로 다른 부분 문자열의 개수

접근 방법

  • (런타임 에러)중복처리는 list로 처리
  • (런타임 에러)이미 방문했다면 돌아가도록(백트래킹) 구현
  • (해결) for 문으로 돌고, set 함수 사용

소스 코드 1, 2(RecursionError)

소스 코드 1: 91788083 제출

S = input()

# 초깃값 설정
visited = []

# 백트래킹 함수
def backtracking(index: int, track: str):
    if index == len(S):
        return

    track += S[index]
    if track not in visited:
        visited.append(track)  # 방문처리

    backtracking(index+1, track)    

# 백트래킹 실행
for idx in range(len(S)):
    backtracking(idx, "")

# 출력
print(len(visited))
  • 백트래킹으로 방문처리를 해가면서 모든 경우의 수를 탐색
  • 최대 문자열이 1000인데, 이때 RecursionError 발생

소스 코드 2: 91788610 제출

S = input()

# 초깃값 설정
visited = []

# 백트래킹 함수
def backtracking(track: str):
    if len(track) == 0:
        return

    if track not in visited:
        visited.append(track)

    backtracking(track[1:])
    backtracking(track[:-1])

# 백트래킹 실행
backtracking(S)

# 출력
print(len(visited))
  • RecursionError를 해결하고자 반복 횟수를 줄이도록 구현
  • 앞 또는 뒤의 문자를 하나씩 제거하면서 반복
  • 이 또한 최대 문자열(1000)일 때 RecursionError 발생

소스 코드 3

소스 코드 3: 91788864 제출

S = input()

# 초깃값 설정
visited = set()

for start in range(len(S)):
    for end in range(start+1, len(S)+1):
        visited.add(S[start:end])

print(len(visited))
  • 간단하게 for 문으로 반복하고, set 함수로 중복제거롤 해결

결론

  • 최근 dfs나 백트래킹 문제를 풀어서 문제가 보이면 무작정 단정지어서 풀려는 경향이 생긴듯
  • 문제의 알고리즘을 우선 판단하는 것을 잘하고 다음 단계를 준비해야할 것 같다.
728x90
반응형