[백준] 2753번 : 윤년 - [C++]
https://www.acmicpc.net/problem/2753
-
문제
- 알고리즘 [접근 방법]
조건을 보면 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
이러한 구조로 본다.
- 2가지 입력방법을 이용하여 풀이한다.
if-else문을 활용한 방법과 해당 로직을 삼항연산자를 활용하여 출력하는 방법을 보고자 한다.
즉, 다음과 같이 두 가지 방식으로 나누어 풀이하겠다.
1. 조건문 if-else
2. 삼항연산자.
참고로 삼항연산자 사용 방법은 아래 글을 참고하시길 바란다.
- 풀이
- 방법 1 : [조건문]
#include <iostream>
using namespace std;
int main(int argc, char const *argv[]) {
int y;
cin >> y;
if (y % 4 == 0) {
if (y % 400 == 0) { // 4의 배수이면서 400의 배수일 때(=윤년)
cout << 1;
}
else if (y % 100 != 0) { // 4의 배수이면서 100의 배수가 아닐 때(=윤년)
cout << 1;
}
else {
cout << 0;
}
} else {
cout << 0;
}
return 0;
}
가장 기초적인 방법이다.
- 방법 2 ; [삼항연산자]
삼항연산자를 쓰는 방식이다.
방법 1의 코드의 조건문 순서를 그대로 갖고와 삼항연산자 식으로 변형하면 된다. 다만, 가독성은 떨어지기 때문에 사실 이정도로 길게 쓸 필요성도 떨어지고 별로 추천하진 않는다..
#include <iostream>
using namespace std;
int main(int argc, char const *argv[]) {
int y;
cin >> y;
cout << ((y % 4 == 0) ? ((y % 400 == 0) ? 1 : (y % 100 != 0) ? 1 : 0) : 0);
return 0;
}
- 성능
위에서 부터 순서대로
채점 번호 : 27125014 - 방법 2 : 삼항연산자
채점 번호 : 27125007 - 방법 1 : 조건문
성능상으로도 차이를 볼 수 없다.
- 정리
앞선 포스팅과 문제 난이도가 거의 다를 것이 없어서 크게 언급할 일이 없었다.
다만 삼항연산자에 대해 계속 익숙해질 수 있도록 삼항연산자를 통한 풀이방법도 같이 올려놓았다
혹여 풀이에서 이해가 가지 않거나, 어려운점이 있다면 언제든 댓글 남겨주시면 최대한 빠르게 답변드리도록 하겠다.
'C++ - 백준 [BAEK JOON] > 조건문' 카테고리의 다른 글
[백준] 2525번 : 오븐 시계 - [C++] (0) | 2022.07.24 |
---|---|
[백준] 2844번 : 알람 시계 - [C++] (2) | 2021.03.15 |
[백준] 1468번 : 사분면 고르기 - [C++] (0) | 2021.03.11 |
[백준] 9498번 : 시험 성적 - [C++] (6) | 2021.03.02 |
[백준] 1330번 : 두 수 비교하기 - [C++] (0) | 2021.02.28 |