코딩 테스트

[코딩테스트] 백준 2753번: 윤년

dev.jelee 2025. 5. 9. 14:37

# 문제

  • 주소: https://www.acmicpc.net/problem/2753
  • 주어진 연도가 윤년이면 1, 아니면 0을 출력하기.
  • 윤년은 4의 배수이면서, 100의 배수가 아닐 때, 또는 400의 배수일 때.

 

# 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int year = Integer.parseInt(br.readLine());

    int a = year % 4;
    int b = year % 100;
    int c = year % 400;

    if (a == 0) {
      // 100의 배수가 아니라서 윤년, 400의 배수라서 윤년.
      // b != 0 이면 윤년.
      // b == 0 이면 윤년 아님
      // c == 0 윤년
      if (b != 0 || c == 0) {
        System.out.println("1");
      } else {
        System.out.println("0");
      }
    } else {
      System.out.println("0");
    }
  }
}

 

# 입/출력 결과

 

# 과정

  • 입력은 BufferedReader + InputStreamReader로 받고, 입력 값은 ing타입의 year에 저장했다.
  • 그리고 각 int타입의 a, b, c 변수에 year을 기준으로 %4, %100, %400 의 결과를 저장했다.
  • if문을 사용하는데, 한번에 조건문에 작성한게 아니라 중첩 조건문으로 구현했다.
    • a가 0이면 윤년이기 때문에 1의 값을 출력, 아니면 0의 값을 출력.
    • a가 0 이면 윤년이지만, 만약에 b가 0이 아니거나 c가 0이면 윤년이기 때문에 1의 값을 출력, 아니면 0의 값 출력.

 

# 느낀 점

  • 크게 어려운 점은 없었는데, 문제에서 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때 윤년이라는 말에 순간 적으로 이해가 안되어서 멍했다.
  • 4의 배수면 'year % 4 == 0' 이고, 100의 배수가 아니라면 'year % 10 != 0' 이 것을 의미하는 것일거고, 400의 배수일 때에는 'year % 400 == 0'을 말하는 거 같은데, 이고, 아니면서 이고. 이렇게 되니까 문제를 이해하는데 순간 멈칫했었다.
  • 그래서 처음에 4의 배수를 기준으로 4의 배수이면 1, 아니라면 0 이렇게 조건문을 작성한 다음에, 4의 배수라면 이 안에서 중첩 조건문을 작성했다.
  • 4의 배수라서 윤년이지만, 100의 배수이면 윤년이 아님, 100의 배수가 아니면 윤년. 100의 배수더라도 400의 배수이면 윤년.
  • 그래서 100의 배수가 아니거나 400의 배수면 윤년이라는 조건식으로 작성했다.
  • 더 짧게 한다면 (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) 이렇게 작성해도 될거 같다.
  • 왜냫면 문제에서 4의 배수이지만, 100의 배수가 아니면 윤년. 그리고 100의 배수더라도 400의 배수면 윤년이기 때문에 문제 그대로 쭉 나열하면 이렇게 된다.