ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 알고리즘 - 주민등록번호 확인
    IT/My 알고리즘 2021. 4. 23. 05:21

    1) 알고리즘관련 조건 

    0. 문자와 숫자가 섞여있을 경우 숫자만을 가져와서 문제를 처리한다.

    1. 13개의 숫자가 아닐경우 out

    2. - 로 구분자를 주었을 때 앞에 6자리 뒤에 7자리를 가져와서 0번째로 확인한다.

    3. 1번에서 확인이 안됬을경우, - 구분자가 없을경우 첫번째 숫자부터 주민등록번호를 확인해본다.

    4. 말이 안되는 년, 월, 일이 될경우 out

    5. 마지막으로 주민등록번호 알고리즘을 확인한 후 체크썸을 확인하여 주민등록번호를 확인한다.

     

     

    2) 알고리즘 풀이

    #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <string.h>
    
    
    
    int jumin_Ago(char *p)
    
    {
    
    
    
      int day[]   = ;
    
      int p_n[12];
    
      int check_sum =0;
    
      int i, y, m ,d;
    
    
    
      for(i=0; i<=12; i++)
    
      {
    
        p_n[i] = p[i]-'0';
    
        printf("%d",p_n[i]);
    
      }
    
    
    
      printf(" 확인중\n");
    
    
    
      if( p_n[6] == 1 || p_n[6] == 2 )
    
      {
    
        y = 1900 + p_n[0]*10 + p_n[1];
    
      }
    
      else if( p_n[6] == 3 || p_n[6] == 4 )
    
      {
    
        y = 2000 + p_n[0]*10 + p_n[1];
    
        
    
        if( y > 2017 )
    
        {
    
          return 7;
    
        }
    
      }
    
      else
    
        return 2;
    
    
    
      m = p_n[2]*10 + p_n[3];
    
      d = p_n[4]*10 + p_n[5];
    
    
    
      if( m != 0 && m <= 12 )
    
      {
    
    
    
        if( d != 0 && d <= day[m] )
    
        {
    
          check_sum = (p_n[0]*2)+(p_n[1]*3)+ 
    
                      (p_n[2]*4)+(p_n[3]*5)+ 
    
                      (p_n[4]*6)+(p_n[5]*7)+ 
    
                      (p_n[6]*8)+(p_n[7]*9)+ 
    
                      (p_n[8]*2)+(p_n[9]*3)+ 
    
                      (p_n[10]*4)+(p_n[11]*5); 
    
          check_sum %= 11;
    
          check_sum = 11 - check_sum;
    
    
    
          if(p_n[12] == check_sum)
    
            return 1;
    
          else
    
            return 5;
    
         }
    
        else
    
         return 4;
    
      }
    
      else
    
        return 3;
    
    
    
      return 6;
    
    
    
    }
    
    
    
    void Ago_error(int n)
    
    {
    
    
    
      if(n == 1)
    
      {
    
       printf("******************************\n");
    
       printf("**주민번호가 확인 되었습니다**\n");
    
       printf("******************************\n");
    
      }
    
      else if(n == 2)
    
        printf("----------------------년 오류\n");
    
      else if(n == 3)
    
        printf("----------------------월 오류\n"); 
    
      else if(n == 4)
    
        printf("----------------------일 오류\n"); 
    
      else if(n == 5)
    
        printf("--------------------체크 오류\n"); 
    
      else if(n == 6)
    
        printf("----------------알고리즘 오류\n");
    
      else if(n == 7)
    
        printf("------------------2017년 이상\n");
    
      else 
    
       printf("---확인되지 않는 오류값 발견됨\n");
    
    
    
    }
    
    
    
    int A_go( char *p )
    
    {
    
      int num;
    
      num = jumin_Ago(p);
    
      Ago_error(num);
    
    
    
      return num;
    
    }
    
    
    
    
    
    void main()
    
    {
    
      char  number[255]; 
    
      char  jumin[255]; 
    
      char *p_hyp = 0;
    
      int   len, i, j = 0;
    
      int   cood  = 0;
    
    
    
    
    
      printf("주민등록 번호를 입력해주세요\n");
    
      scanf("%s",number);
    
      len = strlen(number);
    
    
    
    
    
      for( i=0; i<len; i++ )
    
      {
    
    
    
        if( number[i] == '-')
    
        {
    
          p_hyp = &jumin[j-6];
    
        }
    
        else if( '0' <= number[i] && number[i] <= '9')
    
        {
    
          jumin[j] = number[i];
    
          j++;
    
        }
    
      }
    
    
    
      printf("숫자 입력 확인 : %s\n",jumin);
    
      len = strlen(jumin);
    
      printf("총 숫자의 갯수 : %d\n",len); 
    
    
    
      if( p_hyp != 0 )
    
      {
    
        cood = A_go(p_hyp);
    
      }
    
    
    
      if( len >= 13 && (cood != 1) ) 
    
      {
    
        len -= 13;
    
        for ( i =0; i <= len; i++ )
    
        {
    
          printf("%d 번째",i);
    
          cood = A_go(&jumin[i]);
    
          
    
          if( cood == 1)
    
          {
    
            printf("확인된 주민번호 : ");
    
          
    
            for(j=0; j<=12; j++)
    
            {
    
              printf("%c",jumin[i+j]);
    
            }
    
            printf("\n");
    
            break;
    
          }
    
           else
    
             printf("확인된 주민번호가 없습니다!!\n ");
    
       
    
        }
    
      }
    
      else if( len < 13 ){ 
    
        printf("!! 13개 숫자 부족!!\n");
    
      }
    
    }
    
    
    #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <string.h>
    
    
    
    int jumin_Ago(char *p)
    
    {
    
    
    
      int day[]   = ;
    
      int p_n[12];
    
      int check_sum =0;
    
      int i, y, m ,d;
    
    
    
      for(i=0; i<=12; i++)
    
      {
    
        p_n[i] = p[i]-'0';
    
        printf("%d",p_n[i]);
    
      }
    
    
    
      printf(" 확인중\n");
    
    
    
      if( p_n[6] == 1 || p_n[6] == 2 )
    
      {
    
        y = 1900 + p_n[0]*10 + p_n[1];
    
      }
    
      else if( p_n[6] == 3 || p_n[6] == 4 )
    
      {
    
        y = 2000 + p_n[0]*10 + p_n[1];
    
        
    
        if( y > 2017 )
    
        {
    
          return 7;
    
        }
    
      }
    
      else
    
        return 2;
    
    
    
      m = p_n[2]*10 + p_n[3];
    
      d = p_n[4]*10 + p_n[5];
    
    
    
      if( m != 0 && m <= 12 )
    
      {
    
    
    
        if( d != 0 && d <= day[m] )
    
        {
    
          check_sum = (p_n[0]*2)+(p_n[1]*3)+ 
    
                      (p_n[2]*4)+(p_n[3]*5)+ 
    
                      (p_n[4]*6)+(p_n[5]*7)+ 
    
                      (p_n[6]*8)+(p_n[7]*9)+ 
    
                      (p_n[8]*2)+(p_n[9]*3)+ 
    
                      (p_n[10]*4)+(p_n[11]*5); 
    
          check_sum %= 11;
    
          check_sum = 11 - check_sum;
    
    
    
          if(p_n[12] == check_sum)
    
            return 1;
    
          else
    
            return 5;
    
         }
    
        else
    
         return 4;
    
      }
    
      else
    
        return 3;
    
    
    
      return 6;
    
    
    
    }
    
    
    
    void Ago_error(int n)
    
    {
    
    
    
      if(n == 1)
    
      {
    
       printf("******************************\n");
    
       printf("**주민번호가 확인 되었습니다**\n");
    
       printf("******************************\n");
    
      }
    
      else if(n == 2)
    
        printf("----------------------년 오류\n");
    
      else if(n == 3)
    
        printf("----------------------월 오류\n"); 
    
      else if(n == 4)
    
        printf("----------------------일 오류\n"); 
    
      else if(n == 5)
    
        printf("--------------------체크 오류\n"); 
    
      else if(n == 6)
    
        printf("----------------알고리즘 오류\n");
    
      else if(n == 7)
    
        printf("------------------2017년 이상\n");
    
      else 
    
       printf("---확인되지 않는 오류값 발견됨\n");
    
    
    
    }
    
    
    
    int A_go( char *p )
    
    {
    
      int num;
    
      num = jumin_Ago(p);
    
      Ago_error(num);
    
    
    
      return num;
    
    }
    
    
    
    
    
    void main()
    
    {
    
      char  number[255]; 
    
      char  jumin[255]; 
    
      char *p_hyp = 0;
    
      int   len, i, j = 0;
    
      int   cood  = 0;
    
    
    
    
    
      printf("주민등록 번호를 입력해주세요\n");
    
      scanf("%s",number);
    
      len = strlen(number);
    
    
    
    
    
      for( i=0; i<len; i++ )
    
      {
    
    
    
        if( number[i] == '-')
    
        {
    
          p_hyp = &jumin[j-6];
    
        }
    
        else if( '0' <= number[i] && number[i] <= '9')
    
        {
    
          jumin[j] = number[i];
    
          j++;
    
        }
    
      }
    
    
    
      printf("숫자 입력 확인 : %s\n",jumin);
    
      len = strlen(jumin);
    
      printf("총 숫자의 갯수 : %d\n",len); 
    
    
    
      if( p_hyp != 0 )
    
      {
    
        cood = A_go(p_hyp);
    
      }
    
    
    
      if( len >= 13 && (cood != 1) ) 
    
      {
    
        len -= 13;
    
        for ( i =0; i <= len; i++ )
    
        {
    
          printf("%d 번째",i);
    
          cood = A_go(&jumin[i]);
    
          
    
          if( cood == 1)
    
          {
    
            printf("확인된 주민번호 : ");
    
          
    
            for(j=0; j<=12; j++)
    
            {
    
              printf("%c",jumin[i+j]);
    
            }
    
            printf("\n");
    
            break;
    
          }
    
           else
    
             printf("확인된 주민번호가 없습니다!!\n ");
    
       
    
        }
    
      }
    
      else if( len < 13 ){ 
    
        printf("!! 13개 숫자 부족!!\n");
    
      }
    
    }

     

    2. 오류검증 및 확인

    1. 주민등록번호의 ' . ' 이 더해지는 현상 발견

     

    *  오류가 어디서 발생하는지 확인(1)

     

    * 오류가 어디서 발생 확인(2)

     

    오류가 어디서 발생 확인(3)

     

     

     

    3)  수정완료 

    : 해결방법 '.' 코드추가

     

     

    4) 최종완료

    #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <string.h>
    
    
    
    int jumin_Ago(char *p)
    
    {
    
    
    
      int day[]   = ;
    
      int p_n[12];
    
      int check_sum =0;
    
      int i, y, m ,d;
    
    
    
      for(i=0; i<=12; i++)
    
      {
    
        p_n[i] = p[i]-'0';
    
        printf("%d",p_n[i]);
    
      }
    
    
    
      printf(" 확인중\n");
    
    
    
      if( p_n[6] == 1 || p_n[6] == 2 )
    
      {
    
        y = 1900 + p_n[0]*10 + p_n[1];
    
      }
    
      else if( p_n[6] == 3 || p_n[6] == 4 )
    
      {
    
        y = 2000 + p_n[0]*10 + p_n[1];
    
        
    
        if( y > 2017 )
    
        {
    
          return 7;
    
        }
    
      }
    
      else
    
        return 2;
    
    
    
      m = p_n[2]*10 + p_n[3];
    
      d = p_n[4]*10 + p_n[5];
    
    
    
      if( m != 0 && m <= 12 )
    
      {
    
    
    
        if( d != 0 && d <= day[m] )
    
        {
    
          check_sum = (p_n[0]*2)+(p_n[1]*3)+ 
    
                      (p_n[2]*4)+(p_n[3]*5)+ 
    
                      (p_n[4]*6)+(p_n[5]*7)+ 
    
                      (p_n[6]*8)+(p_n[7]*9)+ 
    
                      (p_n[8]*2)+(p_n[9]*3)+ 
    
                      (p_n[10]*4)+(p_n[11]*5); 
    
          check_sum %= 11;
    
          check_sum = 11 - check_sum;
    
    
    
          if(p_n[12] == check_sum)
    
            return 1;
    
          else
    
            return 5;
    
         }
    
        else
    
         return 4;
    
      }
    
      else
    
        return 3;
    
    
    
      return 6;
    
    
    
    }
    
    
    
    void Ago_error(int n)
    
    {
    
    
    
      if(n == 1)
    
      {
    
       printf("******************************\n");
    
       printf("**주민번호가 확인 되었습니다**\n");
    
       printf("******************************\n");
    
      }
    
      else if(n == 2)
    
        printf("----------------------년 오류\n");
    
      else if(n == 3)
    
        printf("----------------------월 오류\n"); 
    
      else if(n == 4)
    
        printf("----------------------일 오류\n"); 
    
      else if(n == 5)
    
        printf("--------------------체크 오류\n"); 
    
      else if(n == 6)
    
        printf("----------------알고리즘 오류\n");
    
      else if(n == 7)
    
        printf("------------------2017년 이상\n");
    
      else 
    
       printf("---확인되지 않는 오류값 발견됨\n");
    
    
    
    }
    
    
    
    int A_go( char *p )
    
    {
    
      int num;
    
      num = jumin_Ago(p);
    
      Ago_error(num);
    
    
    
      return num;
    
    }
    
    
    
    
    
    void main()
    
    {
    
      char  number[255]; 
    
      char  jumin[255]; 
    
      char *p_hyp = 0;
    
      int   len, i, j = 0;
    
      int   cood  = 0;
    
    
    
    
    
      printf("주민등록 번호를 입력해주세요\n");
    
      scanf("%s",number);
    
      len = strlen(number);
    
    
    
    
    
      for( i=0; i<len; i++ )
    
      {
    
    
    
        if( number[i] == '-')
    
        {
    
          p_hyp = &jumin[j-6];
    
        }
    
        else if( '0' <= number[i] && number[i] <= '9')
    
        {
    
          jumin[j] = number[i];
    
          j++;
    
        }
    
      }
    
    
    
      len = strlen(jumin);
      if( jumin[len-1] == '.' )  {    jumin[len-1] = '\0';  }
    
      printf("숫자 입력 확인 : %s\n",jumin);
    
      len = strlen(jumin);
    
      printf("총 숫자의 갯수 : %d\n",len); 
    
    
    
      if( p_hyp != 0 )
    
      {
    
        cood = A_go(p_hyp);
    
      }
    
    
    
      if( len >= 13 && (cood != 1) ) 
    
      {
    
        len -= 13;
    
        for ( i =0; i <= len; i++ )
    
        {
    
          printf("%d 번째",i);
    
          cood = A_go(&jumin[i]);
    
          
    
          if( cood == 1)
    
          {
    
            printf("확인된 주민번호 : ");
    
          
    
            for(j=0; j<=12; j++)
    
            {
    
              printf("%c",jumin[i+j]);
    
            }
    
            printf("\n");
    
            break;
    
          }
    
           else
    
             printf("확인된 주민번호가 없습니다!!\n ");
    
       
    
        }
    
      }
    
      else if( len < 13 ){ 
    
        printf("!! 13개 숫자 부족!!\n");
    
      }
    
    }
    
    
    #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <string.h>
    
    
    
    int jumin_Ago(char *p)
    
    {
    
    
    
      int day[]   = ;
    
      int p_n[12];
    
      int check_sum =0;
    
      int i, y, m ,d;
    
    
    
      for(i=0; i<=12; i++)
    
      {
    
        p_n[i] = p[i]-'0';
    
        printf("%d",p_n[i]);
    
      }
    
    
    
      printf(" 확인중\n");
    
    
    
      if( p_n[6] == 1 || p_n[6] == 2 )
    
      {
    
        y = 1900 + p_n[0]*10 + p_n[1];
    
      }
    
      else if( p_n[6] == 3 || p_n[6] == 4 )
    
      {
    
        y = 2000 + p_n[0]*10 + p_n[1];
    
        
    
        if( y > 2017 )
    
        {
    
          return 7;
    
        }
    
      }
    
      else
    
        return 2;
    
    
    
      m = p_n[2]*10 + p_n[3];
    
      d = p_n[4]*10 + p_n[5];
    
    
    
      if( m != 0 && m <= 12 )
    
      {
    
    
    
        if( d != 0 && d <= day[m] )
    
        {
    
          check_sum = (p_n[0]*2)+(p_n[1]*3)+ 
    
                      (p_n[2]*4)+(p_n[3]*5)+ 
    
                      (p_n[4]*6)+(p_n[5]*7)+ 
    
                      (p_n[6]*8)+(p_n[7]*9)+ 
    
                      (p_n[8]*2)+(p_n[9]*3)+ 
    
                      (p_n[10]*4)+(p_n[11]*5); 
    
          check_sum %= 11;
    
          check_sum = 11 - check_sum;
    
    
    
          if(p_n[12] == check_sum)
    
            return 1;
    
          else
    
            return 5;
    
         }
    
        else
    
         return 4;
    
      }
    
      else
    
        return 3;
    
    
    
      return 6;
    
    
    
    }
    
    
    
    void Ago_error(int n)
    
    {
    
    
    
      if(n == 1)
    
      {
    
       printf("******************************\n");
    
       printf("**주민번호가 확인 되었습니다**\n");
    
       printf("******************************\n");
    
      }
    
      else if(n == 2)
    
        printf("----------------------년 오류\n");
    
      else if(n == 3)
    
        printf("----------------------월 오류\n"); 
    
      else if(n == 4)
    
        printf("----------------------일 오류\n"); 
    
      else if(n == 5)
    
        printf("--------------------체크 오류\n"); 
    
      else if(n == 6)
    
        printf("----------------알고리즘 오류\n");
    
      else if(n == 7)
    
        printf("------------------2017년 이상\n");
    
      else 
    
       printf("---확인되지 않는 오류값 발견됨\n");
    
    
    
    }
    
    
    
    int A_go( char *p )
    
    {
    
      int num;
    
      num = jumin_Ago(p);
    
      Ago_error(num);
    
    
    
      return num;
    
    }
    
    
    
    
    
    void main()
    
    {
    
      char  number[255]; 
    
      char  jumin[255]; 
    
      char *p_hyp = 0;
    
      int   len, i, j = 0;
    
      int   cood  = 0;
    
    
    
    
    
      printf("주민등록 번호를 입력해주세요\n");
    
      scanf("%s",number);
    
      len = strlen(number);
    
    
    
    
    
      for( i=0; i<len; i++ )
    
      {
    
    
    
        if( number[i] == '-')
    
        {
    
          p_hyp = &jumin[j-6];
    
        }
    
        else if( '0' <= number[i] && number[i] <= '9')
    
        {
    
          jumin[j] = number[i];
    
          j++;
    
        }
    
      }
    
    
    
      len = strlen(jumin);
      if( jumin[len-1] == '.' )  {    jumin[len-1] = '\0';  }
    
    
      printf("숫자 입력 확인 : %s\n",jumin);
    
      len = strlen(jumin);
    
      printf("총 숫자의 갯수 : %d\n",len); 
    
    
    
      if( p_hyp != 0 )
    
      {
    
        cood = A_go(p_hyp);
    
      }
    
    
    
      if( len >= 13 && (cood != 1) ) 
    
      {
    
        len -= 13;
    
        for ( i =0; i <= len; i++ )
    
        {
    
          printf("%d 번째",i);
    
          cood = A_go(&jumin[i]);
    
          
    
          if( cood == 1)
    
          {
    
            printf("확인된 주민번호 : ");
    
          
    
            for(j=0; j<=12; j++)
    
            {
    
              printf("%c",jumin[i+j]);
    
            }
    
            printf("\n");
    
            break;
    
          }
    
           else
    
             printf("확인된 주민번호가 없습니다!!\n ");
    
       
    
        }
    
      }
    
      else if( len < 13 ){ 
    
        printf("!! 13개 숫자 부족!!\n");
    
      }
    
    }

     

     

    5) 검증

    0. 문자와 숫자가 섞여있을 경우 숫자만을 가져와서 문제를 처리한다.

    1. 13개의 숫자가 아닐경우 out

    2. - 로 구분자를 주었을 때 앞에 6자리 뒤에 7자리를 가져와서 0번째로 확인한다.

    3. 1번에서 확인이 안됬을경우, - 구분자가 없을경우 첫번째 숫자부터 주민등록번호를 확인해본다.

    4. 말이 안되는 년, 월, 일이 될경우 out

    5. 마지막으로 주민등록번호 알고리즘을 확인한 후 체크썸을 확인하여 주민등록번호를 확인한다.

     

     

    ***** 검증 단계 

    0. 문자와 숫자가 섞여있을 경우 숫자만을 가져와서 문제를 처리한다.

     

     

    1. 13개의 숫자가 아닐경우 out

     

    2. - 로 구분자를 주었을 때 앞에 6자리 뒤에 7자리를 가져와서 0번째로 확인한다.

     

    3. 1번에서 확인이 안됬을경우, - 구분자가 없을경우 첫번째 숫자부터 주민등록번호를 확인해본다.

    4. 말이 안되는 년, 월, 일이 될경우 out

     

    5. 마지막으로 주민등록번호 알고리즘을 확인한 후 체크썸을 확인하여 주민등록번호를 확인한다.

     

     

     

     

    6) 검증완료 

     

Designed by Tistory.