프로그래밍/자바공부 - 수업일차별

수업 10일

leecoder 2021. 9. 1. 23:58

함수

1.“문자열”.substring(시작위치, 끝나는 위치+1);

 

[주민등록번호]

String rrn = ㄱㄴㄷㄹㅁㅂ-ㅅㅇㅈㅊㅋㅌ

1. 생년월일 getBirthday(rrn)

public static String getBirthday(String rrn){
	String year = rrn.substring(0,2);
	String month = rrn.substring(2,4);
	String day = rrn.substring(4,6);

	String gender = rrn.substring(7,8);
	switch(gender){
		case "9": case "0":
			year = 18 + year;
			break;
		case "1": case "2": case "5": case "6":
			year = 19 + year;
			break;
		case "3": case "4": case "7": case "8":
			year = 20 + year;
			break;
	}
	return String.format("%s년%s월%s일", year, month, day);
}

2. 성별 (9,0 : 1800년대)(1,2 : 1900년대)(3,4 : 2000년대)(5,6 : 1900년대 외국인) (7,8 : 2000년대 외국인)

public static boolean getGender(String rrn){
	String gender = rrn.substring(7,8);
	String maleRegex = "[13479]";
	return gender.matches(maleRegex);
}

3. 출생지역 (출생등록지 + 주민센터) + 순서

4. 나이

public static int getAge(String birthday,String choice){
	Date d = new Date();
	int thisYear = d.getYear()+1900;
	int thisMonth = d.getMonth()+1;
	int thisDay = d.getDate();

	int birthYear = Integer.parseInt(birthday.substring(0,4));
	int birthMonth = Integer.parseInt(birthday.substring(5,7));
	int birthDay = Integer.parseInt(birthday.substring(8,10));

	int age = 0;
	if(choice == "한국") age = thisYear - birthYear +1;
	else if(choice == "만") {
		boolean isCheck = thisMonth*100 + thisDay >= birthMonth*100 + birthDay;
		age = thisYear - birthYear –1;
		age = isCheck ? ++age : age;
	}
	return age;
}

5. 외국인 / 내국인

public static boolean isCheckLocal(String rrn){
	String checkNumber = rrn.substring(7,8);
	String regex = "[0-9&&[^5-8]]";
	return checkNumber.matches(regex);
}

6. 태어난 세기

7. 검증 체크

  • ㅍ = 11-{(2*ㄱ+3*ㄴ+4*ㄷ+5*ㄹ+6*ㅁ+7*ㅂ+8*ㅅ+9*ㅇ+2*ㅈ+3*ㅊ+4*ㅋ+5*ㅌ) % 11}
  • 즉, 소괄호 안에 있는 것을 계산한 값을 11로 나눠서 나온 나머지를 11에서 뺀 값이 ㅍ이다.
  • (단, 10은 0, 11은 1로 표기한다.)
public static boolean checkRrn(String rrn){
	int [] m = {2,3,4,5,6,7,0,8,9,2,3,4,5};
	int ㅎ = Integer.parseInt(rrn.substring(13,14));
	int ㅍ = 0;
	for(int i = 0; i <=12; i++){
		if(i == 6) continue;
		ㅍ += Integer.parseInt(rrn.substring(i,i+1))*m[i];
	}
	return ㅎ == (11 - (ㅍ % 11) % 10);
}

 

만년달력

1. 년도와 월 입력받기.

2. 달력그리기

  • 년, 월의 1일의 요일 ?  2010.5.1
    • 1.1.1 ~ year.month.1 까지의 총 날짜수 %7 => ?요일(0:월, 1:화, 2:수, ... 6:금) 
    • public static int getDateOfWeek(int year, int month){ int totalDay = 0; totalDay = (year-1)*365 + (year-1)/4 - (year-1)/100 + (year-1)/400; for(int i = 1; i < month; i++) totalDay += getLastDay(year,i); return (totalDay + 1) % 7; }​
  • 년,월 마지막 날짜 31일
    • 28 : 평년 2월
    • 29 : 윤년 2월
    • 30 : 4,6,9,11 월
    • 31 : 1,3,5,7,8,10,12 월
      public static int getLastDay(int year, int month){
      	int [] m = {31,28,31,30,31,30,31,31,30,31,30,31};
      	if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ) m[1]++;
      	return m[month-1];
      }​
       

클린코드

1.

if( 오늘월 > month || 오늘월 == month && 오늘일 >= day) age +=1;
int b_monthday = Integer.parseInt(rrn.substring(2, 6)); // -> "0112" -> 112
int t_monthday = 오늘월*100 + 오늘일;
if(t_monthday >= b_monthday) age++;

2.

String [] splitRrn = rrn.split("");
int [] intRrn = new int[splitRrn.length-1];
int sum = 0, lastNumber = 0;
boolean isCheck = false;
for (int i = 0; i < splitRrn.length -1; i++)
intRrn[i] = Integer.parseInt(i < 6? splitRrn[i] : splitRrn[i+1]);
for (int i = 1, k=0; i<= 2; i++)
for (int j = 2; i == 1? j<= 9 : j<= 5; j++, k++)
sum += intRrn[k]*j;
lastNumber = (11 - (sum % 11));
if (lastNumber == 10) lastNumber = 0;
else if (lastNumber == 11) lastNumber = 1;
isCheck = lastNumber == intRrn[intRrn.length-1];


System.out.println((isCheck ? "올바른": "잘못된" ) + " 주민등록번호 입니다." );
int = Integer.parseInt(rrn.substring(13, 14));
int = 0;
int [] m = {2,3,4,5,6,7,0,8,9,2,3,4,5};
for (int i = 0; i <= 12 ; i++)
if(i == 6) continue; += Integer.parseInt(rrn.substring(i, i+1))*m[i];
= (11-(%11)) % 10;


System.out.println((==? "올바른" : "잘못된") + "주민등록번호 입니다.");

3.

switch(month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
lastDay = 31;
break;
case 4: case 6: case 9: case 11:
lastDay = 30;
break;
case 2:
lastDay = Ex02_02.isleapCheck(year) ? 29 : 28 ;
break;
default :
System.out.println("월 잘못입력");
break;
}
return lastDay;
int [] months = {31,28,31,30,31,30,31,31,30,31,30,31};
return Ex02_02.isleapCheck(year) && month == 2 ? ++months[month-1] : months[month-1];

4.

int [] months = {31,28,31,30,31,30,31,31,30,31,30,31};
months[1] = Ex02_02.isleapCheck(year)? 29 : 28;
int totalDays = 0;
for (int k = 1; k < year; k++) totalDays += Ex02_02.isleapCheck(k)? 366 : 365;
for (int k = 1; k < month; k++) totalDays += months[k-1];
return totalDays +i;
totalDays = (year - 1) * 365 + (year -1)/4 - (year-1)/100 + (year-1)/400;
for (int k = 1; k < month; k++) totalDays += getLastDay(year,k);
return totalDays + i;

 

 

'프로그래밍 > 자바공부 - 수업일차별' 카테고리의 다른 글

수업 12일차  (0) 2021.09.11
수업 11일차  (0) 2021.09.02
수업 9일차  (0) 2021.09.01
수업 8일차  (0) 2021.08.31
수업 7일차  (0) 2021.08.30