공부기록/자바스크립트 코딩테스트

if문 중첩에 관한 고찰

_우지 2022. 7. 6. 10:11

2022.07.06 - [공부기록/자바스크립트 코딩테스트] - [백준/JS] 2753 윤년

 

[백준/JS] 2753 윤년

문제링크 2753번: 윤년 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 20

ehddud100677.tistory.com

 

윤년 문제를 풀다가 if 문이 중첩되는 형태에 대해 고민해봤다.

if 문이 중첩이 되는 저러한 형태가 보기 좋지않다고 생각이 되었기 때문이다.

if (input % 4 === 0) {
  if (input % 100 === 0) {
    if (input % 400 === 0) {
      console.log(1);
    } else {
      console.log(0);
    }
  } else {
    console.log(1);
  }
} else {
  console.log(0);
}

 

IF 문 중첩 줄이기

그래서 해당 유튜브 영상을 보고 if 문의 중첩을 줄여보기로 했다.

  1. if 문 다음에 나오는 공통된 절차를 각 분기점 내부에 넣는다.
  2. 분기점에서 짧은 절차부터 실행하게 if 문을 작성한다.
  3. 짧은 절차가 끝나면 return(함수 내부의 경우)이나 break(for문 내부의 경우)로 중단한다.
  4. else를 제거한다(이때 중첩하나가 제거된다.)
  5. 위 절차를 반복한다.

줄인 코드는 다음과 같다.

const check = (input) => {
  if (input % 4 !== 0) {
    return 0;
  }
  if (input % 100 !== 0) {
    return 1;
  }
  if (input % 400 !== 0) {
    return 0;
  }
  return 1;
};

console.log(check(input));

위 처럼 줄일 수 있으나 뭔가 부족해보인다.

 

short-circuit evaluation

A || B에서 A가 참이면 B를 실행하지 않고 곧바로 참이 되고, A && B에서 A가 거짓이면 B를 실행하지 않고 곧바로 거짓이 되는 로직이다.

다음처럼 로직을 짤 수 있지만, 나는 이런코드 너무 길어서 읽기가 힘들다.

if (input % 4 === 0 && (input % 100 !== 0 || input % 400 === 0)) console.log(1);
else console.log(0);

 

이런 고민을 통해서 short-curcuit evaluation이라는 용어에 대해 한번더 정리하게 되었고, 어떤게 더 좋은 코드일까에 대한 고민은 앞으로도 계속해봐야겠다. 나는 개인적으로는 1번 방식이 내가 읽기에는 더 쉬우나 협업을 할때 short-curcuit evaluation 으로 짜야한다면 그렇게 로직을 짜도록 연습을 해야할 것이다.