Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바switch문
- 자바연산자
- 연산자우선순위
- 프로그래머스
- 반복문라벨
- 팩토리얼재귀
- 클래스배열
- 자바별찍기
- 변수명명규칙
- 효율적인연산
- 겟셋함수
- 오라클
- 자바접근지정자
- 자바기타제어자
- 자바제어문
- 중첩for문
- 자바함수
- read()함수
- 자바형식
- 자바수우미양가
- SQL
- 누승재귀
- 자바if문
- 변수의 초기화
- 자바상수
- 기타제어자
- 자바자료형
- 자바실행방법
- 자바클래스
- 오버로딩
Archives
- Today
- Total
h-i-s-t-o-r-y
[Java] 주민등록번호 입력받아 남녀, 내외국인, 출생지, 검증하기 본문
package days09;
import java.util.Scanner;
public class Ex05 {
public static void main(String[] args) {
// ㄱㄴㄷㄹㅁㅂ - [ㅅ]ㅇㅈㅊㅋㅌㅍ
// 성별, 내/외국인, 세기
String rrn;
rrn = getRRN(); //입력예) 891223-1700001
System.out.printf("> RRN : %s\n", rrn);
// 1. 성별 boolean형 (조건식에 쉽게 사용하기 위해)
boolean gender = getGender(rrn);
if (gender) {
System.out.println("남자");
} else {
System.out.println("여자");
}
// 2. 내/외국인
if ( isforeigner(rrn) ) {
System.out.println("외국인");
} else {
System.out.println("내국인");
}
// 3. 세기 int getCentury(rrn)
// 1800년대 / 1900년대 / 2000년대
System.out.printf("%d년대", getCentury(rrn));
}//main
private static int getCentury(String rrn) {
char ㅅ = rrn.charAt(7);
switch (ㅅ-48) {
case 1: case 2: case 5: case 6: return 1900;
case 3: case 4: case 7: case 8: return 2000;
} return 1800;
}//세기
private static boolean isforeigner(String rrn) {
char ㅅ = rrn.charAt(7);
switch (ㅅ) {
case '5': case '6': case '7': case '8': return true;
} return false;
}//내외국인
public static boolean getGender(String rrn) {
char ㅅ = rrn.charAt(7);
return (ㅅ - 48) % 2 == 1? true: false;
/*
switch (ㅅ - 48) { //'1' 문자-48 -> 숫자1
case 9: case 1: case 3: case 5: case 7: return true;
default: return false;
}
*/
}//성별
// 주민번호 입력받기
// 유효성검사 \d{6}-\d{7}
public static String getRRN() {
String rrn;
String regex = "\\d{6}-\\d{7}";
boolean flag=false;
do {
if (flag) System.out.println("> 올바른 주민번호가 아닙니다.");
System.out.print("> 주민번호 입력 ? ");
Scanner scanner = new Scanner(System.in);
rrn = scanner.nextLine();
} while (flag = !rrn.matches(regex));
return rrn;
}//주민번호 입력+유효성검사
}//class
// 주민번호를 입력받아서.. ㅅ만 알면
// 1. 성별
// 2. 생년월일(생일)
// 3. 세기
// 4. 출생지역
// 5. 내/외국인
// 6. 검증
// 7. 나이
// Resident Registration Number, RRN
// ㄱㄴㄷㄹㅁㅂ - ㅅㅇㅈㅊㅋㅌㅍ
// 1) ㄱㄴㄷㄹㅁㅂ 생년월일
// 2) ㅅ 성별
// 3) ㅇㅈㅊㅋ 지역
// 4) ㅌ 신고순번
//검증
//ㅍ = 11-{(2×ㄱ+3×ㄴ+4×ㄷ+5×ㄹ+6×ㅁ+7×ㅂ+8×ㅅ+9×ㅇ+2×ㅈ+3×ㅊ+4×ㅋ+5×ㅌ) mod 11}
package days10;
import java.util.Date;
import days09.Ex05;
public class Ex02 {
public static void main(String[] args) {
String rrn; //980131-2192224
rrn = Ex05.getRRN();
boolean gender = Ex05.getGender(rrn);
System.out.println( gender ? "남자" : "여자" );
int century = getCentury(rrn);
System.out.printf("%d년\n", century);
// 주민등록번호 로부터 생년월일 출력 (18/19/20)98 01월 31일 생
String birthday = getBirthday(rrn);
System.out.println( birthday );
// 나이
// 1) 세는 나이 : 새해 1월 1일이 되면 1살 증가
// 2) 만 나이 : 태어나면 0세 1년이 되어 생일이 지나면 1살 증가
// 만나이를 반환하는 메서드
int age = getAge(rrn);
System.out.printf("만 %d세 입니다.\n", age);
}//main
private static int getAge(String rrn) {
// 기준일은 오늘날짜(2021.03.19)로 ...
Date d = new Date();
int year = Integer.parseInt(rrn.substring(0, 2));
int century = getCentury(rrn);
year += century;
int thisYear = d.getYear()+1900;
// 세는 나이 = thisYear - year + 1
int age = thisYear - year - 1;
// 생일 지났는지 여부 처리.. +1
// 월+일 정수형
// 1231 <= 319 +1코딩
int t_monthday = (d.getMonth()+1)*100 + d.getDate();
int b_monthday = Integer.parseInt(rrn.substring(2, 6));
if (t_monthday>=b_monthday) {
age++;
}
return age;
}//getAge
private static String getBirthday(String rrn) {
int year = Integer.parseInt(rrn.substring(0, 2));
int month = Integer.parseInt(rrn.substring(2, 4));
int day = Integer.parseInt(rrn.substring(4, 6));
int century = getCentury(rrn);
year += century;
String birthday = String.format("출생년도 : %d년 %02d월 %02d일\n", year, month, day);
return birthday;
}
public static int getCentury(String rrn) {
int ㅅ = rrn.charAt(7) - 48;
int century;
switch (ㅅ) {
case 0: case 9: century = 1800; break;
case 1: case 2: case 5: case 6: century =1900; break;
default: century = 2000; break;
}
return century;
}
}//class
package days10;
public class Ex02_02 {
public static void main(String[] args) {
String rrn = "980131-2192224";
// 98 출생년도
// 01 출생월
// 31 출생일
// charAt 한문자 말고 여러개의 문자 가져오기
// String.substring() 메서드
// 문자열 속에서 내가 원하는 문자열을 String 형태로 읽어오는 함수
String year = rrn.substring(0, 2); // (비긴인덱스~엔드인덱스-1) 자리의 문자를 읽어옴
String month = rrn.substring(2, 4);
String day = rrn.substring(4, 6);
System.out.printf("출생년도 : %s년 %s월 %s일\n", year, month, day);
// endIndex 를 설정하지 않으면 문자열 끝까지를 읽어옴
System.out.println(rrn.substring(7));
// 문자열 연결 연산자 +
String chgrrn = rrn.substring(0,8) + "******";
// 문자열 연결 메서드 String.concat()
String chgrrn2 = rrn.substring(0,8).concat("******") ;
System.out.println(chgrrn);
System.out.println(chgrrn2);
}
}
package days10;
import java.util.Date;
import javax.xml.crypto.Data;
public class Ex02_03 {
public static void main(String[] args) {
// Date 클래스 - 날짜 정보
Date d = new Date();
// Fri Mar 19 14:15:00 KST 2021
// System.out.println(d);
//Deprecated 삭제될 함수
int year = d.getYear();
System.out.println(year+1900); //2021-1900 = 121
int month = d.getMonth();
System.out.println(month+1); //0(1월)~11(12월) -> 2(3월)
int day = d.getDate();
System.out.println(day); //날짜는 잘 나옴
}//main
}//class
package days10;
public class Ex03 {
public static void main(String[] args) {
String rrn = "980131-2192224";
if (isRRNCheck(rrn)) {
System.out.println("올바른 주민등록번호입니다.");
} else {
System.out.println("잘못된 주민등록번호입니다.");
}
}//main
private static boolean isRRNCheck(String rrn) {
// ㄱㄴㄷㄹㅁㅂ - ㅅㅇㅈㅊㅋㅌㅍ
// ㅍ = 11-{(2×ㄱ+3×ㄴ+4×ㄷ+5×ㄹ+6×ㅁ+7×ㅂ+8×ㅅ+9×ㅇ+2×ㅈ+3×ㅊ+4×ㅋ+5×ㅌ) mod 11}
// ㅍ=10 -> 1 ㅍ= 11->0
// 쌤이한거
int tot = 0;
int [] m = {2,3,4,5,6,7,0,8,9,2,3,4,5};
for (int i = 0; i < m.length; i++) {
tot += (rrn.charAt(i)-48)*m[i];
}
int ㅍ = 11- (tot % 11);
if(ㅍ==10) ㅍ=1;
else if(ㅍ==11) ㅍ=0;
int ㅎ = rrn.charAt(13) - 48;
return ㅍ==ㅎ;
/* 직관적으로
// int ㄱ = Integer.parseInt(rrn.substring(0, 1));
int ㄱ = rrn.charAt(0) - 48;
int ㄴ = rrn.charAt(1) - 48;
int ㄷ = rrn.charAt(2) - 48;
int ㄹ = rrn.charAt(3) - 48;
int ㅁ = rrn.charAt(4) - 48;
int ㅂ = rrn.charAt(5) - 48;
// '-' 6
int ㅅ = rrn.charAt(7) - 48;
int ㅇ = rrn.charAt(8) - 48;
int ㅈ = rrn.charAt(9) - 48;
int ㅊ = rrn.charAt(10) - 48;
int ㅋ = rrn.charAt(11) - 48;
int ㅌ = rrn.charAt(12) - 48;
int ㅍ = 11- ((2*ㄱ+3*ㄴ+4*ㄷ+5*ㄹ+6*ㅁ+7*ㅂ+8*ㅅ+9*ㅇ+2*ㅈ+3*ㅊ+4*ㅋ+5*ㅌ) % 11);
if(ㅍ==10) ㅍ=1;
else if(ㅍ==11) ㅍ=0;
int ㅎ = rrn.charAt(13) - 48;
return ㅍ==ㅎ;
*/
/*내가한거
int mul;
int sum = 0;
for (int i = 2, j = 0; j < rrn.length()-1 ; j++) {
if (j==6) continue;
mul = i*Integer.parseInt(rrn.substring(j, j+1));
sum += mul;
if (i==9) i=1;
i++;
}
int ㅍ = 11- (sum % 11);
//10이랑 11처리안함 ㅜㅜ
if (ㅍ == Integer.parseInt(rrn.substring(13)) ) return true;
else return false;
*/
}//check
}//class
'Java' 카테고리의 다른 글
[Java] ArrayList 클래스 (0) | 2021.07.16 |
---|---|
[Java] 입력, 수정, 삽입, 삭제, 출력, 검색, 종료 프로그램 (0) | 2021.07.16 |
[Java] 카드번호 랜덤 위치 마스킹 (0) | 2021.07.16 |
[Java] 랜덤 로또 번호 발생기 (0) | 2021.07.16 |
[Java] Arrays 클래스 - 배열 요소 검색하기, 배열 복사 (0) | 2021.07.16 |
Comments