inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)

브루트 포스 알고리즘 [문제풀이] : BOJ 1342

메모리 초과가 나는 이유가 궁금합니다!

해결된 질문

242

jinii915

작성한 질문수 3

0

안녕하세요, 강의를 듣고 계신 여러분!

여러분의 학습을 돕기 위해 질문 안내를 드리고자 합니다.

 

1. chatGPT를 이용해보기

 

2. 강의의 어떤 부분에 대한 질문이고, 어떤 부분이 궁금한지 명확히 알려주세요!

 

ex) 섹션5의 '그래프 순회 (DFS & BFS) [개념]' 강의에서 DFS와 BFS 모두 그래프의 모든 노드를 탐색하는 알고리즘이라고 하셨고 시간 복잡도 또한 똑같다고 이해했습니다. 그러면 DFS와 BFS 중에서 어떤 알고리즘이 더 효율적인지 구별하는 것은 의미가 없는 것일까요?

 

 

안녕하세요 선생님!

[브루트 포스 알고리즘 : BOJ 1342 행운의 문자열] 문제를 혼자 풀었는데, 메모리 초과를 해결하지 못해 질문합니다..!

permutations를 이용하여 풀고, set 함수를 사용하여 중복되는 것이 없도록 했습니다.

혹시 set 함수를 사용해서 메모리 초과가 나온 걸까요..?

from itertools import permutations

S = input()
answer = set()

for x in permutations(S, len(S)):
    ok = True

    for i in range(len(x)-1):
        if x[i] == x[i+1]:
            ok = False
            break


    if ok:
        answer.add(x)

print(len(answer))

python 코딩-테스트 알고리즘

답변 2

0

알리 Ally

안녕하세요. jinii915님!

 

풀이 과정에서 행운의 문자열을 answer set에 추가하고 있으신데요.

행운의 문자열 S의 최대 길이는 10으로 최대 10! 만큼 answer에 원소가 추가되면서 메모리 초과가 나는 것으로 추정됩니다.

최대 10!만큼 set에 들어갈 수 있는데, 그 형태가 튜플이며 그 안에는 최대 10개의 문자열이 들어가 있으므로 메모리 초과가 날 확률이 큽니다.

따라서 정답으로 출력할 행운의 문자열을 별도의 set 자료구조에 저장하는 것이 아닌, 카운트하는 방식으로 풀이를 수정해주시면 메모리 초과 이슈를 해결하실 수 있으실겁니다.

 

정확한 메모리 계산이 궁금하실 수 있는데요.

정확한 메모리 계산은 파이썬이라는 프로그래밍 언어가 어떻게 돌아가는지 알아야 알 수 있는 부분이라 알기 어렵고, 실제로 코딩테스트 문제에서도 정확한 메모리 계산 능력까지 요구하지도 않습니다.

따라서 이번 문제와 같이 자료구조를 선언하고 해당 자료구조에 넣어야 할 원소가 백만, 천만 단위를 넘어가게 되는 경우는 메모리 초과에 유의할 필요가 있다는 정도로 알아두시면 될 것 같습니다.

 

추가적으로 시간복잡도 관련 강의에서 언급한 '5000만 정도의 크기의 간단한 자료형(ex) 리스트)은 사용해도 된다' 부분은 C++ 기준이며, 파이썬 메모리을 고려해 주지 않는 문제는 좀 더 보수적으로 메모리 크기를 계산할 필요가 있습니다.

파이썬으로 코딩테스트 문제를 풀 때 메모리 계산은 관련한 내용은 코딩테스트 준비에 있어 필요한 부분인 것 같아 추후 강의 자료에 정리해서 추가 및 공유드리겠습니다.

 

또 궁금하신 점 있으시면 언제든 질문 부탁드립니다.

감사합니다. :)

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

님의 질문에 대해 답변 드리겠습니다.

일단, 메모리 초과 문제는 입력하는 문자열 S의 길이가 커질 때, permutations 함수로 생성되는 모든 순열을 메모리에 저장하려고 할 때 발생할 수 있습니다. permutations 함수를 사용하면, S의 길이가 n일 때 n!만큼의 순열이 생성되므로, 문자열의 길이가 길어질수록 매우 빠르게 메모리 사용량이 증가합니다.

특히, 중복된 문자가 있을 경우 permutations 함수는 중복된 순열도 모두 생성하기 때문에, 이를 set 함수를 통해 중복을 제거하는 과정에서도 상당한 메모리를 소모합니다. 하지만, 중복 제거를 위해 set 함수를 사용하는 것 자체가 메모리 초과의 직접적인 원인이라기 보다는, permutations 함수로 생성된 모든 순열을 메모리에 저장하는 과정에서 발생하는 메모리 초과가 더 큰 원인으로 볼 수 있습니다.

메모리 초과 문제를 해결하기 위해서는, 모든 순열을 한 번에 메모리에 저장하는 것이 아니라 필요한 순열만을 생성하거나 메모리 사용량을 줄일 수 있는 다른 방법을 고려해야 할 것입니다. 예를 들어, generator를 이용하여 필요한 순간에만 순열을 생성하거나, 알고리즘을 최적화하여 순열 생성 자체를 줄이는 방법 등이 있을 수 있습니다.

문제를 해결하는 데 도움이 되기를 바랍니다.

Iterable 관련 설명 중 의문점

1

73

1

DP 알고리즘 index 0 이유?

0

80

2

백준에서 queue.PriorityQueue() 사용 시 런타임에러가 납니다.

0

78

2

(시간 초과) BOJ 1342 관련하여 질문이 있습니다

1

79

2

BFS, DFS

0

105

2

이중연결리스트에 관한 수업 내용도 있을까요?

0

98

1

영상에서 설명이 잘못됐고 자막이 맞는 내용이라고 자막에 표기

0

113

2

최대값 int(1e6, 1e7, 1e8) 기준

0

272

2

섹션 3 BOJ 1342 //= 연산자 관련

0

87

3

라이브러리 사용

0

118

2

2번 구현 방법 질문 있습니다.

0

167

1

브루트 포스 풀이

0

144

2

다익스트라 음수 간선

0

159

1

종료 조건

0

117

2

BOJ 1342 메모리초과 관련

0

123

2

진짜 엄청나네요. 이 가격에 새로운 컨텐츠 추가라니

0

215

1

섹션3 브루트포스 알고리즘 1342 풀이1 질문

0

151

2

boj 3020

0

127

1

강의 내용 중 백트래킹 존재 여부

0

156

1

제가 공부하는 방법이 괜찮은지 궁금합니다

1

261

2

DP 11053관련 질문있습니다.

0

120

1

17609 투포인터 문제를 재귀로 풀 경우가 궁금합니다!

0

138

3

3020번 풀이 코드관련 질문있어요

0

171

2

재귀 관련 문제 관찰할 때 질문

0

197

1