cepiloth   5년 전

첫 번째 입력받은 문자열과 비교 한다고 생각해서

모든 문자열에 중복을 제거하고 

첫 문자와 비교하여 카운트 하도록 구현 하였는데..

런타임 에러가 발생합니다.

접근 방법이 잘못 된거 일까요.?

djm03178   5년 전

여러 문제가 있는데 크게 unique 함수와 erase 함수에 대한 잘못된 이해, 그리고 문제도 잘못 이해하신 것이 원인입니다.

  1. unique 함수가 어떠한 중복도 발견하지 못했다면, 이는 end iterator를 반환합니다. end iterator를 erase하는 것이 안전한지는 잘 모르겠습니다.
  2. unique 함수는 string::iterator를 반환하므로, 문자열에서 이를 erase 하는 것은 그 iterator가 가리키는 문자 하나를 지우는 것입니다. 그리고 그 뒤의 문자들을 전부 한 칸씩 당겨옵니다. 예를 들어 ABBCC에서 이 작업을 수행하면, unique 함수는 ABCCC를 만들고 4번째 문자를 가리키는 iterator를 반환하는데, 여기에 erase를 수행하면 5번째에 있던 C가 하나 당겨져 와서 ABCC라는 문자열이 만들어집니다. 해결하는 방법으로는 begin부터 이 iterator까지의 substr를 빼내거나, 이 iterator부터 끝까지를 통째로 erase 하는 방법 등이 있겠네요.
  3. 애초에 문제 이해를 잘못하셨습니다. 각 문자가 몇 개 있는지가 중요한 문제인데 중복을 제거해버리면 안 되죠. 그리고 '같은 구성'이 아니라 '비슷한 구성'인 단어들을 구하는 것이므로, 첫 번째 단어와 같은지만 체크하는 게 아니라 하나의 문자를 추가하거나 빼서 같은 구성이 되는 경우까지 체크해야 됩니다.

cepiloth   5년 전

문제 이해를 잘못했네요 감사합니다.

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