kjh9513   5년 전

예제 정답은 다 잘 나옵니다.

채점 결과에서 출력초과가 나오는데

어느 부분을 보완하여야 할까요?

djm03178   5년 전

말 그대로 출력 초과입니다. 출력하지 말아야 할 것을 출력하고 있기 때문에 초과가 됩니다.

문제 어디에도 중간 과정을 하나씩 다 출력하라는 이야기는 없습니다.

kjh9513   5년 전

아 저도 질문 올리고 찾아서 재채점 했습니다. 

답변 감사합니다. 그런데 이번에는 시간 초과가 뜨네요.

어느 부분을 수정해야할까요ㅜㅜ

djm03178   5년 전

string 중간에 insert를 하는 것은 그 뒤에 있던 문자열을 전부 그 길이만큼 뒤로 하나씩 옮겨야 하기 때문에 O(길이)의 시간이 걸립니다.

이를 명령의 수만큼 시행해야 할 수 있으므로 총 O(길이 * 명령어)의 시간이 소요되고, 이는 당연히 시간 초과입니다.

djm03178   5년 전

그 뿐만 아니라 지우는 동작 역시 하나씩 뒤에 있던 문자를 앞으로 당기고 있으니 마찬가지로 O(길이)의 시간이 걸립니다.

게다가 27번째 줄은 str의 길이를 넘어갈 수 있을 뿐더러, 저렇게 임의로 널 문자까지 앞으로 당겨오는 건 미정의 동작입니다.

djm03178   5년 전

팁을 드리자면, 이 문제는 이렇게 단순하게 string 객체 하나로 풀 수 있는 문제가 아닙니다. 1차원 배열의 형태로 된 자료구조에서는 중간에 뭔가를 껴넣거나 지우는 데에 반드시 O(길이)의 시간이 소요될 수밖에 없습니다.

그 작업들을 O(1)에 할 수 있는 링크드 리스트나 스택 2개를 이용한 풀이 등을 생각해 보세요.

kjh9513   5년 전

string의 erase메소드로 해결했습니다.

좋은 팁 감사합니다.

리스트와 스택으로 푸는 방법으로도 시도해보겠습니다.

감사합니다 !

djm03178   5년 전

저게 통과가 되긴 되는군요. erase가 빠르긴 하네요.

kjh9513   5년 전

엄청난 메모리를 먹으면서 턱걸이로 통과되는거 같네요,,,

djm03178   5년 전

원소 하나씩에 대해 naive하게 옮기면 시간복잡도상 통과가 안 돼야 하긴 하는데, erase가 memmove를 사용해서 좀 더 원초적으로 빠른 연산이 가능한가 봅니다.

최악의 케이스가 안 들어있는 건 아닌지 확인해봐야겠습니다.

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