koogle 문제에서 오답을 못찾겠습니다

  • jskdmswls
    jskdmswls

    koogle 문제를 풀고있는데 오답이뜨는데 어디부분에서 오류가 나는지 모르겠어요..

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    int main()
    {
       int C,N;
       char password[1001] = {NULL}; // 입력받을 패스워드를 저장할 변수
       double str_pw[2] ; // 패스워드의 세기(strength)를 저장할 변수
       int i,j; // for문 변수
       char MAX[1001]; // 최종 사용할 암호
    
       scanf("%d",&C); // 테스트 케이스 갯수
    
       while(C--)
       {
          for(i=0 ; i<2 ; i++) 
             str_pw[i] = 0 ;// 세기를 0로 초기화
          strcpy(MAX,"\0"); // 최종 암호를 저장할 MAX를 NULL로 초기화
    
          scanf("%d",&N); // 암호 후보의 수
    
          for(i=0 ; i<N ; i++)
          {
            scanf("%s",password); // pw 입력받기
            if(i==0)
            {
                strcpy(MAX,password); // MAX에 password 저장
                for(j=0 ; j<1000 ; j++)
                {    
                    if(password[j] == 0) // NULL문자를 만나면 break
                        break;
                    else if(password[j] >= 48 && password[j] <=57) // 숫자일때
                        str_pw[0] += log(10.0); 
                    else if(password[j] >=97 && password[j] <= 122) // 영어일때
                         str_pw[0] += log(26.0);
                } // 입력받자마자 세기 저장
            }
    
            else
            {
                for(j=0 ; j<1000 ; j++)
                {    
                    if(password[j] == 0)
                        break;
                    else if(password[j] >= 48 && password[j] <=57)
                        str_pw[1] += log(10.0);
                    else if(password[j] >=97 && password[j] <= 122)
                         str_pw[1] += log(26.0);
                } // 입력받자마자 세기 저장
            }
    
            ////////////////세기 비교/////////////////////////////
    
            if(str_pw[0] < str_pw[1])
            {
                strcpy(MAX,password); // MAX에 현재 패스워드로 교체
                str_pw[0] = str_pw[1];
            }
    
            else if(str_pw[0] == str_pw[1])
            {
                if(strcmp(MAX,password) > 0) // 사전순으로 password가 더 작으면
                   strcpy(MAX,password); // MAX에 현재 패스워드로 교체
            }
    
            str_pw[1] = 0; // 비교하는 세기 0으로 초기화
    
          } //for문 종료
    
          printf("%s\n",MAX); // 가장 큰 세기를 가진 패스워드 출력
    
       } // while문 종료
    
    
       return 0;
    }
    

    9년 전
1개의 댓글이 있습니다.
  • coldradio
    coldradio

    2가지 문제가 있습니다...

    세기비교 하는 else if(str_pw[0] == str_pw[1]) 문에서, str_pw를 복사하는 것을 빼먹으셨네요;;;

    두번째는...
    floating point 연산을 일반적으로 == 비교하면 안 됩니다.
    log(10)과 log(26)을 무작위로 (매우 많이) 더했을 때 같은 개수 만큼 더해도 ==가 성립하지 않을 수 있을 것 같아요.
    대신, 알파벳과 숫자 개수를 각각 구해서
    alpa_cnt * log(26) + number_cnt * log(10)으로 한번에 계산하면 ==로 비교해도 상관없습니다. (그렇겠죠?;;;;;)

    그리고, 코드에 중복이 많은데, 가능한 없애보려고 해보세요~


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