백준 2753 ) 윤년 (java)

2021. 8. 10. 23:40코딩/Python

* 윤년이란? 

- Leap Year. 4년에 한 번씩 생기는 2월 29일 

윤년이 생겨난 이유는 실제로 지구가 태양을 한 바퀴 도는데는 365.2422일이 걸린다. 1년을 365일으로만 단정지어버리면 매년 오차 발생 > 달력과 계절이 달라짐 > 오차를 바로잡기 위해 '윤년'이라는 개념이 생겨남 

 

윤년을 구하는 문제는 프로그래밍 언어 문제에서 자주 등장하는 예제이다. 

 

실행 코드

import java.util.Scanner; 

public class Test {
	public static void main(String[] args){
		
		Scanner sc = new Scanner(System.in);
		int year=sc.nextInt(); // 사용자로부터 연도 값을 입력받은 후 int형으로 형변환한다. 
		
		if(year>=1 && year<=4000) { // 연도의 범위가 1보다 크거나 같고 4000보다 작거나 같은 자연수여야 하므로 if 조건문을 왼쪽과 같이 설정해준다. 
			if((year%4==0)&&((year%100!=0)||(year%400==0))){ // 연도는 4의 배수이면서(&&) 100의 배수가 아닐 때(!=) 또는(||) 400의 배수 일 때 이므로 왼쪽과 같이 if문 내의 중첩 if문 작성 
				System.out.println("1"); // 윤년 연도에 해당하므로 1을 출력한다. 
			}
			else {
				System.out.println("0"); // 윤년 연도에 해당하지 않으므로 0을 출력한다. 
			}
		}
		
		else { 
		
			System.out.println("숫자 범위에서 벗어났습니다.4000이하의 자연수로 입력하세요"); // 연도의 범위가 1보다 크거나 같지 않고 4000보다 작거나 같은 자연수가 아니면 조건에 부합하는 숫자가 아니므로 다른 수를 입력하도록 한다. 
		}
		sc.close(); // 사용자로부터 Scanner입력을 중단한다. 
	}
}

실행 결과 

 

 

또 다른 방법 

https://st-lab.tistory.com/23 다른 분의 코드를 참고해보니, 삼항 연산자로도 풀 수 있다고 한다. 

삼항 연산자는 생각해보지 못한 방법이었다. 

 

import java.util.Scanner; 

public class Test {
	public static void main(String[] args){
		
		Scanner sc = new Scanner(System.in);
		int year=sc.nextInt(); // 사용자로부터 연도 값을 입력받은 후 integer형으로 형변환한다. 
		
		sc.close();
		
		System.out.println((year%4==0)?((year%400==0)?"1":(year%100==0)?"0":"1"):"0");
	}
}

확실히 코드가 간결해졌다. 

 

 

이용한 문법 

java.util.Scanner - util 패키지 안에 있는 Scanner 클래스를 이용하여 사용자로부터 값을 입력받는다. 

nextInt() - 사용자로부터 입력받은 값을 Integer(정수)형태로 형변환한다. 

&& - 관계연산자(AND) 두 조건이 모두 만족해야 해당 조건문이 실행된다.

|| - 관계연산자(OR) 두 조건 중에 하나의 조건만 만족해도 조건문이 실행된다. 

삼항 연산자 - 조건식? 피연산자1 : 피연산자2 (if~else if문 대용. 코드를 간결하게 하기 위함) 

 조건식의 연산결과가 true이면 피연산자 1의 값으로 가고, false이면 피연산자 2의 값으로 간다. 

 

위의 삼항 연산자를 해석해보면 ((year%4==0)?((year%400==0)?"1":(year%100==0)?"0":"1"):"0"); 

-- 조건식 2개짜리만 보다가 복잡한 조건식은 처음이다.. 나름 해석해보았는데, 혹시 틀린 부분이 있다면 피드백 적극 환영합니다 ! 

 

1) (year%4==0)이 true 이면 "1" 

2) (year%400=0)이 true 이면 "1") 

3) (year%100=0)이 true 이면 "0" 

4) (year%100=0)이 false 이면 "1" (100의 배수는 윤년의 조건에 부합하지 않으므로 false로 부정해야 true가 된다) 

5) (year%400==0)?"1":(year%100==0)은 false 이므로 "0" (바깥쪽)이 아닐까 싶다.. 

 

 

'코딩 > Python' 카테고리의 다른 글

백준 2739 ) 구구단 (java)  (0) 2021.08.18
백준 2884 ) 알람 시계 (java)  (0) 2021.08.11
백준 14681 ) 사분면 고르기 (java)  (0) 2021.08.11
백준 9498 ) 시험 성적 (java)  (0) 2021.08.08
백준 1330 ) 두 수 비교하기 (java)  (0) 2021.08.08