ENCRYPT 왜 오답일까요 제가 컴파일하면 잘만 값이 나오는데 ㅠㅠ

  • xglove1
    xglove1

    #include
    int main(){
    int tCase;
    char pword[10][101] = {'\0'};
    char buf;
    scanf("%d", &tCase);
    scanf("%c", &buf);
    for(int n = 0 ; n < tCase; n++)

    gets(pword[n]);
    for(int n = 0 ; n < tCase; n++){
    for(int i=0; pword[n][i] != '\0' ; i+=2)
    printf("%c",pword[n][i]);
    for(int i=1; pword[n][i] != '\0' ; i+=2)
    printf("%c",pword[n][i]);
    printf("\n");
    }
    getchar();
    return 0;
    }


    10년 전
10개의 댓글이 있습니다.
  • wayway
    wayway

    for(int n = 0 ; n < tCase; n++) 2개가 연달아 사용되고 있는데요, 위쪽에 있는 for문으로 묶어보세요. 아무래도 컴파일과정 중 최적화에서 일이 벌어지는것 같네요..


    10년 전 link
  • VOCList
    VOCList

    길이가 100인 스트링이 들어올 때 각각의 루프에서 참조하게 되는 변수의 인덱스를 잘 생각해보세요.
    그리고 소스는 글 작성하실 때 도움말에 보면 이쁘게 씌우는 법이 있습니다 ㅜㅜ


    10년 전 link
  • Being
    Being

    wayway님의 저번 코드는 틀린 코드가 컴파일러 최적화로 인해 맞게 된 것이지 올바른 코드가 틀리게 된 것이 아닙니다. 컴파일러가 버그가 없는 것은 아니지만, 무작정 의심하는 것은 좋지 못합니다.


    10년 전 link
  • wayway
    wayway

    @Being님 위의 방법대로 수정하여 정답을 얻어냈고 이 또한 동일한 코드이기에 제 지식선에선 다른 원인을 생각하지 못하여 추측해보았습니다(제가 볼땐 저 코드의 논리는 틀리지 않았기에). 말씀대로 무작정 다른 탓할 것을 찾는 것은 좋지못하지만 자신의 불완전성을 경계할 뿐만 아니라 다른 외부요인도 같이(생각해볼수있는것은모두) 고려해보는 것은 필요하다고 생각합니다. 저는 컴파일러가 문제있다고 주장하는게 아닐뿐더러 이를통해 뭔가를 배웠으며, 앞으로도 이 컴파일러에 적응하기 위해 이런저런 방법을 생각해보며 그 원인에 대해서도 간단히 추측해본것입니다.


    10년 전 link
  • VOCList
    VOCList

    본 질문글은 컴파일러와 무관하며, 코드의 논리가 틀린 경우입니다.


    10년 전 link
  • wayway
    wayway

    VOCList님. 위의 코드에서
    for() { 입력 } + for() { 출력 } 은
    for() { 입력, 출력 } 과 같은 논리 아닌가요?
    전자는 오답, 후자는 정답으로 나오고 있는데요, 좀더 자세한 설명부탁드릴게요.


    10년 전 link
  • Being
    Being

    그 두 루프가 정말 같은 루프가 맞는지 다시 살펴보시기 바랍니다 :)


    10년 전 link
  • VOCList
    VOCList

    제가 위에 언급한 힌트를 가지고 충분히 고민하신 뒤 열어보시는 걸 추천합니다.

    for(int i=1; pword[n][i] != '\0' ; i+=2)
    

    위 for문은 1번 인덱스, 3번 인덱스, ... 를 계속 보며 배열 안의 내용이 \0 이 등장하기 전까지 루프를 계속 실행합니다.

    스트링의 길이가 100이라고 생각해봅시다. 99번 인덱스는 마지막 캐릭터가 들어 있는 변수이기에 \0이 아닐 것이고 루프 안의 내용이 실행되며, 루프가 끝난 후 \0인지 확인하게 되는 배열의 인덱스는 101입니다.

    하지만 변수 선언단에서 볼 수 있듯 현재 선언하신 배열은 인덱스를 0 ~ 100까지만 가지고 있습니다. 101번 인덱스는 현재 선택하신 배열에서는 참조해서는 안되는 인덱스입니다.

    wayway님이 어떤 수정을 시도하신건지는 잘 모르겠으나, 수정 내용에서 결과적으로 이 부분이 고려되지 않았다면 배열에 들어가는 쓰레기값에 의해서 우연히 Accepted일 가능성이 크다고 봅니다.


    10년 전 link
  • wayway
    wayway

    아 저부분을 의도하진 않았지만 덕분에 제가 수정한 부분이 왜 맞았는진 알게되었네요. 하나의 for문만 사용하면 101번째 인덱스에 접근해도 문제될게 없을수 있었네요. 즉 하나의 for문만을 사용하면 입력값의 맨 마지막 문장의 길이가 100이 아니라면 정답처리가 되겠군요(배열의 메모리 연속성). 제가 너무 성급히 판단했군요. 질문자께도 혼란만 주었겠네요 죄송합니다. 그리고 또 하나 배웠네요 감사합니다.


    10년 전 link
  • xglove1
    xglove1

    정말 감사합니다. 이런 사소한 하나하나까지 모두 고려해야 한다는걸 깨달았네요;; 알고리즘 공부를 이제 처음 시작하는 단계라서.... 감사합니다. 앞으로도 많은 도움 부탁드릴께요 ㅎㅎ


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.