qopwer4345   2달 전

어디서 메모리 초과가 나는지 미치겠슴다..

nahwasa   2달 전

전체적으로 시간복잡도, 공간복잡도에서 비효율적으로 보이는 부분이 꽤 보입니다.

1. List를 쓰신 이유가 있나요? D 연산에서 정말 시뮬레이션으로 삭제를 하신다면 LIST가 맞겠으나, 여기선 아닙니다.

C#의 리스트는 다른지 모르겠으나, $"{arr[i]}" 연산 하나마다 O(N) 입니다. List로 진행하고 특정 위치의 원소를 출력한다면 최소한 Enumerator 라도 쓰셔야합니다.

한번 라이브러리 없이 List를 한번 직접 짜보시길 바랍니다. 그래야 현재 짜고있는거에서 배열을 써야할지 리스트를 써야할지 알 수 있어요.

시간 복잡도 상으로도 그렇고, 메모리 상으로도 sr.ReadLine().Trim('[', ']').Split(',').ToList(); 부분에서 이미 메모리를 더 먹습니다.

GC가 언젠가 제거해준다고 해도, 적어도 해당 시점에서 Split된 배열과 List가 동시에 존재할테니 이미 2배죠.

2. 출력 부분도 마찬가지입니다.

for (int i = left; i <= right; i++)
      str += $"{arr[i]},";
if (str.Length > 1)
sb.AppendLine(str.Substring(0, str.Length - 1) + "]");

에서 str에서 계속 새로운 문자열이 생성되고 중복되고(GC가 어느순간엔가 지워주겠지만)

거기에 겨우 마지막 ',' 삭제에 메모리 부하가 큰 str.subsgtring를 써서 다시 중복되고, 거기에 또 '+"]"'하면서 다시 중복됩니다.

StringBuilder를 쓰신 의미가 없습니다.


---


따라서 콕 찝어서 어디서 난다! 라고 말씀드리기 힘들어서 아직 댓글이 안달렸지 않나 싶습니다.

위에서 말해드린 부분을 좀더 메모리를 생각하면서 짜보시면 통과되실것같아요!

kms1844   2달 전

좀 해보니까 

sb쓰시는 부분은 그냥 arr를 통채로 string으로 만드는

string.join을 쓰시면 편할꺼 같습니다.

WriteLine($"[{string.Join(',', arr)}]");

list는 그냥 int로 받으시면 될꺼같습니다.

var list = ReadLine().Split(new string[] { ",", "[", "]" }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToList();

댓글을 작성하려면 로그인해야 합니다.