Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

Everything has an expiration date

106 - Java 주민등록번호 유효성 검사 : 문자열 길이 메소드 length()와, 문자열 추출 메소드 substring(n, m) 본문

[Java]/Program source (java)

106 - Java 주민등록번호 유효성 검사 : 문자열 길이 메소드 length()와, 문자열 추출 메소드 substring(n, m)

Jelly-fish 2023. 9. 11. 17:50

 

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

/*
○ 주민등록번호 검증 공식

	① 마지막 자리를 제외한 앞자리 수를 규칙에 맞게 곱한다.


	123456-1234567 (주민번호)
	****** ******  ---------------------------각 자릿수에 곱하기
	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인 경우 → 11 - 1 → 10

		   이를 다시 10으로 나누어 나머지를 취한다. 11 → 1
		   											10 → 0

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

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



*/

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

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

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

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



// ※ 문제 해결을 위한 추가 팁~!!!

//    배열.length            → 배열의 길이(배열방의 개수) 반환
//    문자열.length()        → 문자열의 길이 반환

//    문자열.substring(m, n) → 문자열 추출
//    문자열 m번째 위치에서 n-1번째 위치까지 추출(인덱스는 0부터)

//    문자열.substring(m) → 문자열 추출
//    문자열 m번째 위치에서 문자열의 끝까지 추출(인덱스는 0부터)



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


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

		// 입력받은 주민번호(문자열 형태)를 담아둘 변수 선언
		String str;

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

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

		System.out.print("주민번호입력(xxxxxx-xxxxxxx) : ");	// "750615-1252085"
		//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++)		//-- i → 0 1 2 3 4 5 6 7 8 9 10 11 12
		{
			// 테스트
			//System.out.print(i + " ");
			//--==>> 0 1 2 3 4 5 6 7 8 9 10 11 12
		
			// i가 6일 때에는 뒷부분 무시하고 계속해라
			if (i == 6)
			{
				continue;		//-- 뒷부분 무시하고 계속해라~!!!
			}

			tot += chk[i] * Integer.parseInt(str.substring(i, (i+1)));		//-- 뒷부분
		
		}

		
		// 테스트
		System.out.println("tot : " + tot);
		//--==>> 주민번호입력(xxxxxx-xxxxxxx) : 750615-1862133
		//       tot : 217


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

		int su = 11 - tot % 11;

		//---------------------------------- 여기까지 수행하면 검증 공식의 ③과 ④를 모두 끝낸 상황이며
		//                                   su 에 대한 연산 결과가 두 자리의 정수로 나올 경우
		//                                   주민번호 마지막 자리의 숫자와 비교를 수행할 수 없는 상황.
		


		su = su % 10;			// su %= 10;


		// 주민번호의 마지막 자리와 비교한 결과가 같다면 → 정확한 주민번호
		//                                      아니라면 → 잘못된 주민번호
		
		if (su == Integer.parseInt(str.substring(13)))	//(13, 14)와 마찬가지
		{
			System.out.print(">> 정확한 주민번호~!!!");
		}

		else
		{
			System.out.print(">> 잘못된 주민번호~!!!");
		}






	}
}

// 실행 결과 


/*
주민번호입력(xxxxxx-xxxxxxx) : 121212-1234567
tot : 136
>> 정확한 주민번호~!!!계속하려면 아무 키나 누르십시오 . . .
*/


/*
주민번호입력(xxxxxx-xxxxxxx) : 123456-123456
>> 입력 오류~!!!
계속하려면 아무 키나 누르십시오 . . .
*/

/*
주민번호입력(xxxxxx-xxxxxxx) : 123456-12345678
>> 입력 오류~!!!
계속하려면 아무 키나 누르십시오 . . .
*/

/*
주민번호입력(xxxxxx-xxxxxxx) : 750615-1862133
tot : 217
>> 정확한 주민번호~!!!계속하려면 아무 키나 누르십시오 . . .
*/




