-
알고리즘 - 주민등록번호 확인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) 검증완료