[BaekJoon] 2753번 - 윤년 (java)

1. 문제

👉 문제 바로가기

- 조건

시간 제한 메모리 제한
1초 128MB


- 문제

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.
윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.
예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다. 1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다.

- 입력

첫째 줄에 연도가 주어진다. 연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.

- 출력

첫째 줄에 윤년이면 1, 아니면 0을 출력한다.

- 예제

  입력      출력  
2000 1
1999 0





2. 풀이

  • 조건에 따라 윤년인 경우만 1 을 출력해야 하기 때문에 조건문 if를 사용한다.
    연도가 4의 배수인 경우 중에서, 100의 배수가 아닐 때 또는 400의 배수일 때를 찾아야 한다.
    그래서 연도가 4의 배수인 if 조건문 안에서 조건문을 중첩하여 윤년인 경우와 그렇지 않은 경우를 찾아낸다.
  • 또한 if 대신 삼항 연산자 를 사용해서 조건문을 한 줄로 줄이는 방법도 설명한다.



1-1. 4의 배수인 경우 → if(연도%4==0)
     2-1. 4의 배수이면서, 100의 배수가 아닌 경우 → if(연도%100!=0)
     2-2. 4의 배수이면서, 400의 배수인 경우 → if(연도%400==0)
     2-3. 4의 배수이면서, 100의 배수거나 400의 배수가 아닌 경우 → else
1-2. 4의 배수가 아닌 경우 → else



[짚고 넘어가기!]
조건식 안의 %나머지를 의미한다.
예를 들어, 연도%4==0 일 때, 연도를 4로 나눈 나머지가 0이면 4의 배수이다.




이제 2가지 입력방법을 사용해서 결과를 출력한다.

  1. Scanner 클래스
  2. BufferedReader 클래스


- 1. Scanner 클래스 사용

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int A = sc.nextInt();
        
        if(A%4==0){
            if(A%100!=0 || A%400==0) System.out.println("1");
            else System.out.println("0");
        } 
        else System.out.println("0");
    }
} 

위와같이 객체를 생성할 때, Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는 것을 뜻한다.

int형을 입력받을 때는 nextInt() 메서드를 사용한다.

|| 는 논리연산자로 OR 의 의미이다.



[여기서 잠깐!]

Scanner에 대해 더 자세히 알고싶다면 여기 를 클릭하세요
조건문에서 논리연산자 &&,||와 비트연산자 &,| 차이를 알고싶으면 여기 를 클릭하세요




- 2. BufferedReader 클래스 사용

BufferedReader는 readLine() 메서드를 사용해 한 행을 전부 읽는다.


여기서 삼항 연산자도 함께 사용해보자.

변수 = (조건문) ? (true 인 경우 연산) : (false 인 경우 연산)

조건이 2개 이상일 경우, 두번째 연산 위치에 또 다른 삼항 연산자를 쓸 수 있다.



import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
 
	public static void main(String[] args) throws IOException {
        
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
		int A = Integer.parseInt(br.readLine());
		
		System.out.print((A%4==0)?((A%100!=0)?"1":(A%400==0)?"1":"0"):"0");
	}
}

readLine()은 한 줄을 통째로 읽어 String으로 반환하기 때문에 Integer.parseInt()을 사용해 int형으로 변환시켜준다.

삼항 연산자에서 A가 4의 배수이면 삼항 연산자를 중첩해 조건을 체크한다.



[여기서 잠깐!]

BufferedReader 클래스에 대해 더 알아보고 싶으면 여기를 클릭하면 된다.




3. Scanner VS BufferedReader 성능 비교

image

입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.




관련 페이지

Categories:

Updated:

Leave a comment