/*
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;


public class Test106
{
	public static void main(String[] args)	throws IOException
	{
		// 1. 변수 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String inputStr; // 사용자로부터 입력 받을 주민등록번호
		String[] strArr = new String[14]; // 문자열 하나씩 떼어서 저장할 배열.
		int[] intArr = new int[13];	// 문자열 변수 int형으로 형변환 해서 저장할 배열.
		int[] multArr = {2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5}; // 곱할 수 배열
		int[] resultArr = new int[12];	// 결과 저장할 배열
		int totalSum = 0;	// intArr와 multArr를 서로 곱한 값들의 총합을 저장할 변수.
		int remain;		// 나머지값 저장할 변수
		int result;		// 11 - 나머지값을 저장할 변수
		
		
		// 2. 입력 받기
		System.out.print("주민번호입력(xxxxxx-xxxxxxx) : ");
		inputStr = br.readLine();
		//System.out.println(inputStr.length());
		

		if (inputStr.length() != 14)	// 잘못 입력했을 경우 프로그램 종료...
		{
			System.out.print(">> 입력 오류~!!!\n");
			return;
		}

		// 3. for문으로 각각의 문자열 하나씩 추출.
		// 제외되어야 하는 값('-' = strArr[6]) 
		for (int i = 0; i < 14; i++)
		{
			strArr[i] = inputStr.substring(i, i+1);
			//System.out.println(" i : " + i);
		}
		
		
		// 4. 연산 시작 - 각 자릿수마다 정해진 수 곱하기
		
		① 마지막 자리를 제외한 앞자리 수를 규칙에 맞게 곱한다.


		123456-1234567 (주민번호)
		****** ******  ---------------------------각 자릿수에 곱하기
		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
		
		// 제외되어야 하는 값('-' = strArr[6]) 

		String[] strArr = new String[14]; // 문자열 하나씩 떼어서 저장할 배열.
		int[] intArr = new int[13];	// 문자열 변수 int형으로 형변환 해서 저장할 배열. 맨 마지막 수 x이므로 13.
		int[] multArr = {2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5}; // 곱할 수 배열
             index -->   0  1  2  3  4  5  6  7  8  9  10 11
		int[] resultArr = new int[12];	// 결과 저장할 배열
		
		
		// strArr에 들어있는 문자열 각각을 int형으로 모두 형변환 하여 intArr[i]에 저장.
		// 하이푼일 때는, 0으로 저장됨.
		for (int i = 0; i < 13 ; i++)
		{
			if (strArr[i].equals("-"))
			{
				continue;
			}
			else
			{
				intArr[i] = Integer.parseInt(strArr[i]);
			}
			
		}
		
		// 5. 곱셈 시작 (하이푼(intArr[6]) 기준으로 앞 뒤 반반씩 쪼개서...)
		for (int i = 0; i < 6 ; i++)
		{
			resultArr[i] += intArr[i]*multArr[i];
			System.out.print("intArr :" + intArr[i] + " mult:" + multArr[i] + "\n");

		}
		for (int j = 7; j < 13; j++)	
		{
			System.out.print("intArr :" + intArr[j] + " mult:" + multArr[j-1] + "\n");
			resultArr[j-1] += intArr[j]*multArr[j-1];
		}
		
		
		//int[] intArr = new int[13];	// 문자열 변수 int형으로 형변환 해서 저장할 배열.
										// 맨 마지막 수 포함 안 하므로 13.
		
		
		// 제외되어야 하는 값('-' = strArr[6]) 
		// 즉, intArr = int[0, 1, 2, 3, 4, 5] + int[7, 8, 9, 10, 11, 12]
		//     intArr[0~5][7~12]
		//                 index : j = 7 ~ 12
		//
		//    multArr[0~11]
		//  resultArr[0~11]
		//           index : j = 6 ~ 11


		//    multArr =    {2, 3, 4, 5, 6, 7        8, 9, 2,  3,  4,  5}
		//         (index)  0  1  2  3  4  5        6  7  8   9   10  11

		
		
		//int[] multArr = {2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5}; // 곱할 수 배열
             //index -->   0  1  2  3  4  5  6  7  8  9  10 11
		//int[] resultArr = new int[12];	// 결과 저장할 배열
		

		// 테스트
	
		


		// 6. 전체 곱셈한 수의 총합 구하기.
		// int totalSum = 0;

		for (int i = 0; i < 12; i++)
		{
			totalSum += resultArr[i];
		}
		//테스트
		//System.out.println(totalSum);






		// 7. 더해진 결과값 11로 나눠서 나머지 구하기.

		remain = totalSum % 11;

	

		


		// 8. 11에서 나머지 뺀 값 구하기

		result = 11 - remain;


		if (result == 10 || remain == 11)
		{
			result = result % 10;
		}

		System.out.println("remain : " + remain);
		System.out.println("result : " + result);
		



		
		※ ③의 처리 과정에서 나머지가 0인 경우 → 11 - 0 → 11
		   ③의 처리 과정에서 나머지가 1인 경우 → 11 - 1 → 10

		   이를 다시 10으로 나누어 나머지를 취한다. 11 → 1
		   											10 → 0
		
		


		
		// 9. 마지막 주민등록 번호와 일치하는지 확인하기!!!


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

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

		




		if (result == Integer.parseInt(strArr[13]))
		{
			System.out.println(">> 정확한 주민번호~!!!");
		}


		else if (result != Integer.parseInt(strArr[13]))
		{
			System.out.println(">> 잘못된 주민번호~!!!");
		}




		
		
	}
}




public class Test106
{
	public static void main(String[] args)
	{
		// 테스트
	
		String strTemp = "이윤수";
		System.out.println(strTemp.length());
		//--==>> 3


		strTemp = "이윤수리수리마수리";
		System.out.println(strTemp.length());
		//--==>> 9

		strTemp = "동해물과 백두산이 마르고 닳도록";
		System.out.println(strTemp.length());
		//--==>> 17

		strTemp = "study-hard";
		System.out.println(strTemp.length());
		//--==>> 10


		//----------------------------------------------------


		String strTemp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		System.out.println(strTemp.substring(13, 17));
		//--==>> NOPQ

		//System.out.println(strTemp.substring(13, 53));
		//--==>> 에러 발생(런타임 에러) 
		//       StringIndexOutOfBoundsException

		System.out.println(strTemp.substring(13));
		//--==>> NOPQRSTUVWXYZ



		
	}
}


*/