Link
문제
연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다. 1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다.
입력 > 첫째 줄에 연도가 주어진다. 연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.
출력 > 첫째 줄에 윤년이면 1, 아니면 0을 출력한다.
제출
const fs = require("fs");
const input =
process.platform === "linux"
? fs.readFileSync("/dev/stdin").toString()
: `1999`;
const year = input;
if (year % 4 === 0 && (year % 100 != 0) || (year % 400 === 0)) {
console.log("1");
} else {
console.log("0");
}
개념
'===' vs '=='
- '==' : equality operator
- 값을 비교하기 전에 비교 하는 값을 동일한 데이터 유형으로 변환한다.
- '===' : strict equality operator
- 데이터 유형의 변환 없이 바로 값을 비교한다.
console.log(5 == "5") // true
console.log(5 === "5") // false
'&&' vs '&' / '||' vs '|'
- '&(Bitwise AND)'와 '|(Bitwise OR)'는 비트 연산자
- '&&(Logical AND)' 와 '||(Logical OR)'는 논리 연산자
- 비트 연산자와 논리 연산자 둘다 같은 결과를 낸다.
&와 &&는 모든 조건이 true일 때 true이고, |와 ||는 하나의 조건만 true여도 true이다.
그렇다면 차이점은 무엇일까?
- 앞의 조건을 검사 한 후, 뒤에 조건을 보지 않아도 이미 결과가 나왔을 때 뒤에 조건을 검사하냐, 건너뛰냐의 차이이다.
let A = 1;
let B = 2;
if (A === 2 && B++ === 1) {
// 앞의 조건이 false 이므로 결과는 false
}
console.log(`&&일 때 A=${A}, B=${B}`);
if ((A === 2) & (B++ === 1)) {
// 앞의 조건이 false 이므로 결과는 false
}
console.log(`&일때 A=${A}, B=${B}`);
if (A === 1 || B-- === 1) {
// 앞의 조건이 true 이므로 결과는 true
}
console.log(`||일때 A=${A}, B=${B}`);
if ((A === 1) | (B-- === 1)) {
// 앞의 조건이 true 이므로 결과는 true
}
console.log(`||일때 A=${A}, B=${B}`);
- 비트 연산자(&, |)를 사용할 때만 B의 값이 증감되는 것을 확인할 수 있다.
- 여기서 또 신기한 점은 비트 연산자가 뒤에 조건을 건너뛰지 않아서인지 vscode에서 prettier를 사용 중일 때
비트 연산자에만 괄호를 해준다는 점이다.
Comment
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 2884: 알람 시계 (javascript) (0) | 2022.04.21 |
---|---|
[백준] 14681: 사분면 고르기 (javascript) (0) | 2022.03.09 |
[백준] 9498: 시험 성적 (javascript) (0) | 2022.02.23 |
[백준] 1330: 두 수 비교하기 (javascript) (0) | 2022.02.23 |
[백준] 2588: 곱셈 (javascript) (0) | 2022.02.08 |