Contents
접기
문제
키보드로부터 주민번호를 입력 받아 올바른 주민번호인지 판단하고 주민번호로부터 정보를 추출하여 출력하는 코드를 작성하시오.
검증 내용
- 다음 페이지를 참고하여 사용자 정의 메소드를 확인하고 필요한 메소드를 작성할 것.
- 주민번호는 “-“ 포함 14자리여야 한다.
- 생년월일 뒤에 “-“이 포함되어 있어야 한다.
- “-“ 앞과 뒤에는 숫자 리터럴만 가능하다.
- 성별에 해당하는 8번째 위치는 1~4까지의 값만 가능 (1, 3:남자, 2, 4: 여자)
- 검증 코드는 아래의 알고리즘으로 구현하여 확인
- 문자열과 관련된 다양한 메소드를 이용하여 작업한다.
main
public class juminIDValid {
public static void main(String[] args) {
String jumin = null;
String gender = null,year, month, day;
int age = 0;
Scanner scanner = new Scanner(System.in);
System.out.print("주민번호를 입력하세요 >> ");
jumin = scanner.next();
String[] tmp = jumin.split("-");
if(!(isNumeric(tmp[0]) && isNumeric(tmp[1]))) {
System.out.println("올바르지 않은 주민번호입니다.");
return;
}
if(!(isValid(jumin))) {
System.out.println("올바르지 않은 주민번호입니다.");
return;
}
if(!(codeCheck(jumin))) {
System.out.println("올바르지 않은 주민번호입니다.");
return;
}
// 여기까지 오면 올바른 주민번호이므로 성별을 체크한다.
gender = genderCheck(jumin);
year = birthYear(jumin);
month = jumin.substring(2,4);
day = jumin.substring(4,6);
age = 2024 - Integer.parseInt(year);
//출력
System.out.println("당신은" + year +"년/ " + month +"월/ "+ day +
"일생. 나이는 " + age + "세, " + gender + "입니다.");
scanner.close();
}
‘-‘ 위치에 문자열이 올바르게 포함되어 있는지 체크하고, 성별의 범주가 1~4까지인지 체크
private static boolean isValid(String jumin){
boolean flag1 = false; // '-' 체크
boolean flag2 = false; // 성별체크
char gender = jumin.charAt(7);
if( jumin.charAt(6) == '-') flag1 = true;
if(gender >= '1' && gender <= '4') flag2 = true;
return flag1 && flag2; // 둘다 true 일때만 true 가 나가도록
}
주민번호를 전달받아 검증코드 알고리즘으로 올바른 주민번호인지 체크 ****
private static boolean codeCheck(String jumin) {
int total = 0;
int tmp = 0;
int value = 2;
for(int i = 0; i<jumin.length()-1; i++) {
if(i ==6) continue;
tmp = jumin.charAt(i) - '0'; // '1' - '0' = 1
total += (tmp * value);
++value;
if(value ==10) value =2;
}
// 나머지 = 합계를 11로 나눈 나머지, 코드값 = 11-나머지
// 마지막 결과가 2자리인 경우 다시 10으로 나눈 나머지 값으로 검증을 한다.
int digit = jumin.charAt(jumin.length() -1) -'0'; // 검증값 : 주민번호 끝자리
int valid = 11 - (total % 11);
if (valid>9) valid = valid % 10;
System.out.println("끝자리" + digit + " , " + valid);
if(digit == valid) return true;
return false;
}
코드 | 의미 |
tmp = jumin.charAt(i) - '0'; | 연산 가능한 수로 변환 시키는 것이다. 예 : '1' - '0' = 1 |
‘-‘앞과 위에 숫자로만 되어 있는지 체크
public static boolean isNumeric(String temp) {
for(int i = 0; i < temp.length(); i++) {
if(!( temp.charAt(i) >= '0'&& temp.charAt(i) <= '9'))
return false;
}
return true;
}
전달받은 주민번호로 1, 3이면 “남자”, 2, 4면 “여자”라는 문자열 반환
private static String genderCheck(String jumin) {
if((jumin.charAt(7) - '0') %2 ==0 ) //일반 숫자로 변경
return "여자";
return "남자";
}
+ 추가 기능(Option) - 생년을 확인하여 평년인 경우 0229가 입력되면 Fail 처리한다.
주민번호를 입력 : 210229-3123445
윤년인데, 2월 29일 OK
평년인데, 2월 29일 Fail
+ 전체 코드
더보기
package api;
import java.util.Scanner;
public class juminIDValid {
public static void main(String[] args) {
String jumin = null;
String gender = null,year, month, day;
int age = 0;
Scanner scanner = new Scanner(System.in);
System.out.print("주민번호를 입력하세요 >> ");
jumin = scanner.next();
String[] tmp = jumin.split("-");
if(!(isNumeric(tmp[0]) && isNumeric(tmp[1]))) {
System.out.println("올바르지 않은 주민번호입니다.");
return;
}
if(!(isValid(jumin))) {
System.out.println("올바르지 않은 주민번호입니다.");
return;
}
if(!(codeCheck(jumin))) {
System.out.println("올바르지 않은 주민번호입니다.");
return;
}
// 여기까지 오면 올바른 주민번호이므로 성별을 체크한다.
gender = genderCheck(jumin);
year = birthYear(jumin);
month = jumin.substring(2,4);
day = jumin.substring(4,6);
age = 2024 - Integer.parseInt(year);
//출력
System.out.println("당신은" + year +"년/ " + month +"월/ "+ day +
"일생. 나이는 " + age + "세, " + gender + "입니다.");
scanner.close();
}
// 주민번호를 전달받아 검증코드 알고리즘으로 올바른 주민번호인지 체크
private static boolean codeCheck(String jumin) {
int total = 0;
int tmp = 0;
int value = 2;
for(int i = 0; i<jumin.length()-1; i++) {
if(i ==6) continue;
tmp = jumin.charAt(i) - '0'; // '1' - '0' = 1
total += (tmp * value);
++value;
if(value ==10) value =2;
}
// 나머지 = 합계를 11로 나눈 나머지, 코드값 = 11-나머지
// 마지막 결과가 2자리인 경우 다시 10으로 나눈 나머지 값으로 검증을 한다.
int digit = jumin.charAt(jumin.length() -1) -'0'; // 검증값 : 주민번호 끝자리
int valid = 11 - (total % 11);
if (valid>9) valid = valid % 10;
System.out.println("끝자리 : " + digit + " , " + valid);
if(digit == valid) return true;
return false;
}
private static String birthYear(String jumin) {
String birth = null;
char gender = jumin.charAt(7);
if(gender == '1' || gender == '2') {
birth = "19";
} else {
birth = "20";
}
return birth + jumin.substring(0,2);
}
// 전달받은 주민번호로 1, 3이면 “남자”, 2, 4면 “여자”라는 문자열 반환
private static String genderCheck(String jumin) {
/*
* String gender = null;
if (jumin.charAt(7) == '1' | jumin.charAt(7)=='3') {
gender = "남자";
} else {
if (jumin.charAt(7) == '2' | jumin.charAt(7)=='4')
gender = "여자";
}
return gender; */
if((jumin.charAt(7) - '0') %2 ==0 ) //일반 숫자로 변경
return "여자";
return "남자";
}
// ‘-‘ 위치에 문자열이 올바르게 포함되어 있는지 체크하고,
// 성별의 범주가 1~4까지인지 체크
private static boolean isValid(String jumin){
boolean flag1 = false; // '-' 체크
boolean flag2 = false; // 성별체크
char gender = jumin.charAt(7);
if( jumin.charAt(6) == '-') flag1 = true;
if(gender >= '1' && gender <= '4') flag2 = true;
return flag1 && flag2; // 둘다 true 일때만 true 가 나가도록
}
public static boolean isNumeric(String temp) {
for(int i = 0; i < temp.length(); i++) {
if(!( temp.charAt(i) >= '0'&& temp.charAt(i) <= '9'))
return false;
}
return true;
}
}
'풀스택 개발 학습 과정 > 백엔드(Java, Spring)' 카테고리의 다른 글
[자바] LocalDate, Calendar, Anonymous (0) | 2024.01.30 |
---|---|
[자바] 예외 Exception (0) | 2024.01.30 |
[자바] 자바 주요 API - String (0) | 2024.01.29 |
[자바] ArrayList, HashSet, HashMap (0) | 2024.01.29 |