달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'주민등록번호'에 해당되는 글 1

  1. 2007.09.12 [Java Quiz] 주민등록 번호와 바코드 유효성 체크

/**
 *
 * @(#) 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
:
Posted by 뽀기