○ 주민등록번호 검증 공식
   
   ① 마지막 자리를 제외한 앞자리 수를 규칙에 맞게 곱한다
  
  123456-123456(7) (주민번호)
 ----------------------------------- 각 자릿수에 곱하기
  234567 892345  (각 자리에 곱해질 수)
   
   
   ② 규칙에 맞게 곱셈 연산을 수행한 결과를 모두 더한다.

   ex) 7 5 0 6 1 5 - 1 8 6 2 1 3 3
         * * * * * *      * * * * * * 
        2 3 4 5 6 7     8 9 2 3 4 5
   ----------------------------------
   → 14 + 15 + 0 + 30 + 6 + 35 + 8 + 72 + 12 + 6 + 4 + 15

  == 217

   ③ 더해진 결과값을 11로 나누어 『나머지』를 취한다.
 

          19
       --------
    11| 217
        11
      ---------
        107
         99
      ---------
  8 → 나머지

④ 11에서 나머지(8)을 뺀 결과값을 구한다.

   11 - 8 → 3

   ※ ③의 처리 과정에서 나머지가 0인 경우 → 11 - 0 → 11 → 1
      1인 경우 → 11 - 1 → 10 → 0
   이를 다시 10으로 나누어 나머지를 취한다.

⑤ ④의 연산 결과가 주민번호를 구성하는 마지막 숫자와
   일치하는지의 여부를 확인한다.

   일치   → 유효한 주민번호
   불일치 → 잘못된 주민번호



 실행 예)
 주민번호 입력(xxxxxx-xxxxxxx) : 123456-12345678 → 입력 갯수 초과
 >> 입력 오류
 계속하려면 아무 키나 누르세요...

 주민번호 입력(xxxxxx-xxxxxxx) : 123456-123456 → 입력 갯수 미달
 >> 입력 오류
 계속하려면 아무 키나 누르세요...

 주민번호 입력(xxxxxx-xxxxxxx) : 750615-1252085 → 유효한 주민번호
 >> 정확한 주민번호~!!!
 계속하려면 아무 키나 누르세요...

 주민번호 입력(xxxxxx-xxxxxxx) : 750615-1252084 → 유효한 주민번호
 >> 잘못된 주민번호~!!!
 계속하려면 아무 키나 누르세요...


 추가 팁~!!!

 배열.length → 배열의 길이(배열방의 갯수) 반환
 문자열.length() → 문자열의 길이 반환
 문자열.substring() → 문자열 추출


/*=======================================  
  ■■■ 주민등록번호 유효성 검사 ■■■     
========================================*/

import java.util.Scanner;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test109
{
	public static void main(String[] args) throws IOException
	{
		// BufferedReader 인스턴스 생성
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 입력받는 주민번호(문자열 형태)
		String str;

		// 주민번호의 각 자릿수에 고바게 될 수 → 배열 형태로 구성
		//			 7 5 0 6 1 5  -  1 8 6 2 1 3 3 
		//			 *  *  *  *  *  *     * * * * * *
		int[] chk = {2,3,4,5,6,7, 0 ,8,9,2,3,4,5};
		//							  ---
		//							check~!!!

		// 곱셈 연산 후 누적합 (각 곱셈 결과를 더해 나가라...
		int tot = 0;

		System.out.print("주민번호 입력(xxxxxx-xxxxxxx) : ");
		//str = Integer.parseInt(br.readLine());
		str = br.readLine();

		if (str.length() != 14)
		{
			System.out.println(">> 입력 오류~!!!");
			return;	//-- 메소드종료 → main() 메소드 종료 → 프로그램 종료
		}

		// 테스트
		//System.out.println(">> 자릿수 적합");
		
		// ex) 750615-1252085
		for (int i = 0; i < 13; i++)
		{
			if(i == 6)
				continue;	//-- 뒷부분 무시하고... 계속해라...
							//   ------
							//   line 162

			//chk[i] * Integer.parseInt(주민번호 특정 자릿수 추출);
			tot += chk[i] * Integer.parseInt(str.substring(i, i + 1));
			                        
		}

		//------------ 여기까지 수행하면 ①과 ②를 모두 끝낸 상황이며
		//			   규칙에 맞게 곱셈 연산을 수행한 결과를 모두 더한 값은
		//			   변수 tot 에 담겨있는 상황이 된다.

		// ③ ④ 관련 연산 수행
		int su = 11 - tot % 11;

		// 테스트(확인)
		//System.out.print(su);
		
		// 최종 결과 출력 이전에... 추가 연산 필요~!!!
		// su에 대한 연산 결과가 두 자리로 나올 경우
		// 주민번호 마지막 자리의 숫자와 비교할 수 없는 상황
		su = su % 10;		// su % 10

		if (su == Integer.parseInt(str.substring(13)))
		{
			System.out.println(">> 정확한 주민번호~!!!");
		}
		else
		{
			System.out.println(">> 잘못된 주민번호~!!!");
		}

	}
}
// 실행 결과
/*
주민번호 입력(xxxxxx-xxxxxxx) : 940603-*******
>> 정확한 주민번호~!!!
계속하려면 아무 키나 누르십시오 . . .
*/

'JAVA > 자바 기본 프로그래밍' 카테고리의 다른 글

Test115 정렬 알고리즘 응용  (1) 2020.09.10
Test110 ~ 114 정렬 알고리즘  (0) 2020.09.07
Test108 만년달력 프로그램  (0) 2020.09.07
Test099~100 배열의 복사  (0) 2020.09.06
Test098 배열과 난수 처리  (0) 2020.09.06

+ Recent posts