Java

윤년과 평년을 구별하는 프로그래밍

WOOOOJI 2023. 1. 13. 22:18

자자 일단 조건을 살펴보자!!!!!

/*
		 * 
		 * [문제] 년도를 입력받아 윤년과 평균을 구별하여 출력하라.
		 * 		 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가 된다

이렇게 해결을 했습니다 데헷ㅋ

ㅋㅋ 데헷 화이팅 ㅋㅋ

728x90