[백준] 2753번 : 윤년 - JAVA [자바]
https://www.acmicpc.net/problem/2753
-
문제
- 2가지 입력방법을 이용하여 풀이한다.
Scanner 로 입력받아 연산하는 방법과 BufferedReader 로 입력받아 연산하는 방법, 두 가지 방법을 통해 풀이해보고자 한다.
위 방법은 앞서 포스팅에서도 언급했으니 만약 쓰는 방법을 모른다면 아래 링크를 통해 읽어보는 것을 추천한다.
- 알고리즘
조건을 보면 4의 배수는 윤년으로 1을 출력하지만 100의 배수일 경우 윤년이 아니라 0을 출력해야한다.
다만, 400의 배수일 경우는 윤년으로 본다.
기본 알고리즘은 먼저 4의 배수인지 여부를 본 뒤 4의 배수일 경우 400으로 나뉘어 떨어지는지, 100으로 나뉘어 떨어지는지 여부를 검사한다.
즉,
1-1 단계 : 4의 배수일 경우 - if ( year%4==0 )
2-1 단계 : 4의 배수이면서 400의 배수일 경우 - if ( year%400 == 0 )
2-2 단계 : 4의 배수이면서 100의 배수일 경우 - else if ( year%100 == 0 )
2-3 단계 : 2단계 조건식 나머지 - else
1-2 단계 : 1 단계 조건식 나머지 - else
이러한 구조로 본다.
- 풀이
- 방법 1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int y = in.nextInt();
in.close();
if(y%4==0) {
if(y%400==0) System.out.println("1");
else if(y%100==0) System.out.println("0");
else System.out.println("1");
}
else System.out.println("0");
}
}
가장 기초적인 방법이다.
위 코드를 변형하여 삼항연산자를 중첩하여 풀 수도 있다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int y = in.nextInt();
in.close();
System.out.print((y%4==0)?((y%400==0)?"1":(y%100==0)?"0":"1"):"0");
}
}
다만 개개인마다 읽기 힘들 수도 있으니 본인 선호에 따라 선택하면 된다.
- 방법 2
BufferedReader 을 쓰는 방식이다.
그리고 주의해야할 것이 반드시 자료형 타입을 잘 보아야 한다.
BufferedReader 은 문자열 형태로 저장된다. 즉 String 으로 저장된다는 것이다.
이를 정수로 쓰기 위해서는 Integer.parseInt()로 int 형으로 변환시켜준다.
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 y = Integer.parseInt(br.readLine());
if(y%4==0) {
if(y%400==0) System.out.println("1");
else if(y%100==0) System.out.println("0");
else System.out.println("1");
}
else System.out.println("0");
}
}
물론 위 코드도 삼항연산자를 통해 코드 길이를 간소화 시킬 수 있다.
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 y = Integer.parseInt(br.readLine());
System.out.print((y%4==0)?((y%400==0)?"1":(y%100==0)?"0":"1"):"0");
}
}
참고로 삼항연산자와 if-else 문 간의 성능차이는 거의 없다. (차이가 없다고 봐도 무방하다)
- 성능 차이
위에서 부터 순서대로
채점 번호 : 17662035 - BufferedReader 사용
채점 번호 : 17662017 - Scanner 사용
시간을 보면 BufferedReader 와 Scanner 의 성능차이가 확연하게 나는 것을 볼 수가 있다.
- 정리
앞선 포스팅과 문제 난이도가 거의 다를 것이 없어서 크게 언급할 일이 없었다.
다만 삼항연산자에 대해 계속 익숙해지고, 성능에서 보듯이 BufferedReader 의 성능이 매우 우수하기 때문에 이를 어느 상황에서도 사용할 수 있도록 연습해보면 좋겠다.
'JAVA - 백준 [BAEK JOON] > 조건문' 카테고리의 다른 글
[백준] 2525번 : 오븐 시계 - JAVA [자바] (18) | 2022.07.22 |
---|---|
[백준] 14681번 : 사분면 고르기 - JAVA [자바] (2) | 2020.03.17 |
[백준] 2884번 : 알람 시계 - JAVA [자바] (24) | 2020.02.14 |
[백준] 9498번 : 시험 성적 - JAVA [자바] (0) | 2020.02.13 |
[백준] 1330번 : 두 수 비교하기 - JAVA [자바] (2) | 2020.02.13 |