[Java Quiz] 주민등록 번호와 바코드 유효성 체크 그거/Java2007. 9. 12. 10:53
/**
*
* @(#) JuminNoBarCode.java
* created date : 2007. 09. 03
*
* (c) Copyright by Youbok, Choi.
* All rights reserved.
*/
package ybchoi.quiz;
/**
* 체크섬 계산을 통해 주어진 주민번호나 바코드가 옳은지 확인한다.
*
* == 주민번호 ==
* 주민번호는 총 13자리인데, 앞의 12자리를 떼내어서 첫 숫자부터 각각 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5를 곱한다.
* 그 수들을 모두 합한다음, 11로 나누어 그 나머지를 다시 11에서 뺀 수가 마지막 자릿수(13번째)와 일치하면 주민등록번호가 정상이라 본다.
* 하지만 마지막 수식 결과가 10이면 0을 취하고 11이면 1을 취한다.
*
* == 바코드 ==
* 바코드는 전체 13자리인데 처음 세 개 숫자는 국가로 880은 한국을 가리킨다.
* 다음 네개가 제조업자이고 다음 다섯개는 어떤 상품인지를 말한다.
* 마지막 하나의 숫자가 체크섬이 된다.
* 앞 부분의 12자리 중 홀수자리는 그대로 더하고, 짝수자리는 더한 후 곱하기 3.
* 이 두 값의 함에 체크 숫자를 더하면 10으로 나누어 떨어져야 한다.
*
* @author Youbok, Choi
* @version 1.0
*
*/
public class JuminNoBarCode {
final int[] JUMIN_CHECK = new int[]{2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5};
String strNo;
/**
*
*/
public JuminNoBarCode(String arg) {
this.strNo = arg;
}
public void check() {
System.out.println("# " + checkJuminNo());
System.out.println("# " + checkBarCode());
}
private boolean checkJuminNo() {
int totalsum = 0;
int checksum = 0;
int idx = 0;
// 마지막자리(13번째)를 제외한 각 숫자에 값을 곱하여 전부 더한다.
for(idx = 0 ; idx < JUMIN_CHECK.length ; idx++ ) {
totalsum += (((int)strNo.charAt(idx)-48) * JUMIN_CHECK[idx]);
// System.out.println("# totalSum = " + totalsum + " =======> " + ((int)strNo.charAt(i)-48));
}
// 모두 합한 수를 11로 나누어 그 나머지를 다시 11에서 뺀 수가 체크섬
checksum = 11 - (totalsum % 11) ;
System.out.println("# checksum = " + checksum + " : " + strNo.charAt(idx) );
// 체크섬이 10이면 0, 11이면 1
if( checksum == 10 ) checksum = 0;
else if( checksum == 11 ) checksum = 1;
// 주민번호 마지막자리와 체크섬 비교
if( (int)strNo.charAt(12) == checksum ) {
return true;
} else {
return false;
}
}
private boolean checkBarCode() {
int totalsum = 0;
int idx = 0;
// 마지막자리(13번째)를 제외한 각 숫자에서, 홀수자리는 그대로 더하고, 짝수자리는 곱하기 3을 해서 더한다.
for(idx = 0 ; idx < strNo.length() - 1 ; idx++ ) {
if( idx % 2 == 1 ) {
totalsum += ( ((int)strNo.charAt(idx) - 48) * 3);
} else {
totalsum += ( (int)strNo.charAt(idx) - 48 );
}
// System.out.println("# totalSum = " + totalsum + " =======> " + ((int)strNo.charAt(idx)-48));
}
// 마지막 체크섬을 더한다.
totalsum += (int)strNo.charAt(idx) - 48;
System.out.println("# totalsum = " + totalsum + " : " + strNo.charAt(idx) );
// 최종값이 10으로 나누어 떨어지면 정상
if( totalsum % 10 == 0 ) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
// JuminNoBarCode jnbc = new JuminNoBarCode("7807021457211");
JuminNoBarCode jnbc = new JuminNoBarCode("8809010665009");
jnbc.check();
}
}
# 흠. 주민번호와 바코드에 이런 심오한 뜻이 있는 줄 몰랐다.
'그거 > Java' 카테고리의 다른 글
[JavaQuiz] 3n+1 (0) | 2007.09.12 |
---|---|
[JavaQuiz] 셰익스피어-원숭이 문제 (0) | 2007.09.12 |
Java Anti-Pattern (2) | 2007.08.20 |
JDK 5.0의 새로운 기능 Annotation (0) | 2007.08.14 |
JDK 5.0의 새로운 기능 Generics (1) | 2007.08.13 |