sansae   5년 전

코드를 c++14로 돌렸을 때 틀렸습니다가 뜹니다.

질문 답변들에 올라온 케이스들 (그리고 예제는 물론) 올바른 결과가 나옵니다.

50개짜리 단어도 넣어봤고, 

한 글자짜리 단어 26개 등 몇몇 테스트케이스들도 넣어보았지만 모두 옳은 답을 출력했습니다.

제가 찾지 못한 반례를 찾아주세요.. ㅠㅠㅠ

제가 코드를 워낙 바보같이 짜는지라 설명을 추가합니다:

  1. 배열 pow26는 26의 거듭제곱을 미리 계산한 배열입니다. wolfram mathematica로 돌렸고, 몇번 정도 확인해본 값들입니다.
  2. array5는 단순히 5개의 수를 저장하는 구조체입니다. index도 표시할 수 있게 해놓았습니다.
  3. 단어들을 모아놓을 배열 c에 입력을 받고, d에 c와 같은 배열을 복붙합니다.
  4. array5들의 배열 arr을 잡습니다. 크기는 n(단어 개수)입니다.
  5. 배열을 평행이동시켜서 50글자가 되게 만들고, 그 앞자리는 모두 0을 채웁니다. (정확히는, 'a'-1을 채웁니다.) 가령, abc는 '0('a'-1)이 47개'abc로 바뀝니다.
  6. arr[i]의 index에 i를 넣어줍니다.
  7. arr[i]의 5개의 수에는 i번째 단어의 50개 알파벳을 10개씩 잘라 각각에 대한 정보를 저장합니다. 각각에는 10개의 문자를 26진법으로 바꾼 것을 저장합니다. 예를 들어, abc...의 모든 단어에서 'a'-1을 빼주어 123...으로 바꿔줍니다. 바뀐 수가 111...111(1 10개)2...2(2 10개)3...3(3 10개)4...4(4 10개)5...5(5 10개)라고 가정합시다. 그러면 arr[i].a1에는 1+26+26^2+26^3+... (1...11을 26진법으로 읽은 수), arr[i].a2에는 2+2*26+...(2..222을 26진법으로 읽은 수) 등을 저장합니다. 자세한 내용은 코드를...
  8. 이제 a1 a2 a3 a4 a5를 26^10진법으로 읽어 큰 순으로 비교하면 됨을 알게 됩니다. 때문에 operator <를 a1을 비교, a1이 같으면 a2 비교, 이런식으로 정의합니다.
  9. arr을 정렬합니다.
  10. erasee 배열과 strcmp함수를 잘 이용해 같은 단어를 제거해줍니다. 같은 문자가 있으면 erasee[i]=1로 지정합니다.
  11. erasee[i]가 0인 것들만 찾아 출력합니다. 여기서 3번과정에서 정의한 배열 d를 사용합니다. (배열 c는 우리가 건드렸으므로..)

위는 대략적인(?) 코드의 설명입니다.

반례를 찾아주세요.. ㅠㅠ

djm03178   5년 전

평행이동을 하는 부분이 잘못되었습니다.

2

aaaaaaaaaaaaaaaaaaaabbbbbbbbbb

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

sansae   5년 전

헐.. 이상한 실수를 했네요...

도움 주셔서 감사합니다..

그럼, 좋은 하루 보내세요~!

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