1. days05 관련 복습문제 풀이
- 문제) 두 정수 n, m을 입력받아 두 정수 사이의 합을 구해서 출력
입력 형식) 두 정수 입력 ? 3 5 엔터
출력 형식) 3+4+5=12
- 풀이 1)
1) 변수 선언 및 Scanner 메서드 호출
2) while문을 사용하여 풀기
3) for문을 사용하여 풀기
위에 있는 for문과 while문의 문제점이 있다. 입력받은 정수 중 n 값이 m 값보다 크면 반복문 수행이 되지 않아 sum이 0으로 출력이 된다. 이 문제를 해결하기 위해서 아래 코드로 풀기로 했다.
- 풀이 2)
if (n > m) {
for (int i = m; i <= n; i++) {
sum += i;
System.out.print(i + "+");
}
} else if (n < m) {
for (int i = n; i <= m; i++) {
sum += i;
System.out.print(i + "+");
}
} System.out.println("\b=" + sum);
- 풀이 3) n 값이 더 클때 자리를 바꿔서 출력
if(n > m) {
// 자리 바꿈
int temp = n;
n = m;
m = temp;
} // 항상 n < m
for(int i = n; i <= m; i++) {
sum += i;
System.out.print(i + "+");
} System.out.println("\b=" + sum);
- 풀이 4) 가장 좋은 코딩
int min = n > m ? m : n;
int max = n > m ? n : m;
for(int i = min; i <= max; i++) {
sum += i;
System.out.print(i + "+");
} System.out.println("\b=" + sum);
2. for each문과 배열
1) for each문 선언형식
for (자료형 변수명 : 배열 또는 컬렉션) {
}
2) 배열 선언과 동시에 초기화하기
- int[] kors = {90, 89, 78, 56, 88};
// int[] kors = new int[] {90, 89, 78, 56, 88}; > 코드에서 new int[] 삭제해도 정상 실행됨
* 배열은 배열의 각 요소를 초기화하지 않아도 출력시 에러가 발생하지 않고 배열의 자료형으로 자동으로 초기화가 됨.
코드 예제1) for문을 이용한 배열 출력과 foreach문을 이용한 배열 출력
3. Character.isAlphabetic() 메서드
- 선언형식 : Character.isAlphabetic(int codePoint)
- int codePoint => Unicode code point => 전 세계의 문자
4. 중첩 for문(다중 for문)
첫 번째 for문은 행, 두 번째 for문은 열과 관련이 있다고 생각하고 풀기
별찍기 문제는 규칙을 찾아서 풀면 수월!
코드 예제1)
코드 예제2)
4-1. 중첩 for문 연습(별찍기)
1) [1번 문제]
// *
// **
// ***
// ****
<반복 규칙>
i=1 j 1 *
i=2 j 2 **
i=3 j 3 ***
i=4 j 4 ****
2) [2번 문제]
// ****
// ***
// **
// *
<반복 규칙>
i=1 j=4 ***
i=2 j=3 ***
i=3 j=2 **
i=4 j=1 *
i + j == 5
i + j == 5
3) [3번 문제] > 1문제 + 2문제
// ___*
// __**
// _***
// ****
<반복 규칙>
i=1 j=3 ___ *
i=2 j=2 __ **
i=3 j=1 __ ***
i=4 j=0 _
i + j == 4
j == 4 - i
4) [4번 문제]
행 공백 별
// **** i=1 j=0 j=4 ****
// _*** i=2 j=1 j=3 ***
// __** i=3 j=2 j=2 **
// ___* i=4 j=3 j=1 *
i = j + 1 i + j == 5
j = i - 1 j == 5 - i
5) [5번 문제 ( 이등변 삼각형 )]
행 공백 별
// __* i = 1 2 1
// _*** i = 2 1 3
// ***** i = 3 0 5
i + j = 3
j = 3-i 2*i-1
6) [6번 문제( 마름모 )]
// __*
// _***
// *****
// _***
// __*
7) [7번 문제]
// * i=1 j=0
// _* i=2 j=1
// __* i=3 j=2
// ___* i=4 j=3
// ____* i=5 j=4
8) [8번 문제]
// ____*
// ___*
// __*
// _*
// *
9) [9번 문제]
// *___*
// _*_*
// __*
// _*_*
// *___*
4-2. 중첩 for문 연습(구구단 출력)
1) 가로로 출력하기
2) 세로로 출력하기
5. 년도를 입력받아서 윤년/평년 출력하기
코딩을 하기 전에 윤년과 평년의 정확한 의미를 파악해야한다!
네이버에 윤년을 검색하여 두산백과에 있는 자료로 정리를 해보았다.
정리한 내용을 [요구분석서]라고 생각하면 조금 와닿는 느낌이지 않을까 싶다.
1) 요구분석서 : 윤년과 평년의 정확한 의미
ㄱ. 윤년(leap year)? 태양력에서 2/29까지 있는 년도
치윤법(?)에 따라 400년에 97년을 윤년 : 400년 중 97년이 윤년 :
1년 == 365일 / 율리우스력(1년에 0.0078일의 오차가 있음)
(정확)1년 == 365.2422일 / 1년에 0.25일
2년 == 365.4844일
3년 == 365.7266일
4년 == 365.9688일 / 4년마다 1일 > 2/29(윤년)
> 율리우스력보다 그레고리오력이 오차가 작아 그레고리오력을 사용하여 윤년을 계산한다고 한다.
"그레고리오력(치윤법 사용) 윤년을 치환하는 법(규칙) 1년 == 365.2425일 > 0.0003일 오차
① 서력 기원 연수가 4로 나누어 떨어지는 해는 우선 윤년으로 하고,
// 4/8/12/16/20.../100/200..400/800 4의 배수 년도 -> 윤년
// year % 4 == 0
② 그 중에서 100으로 나누어 떨어지는 해는 평년으로 하며, (떨어지지않으면 윤년)
// .../100(평년)/200(평년)/ ..400/800
// year % 100 != 0
③ 다만 400으로 나누어 떨어지는 해는 다시 윤년으로 정하였다.
// ..400(윤년)/800(윤년)
// year % 400 == 0
> 400년이되면 97번의 윤년이 발생
> 한국은 1896년부터 태양력(그레고리오력)을 사용하고 있다.
ㄴ. 평년(common year)? 태양력에서 2/28까지 있는 년도
2) [String.matches(regex) 메서드]
boolean sYear.matches(String regex);
String regex 정규표현식 => regex == Regular Expression 줄임말
ㄱ. 기능 : 주어진 매개변수인 정규표헌식(regex)에 일치하는 체크하는 메서드
ㄴ. 매개변수 : String regex 정규표현식 / regex == Regular Expression 줄임말
ㄷ. 리턴값(리턴자료형) => boolean true/false
ex) String regex = "[0-9]+"; => [0-9] 숫자가 1개 이상 나와야 하는 정규표현식 ([+] : 반복횟수 1번 이상~)
3) 문제 풀이
- 입력한 값이 숫자가 아닐 경우 다시 입력할 수 있도록 do while 문을 사용하여 처리 => 유효성검사
- 유효성검사를 위해서 String.matches() 메서드 사용 => 입력 받은 값을 String으로 전환하여 검사하기
- 입력받은 값이 숫자이면 int형으로 형변화 하기(Integer.parseInt() 메서드 사용)
- 요구분석서에 나온 규칙으로 if else 문을 활용하여 입력받은 값을 윤년인지 평년인지 출력하기
'TIL > Java' 카테고리의 다른 글
[SIST] Java_days08 (0) | 2022.02.24 |
---|---|
[SIST] Java_days07 (0) | 2022.02.23 |
[SIST] Java_days05 (0) | 2022.02.21 |
[Java] 대소문자 구별없이 비교하기 : equalsIgnoreCase() (0) | 2022.02.20 |
[SIST] Java_days04 (0) | 2022.02.18 |