자자 일단 조건을 살펴보자!!!!!
/*
*
* [문제] 년도를 입력받아 윤년과 평균을 구별하여 출력하라.
* 1행은 입력받을 데이터수.
* 2행은 그만큼 데이터를 입력받기.
*
*
* 1. 4의 배수의 해는 윤년이다 하지만 100의 배수는 아니여야 한다.
* 2. 400년 단위로 한번씩은 윤년이다.
*
*
* [입력]
* 6
* 4 100 400 2000 2001 2004
*
* [출력]
* #1 윤년
* #2 평년
* #3 윤년
* #4 윤년
* #5 평년
* #6 윤년
*
*/
그렇데요….
저는 일단 배열을 생성해서 그곳에 데이터값을 저장하고 하나씩 반복문을 통해
불러와서 판별하고 출력까지 같이 했습니다!
완성된 코드를 보면서 같이 해석하고 풀면서 생겼던 문제점을 알아봅시다!
Scanner sc = new Scanner(System.in);
//데이터 수를 입력 받고 그만큼 배열을 생성.
System.out.print("입력할 년도는 몇개입니까? :");
int[] year = new int[sc.nextInt()];
// 배열생성과 동시에 초기화할 배열의 크기를 Scanner를 이용해 입력받는다.
System.out.print(year.length+"개의 "+"년도를 입력하세요:");
for(int i=0; i<year.length; i++) {
// 입력받은 배열의 크기만큼 반복!
year[i]=sc.nextInt();
// 반복은 0번지 부터 했기에 배열의 인덱스(i)에 들어가는 값은 처음부터 입력하는 값대로
// 인덱싱에 순차적으로 들어간다.
}
for(int i=0; i<year.length; i++) {
if(year[i]%4==0 && year[i]%100!=0 || year[i]%400==0) {
// 4로 나눠지면 윤년이지만! 100으로 나눠지는건 아니다! || 하지만 400년으로 나눠지는건 윤년이다~
// 여기서 삼항연산자가 헷갈릴 수도 있는데
// ( year[i]%4==0 && year[i]%100!=0 ) 이거를 하나로 비교를 하고 있는거고
// year[i]%400==0 <= 이거랑 위에 조건문 둘중 하나가 합당하게 되면 진행하는것이다!
System.out.println("#"+(i+1)+" 윤년");
}else {
System.out.println("#"+(i+1)+" 평년");
}
}
// === 출력문 ===
//입력할 년도는 몇개입니까? :5
//5개의 년도를 입력하세요:
//2020
//1040
//1000
//400
//300
//#1 윤년
//#2 윤년
//#3 평년
//#4 윤년
//#5 평년
설명은 주석처리를 해놓아서 위에가 곧 설명이네요 엣흠. 그렇다면 코딩하면서 막혔던 부분은????
조건식에서…
처음에 조건문을 (if) 으로 만들때
year[i]%4==0 || year[i]%100!=0 || year[i]%400==0
이렇게 만들었는데 실행을 해보니 다 평년으로 나오는것이다 허허허허허헣!
그 이유는 내가 실행하고자 하는 조건문을 글로 써보자면
입력한 year[i] 의 년도가 4로나눠지거나, 100으로 나눠지면 안되거나, 400으로 나눠지면 !!!
윤년이다! 라고 생각하고 짰는데 저렇게 짜면 생각해보니 | | year[i]%100!=0. 이 친구때문에 식이 성립이 안되고
모든 년도가 else문으로 넘어가서 평년으로 처리가 되버린다는것이였다.
그렇다면 해결법은 ?? if문을 하나 더 만들까 라고 생각을 했었다 사실 ㅋ……….
if(year[i]%4==0 && year[i]%100!=0 || year[i]%400==0)
자자 이렇게 짜고 글로 써보면 어떤 내용일까??
년도가 4로 나눠서 0이 나오면 윤년인데 만약에 년도가 100으로 나눴을때 0이 나오면 이건 윤년이 아니야!
그래서 ! 를 사용해서 만약에 나눠지게 되면 false값을 넣어 else문으로 넘어가게 만들었다.
그런데 만약 400으로 나눠지면 윤년인데 이것 역시 100으로 나눠지잖아?…. 어또카지…….
는 무슨 삼항연산자인 || 를 써서
(4로 나눠서 0이 나오면 true && 100으로나눠서 0이 나오면 false) | | 400으로 나눠서 0이 나오면 true
자 이렇게 보면 ||(또는) 을 사용했기 때문에 둘중 하나가 true값이 나오면 조건문이 성립한다.
그래서 400으로 나눠지면 100으로 나눠지는 식에 성립이 되지만 서로 다르게 묶어논 상태에서 || 를 썻기때문에 true가 된다
이렇게 해결을 했습니다 데헷ㅋ
ㅋㅋ 데헷 화이팅 ㅋㅋ
'Java' 카테고리의 다른 글
InnerClass 왜 사용할까? (0) | 2023.01.13 |
---|---|
Java Collection ApI 핵심 정리 (0) | 2023.01.13 |
추상클래스와 인터페이스 (0) | 2023.01.13 |
Static 이란? (0) | 2023.01.13 |
2ndArray 2차원배열 (0) | 2023.01.13 |