Notice
Recent Posts
Recent Comments
Link
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
}
}
*/