TIL_2023_10_17

이종현·2023년 10월 17일
0

Today_I_Learned

목록 보기
106/145
post-thumbnail

Today 요약

  1. 코테 문제 풀기
  2. 강의 듣기

1. What I did?

1.1 코테 문제 풀기

오늘은 팩토리얼 문제였다. 그냥 단순하게 팩토리얼을 구현하는 게 문제가 아니라 어떤 숫자가 주어졌을 때 그게 팩토리얼 n과 팩토리얼 n +1 사이에 있을 때 n의 숫자를 구하는 문제다.

처음에는 단순하게 접근해야 하기 때문에 일단 최대 숫자가 3628800이라 최대 팩토리얼 11을 넘어갈 일이 없기에 1부터 10까지 모든 팩토리얼을 체크해서 n의 값을 구하는 방식을 선택했다. 일단은 if문으로 시도..

function solution(n) {
  let answer = 0

  if (n <= 1) {
    answer = 1
  } else if (n < 6) {
    answer = 2
  } else if (n < 24) {
    answer = 3
  } else if (n < 120) {
    answer = 4
  } else if (n < 720) {
    answer = 5
  } else if (n < 5040) {
    answer = 6
  } else if (n < 40320) {
    answer = 7
  } else if (n < 362880) {
    answer = 8
  } else if (n < 3628800) {
    answer = 9
  } else if (n === 3628800) {
    answer = 10
  }

  return answer
}

그 다음에는 이 부분을 삼항 연산자로 바꿔서 시도해봤다..

function solution(n) {
  function fac(m) {
    if (m <= 1) {
      return 1
    } else {
      return m * fac(m - 1)
    }
  }

  return n < fac(2)
    ? 1
    : n < fac(3)
    ? 2
    : n < fac(4)
    ? 3
    : n < fac(5)
    ? 4
    : n < fac(6)
    ? 5
    : n < fac(7)
    ? 6
    : n < fac(8)
    ? 7
    : n < fac(9)
    ? 8
    : n < fac(10)
    ? 9
    : n === fac(10)
    ? 10
    : 10
}

하지만 이 또한 복잡하다. 여기서 삼항 연산자를 어떻게 for문으로 반복적으로 만들 수 있을 것 같았는데, 결국 생각해내지는 못했다. 이 문제에만 1시간 가량을 투자했기에 일단은 삼항 연산자로 진행한 코드를 제출하고 다른 사람들의 풀이도 확인해봤다.

내가 생각했다가 해결하지못한 팩토리얼 함수를 for문으로 해결한 코드가 있었다.

function solution(n) {
  function factorial(n) {
    if (n <= 1) {
      return 1
    } else {
      return n * factorial(n - 1)
    }
  }

  for (let i = 1; i < 12; i++) {
    if (factorial(i) > n) {
      return i - 1
    }
  }
}

정말 한 끝 차이 인 것 같다. 이 정도만으로도 코드가 한결 깔끔해졌다. 그리고 아직까지도 제대로 이해하지 못한 코드가 있는데, 이 문제를 한 줄로 처리한 코드가 있다.

function solution(n) {
  for (let i = 1, v = 1; true; v *= ++i) if (v > n) return --i
}

위의 코드를 내가 이해한 부분까지 이야기 하자면, for문 안에 있는 로직을 이용해서 팩토리얼을 간단하게 구현한 것 같다. 그리고 v > n의 조건을 만족하면 i에 감소연산자를 사용해서 원하는 값을 출력하도록 하는 것 같다.

정말 신박하다.. 나도 열심히 해서 저렇게 깔끔한 코드를 작성할 수 있도록 노력할 것이다. 매일 한 문제 이상은 꼭 코테 문제를 푸는 습관을 들여보자.

2. What I Learned?

2.1 강의 듣기

강의를 듣는 건 일단 미리보기 같은 느낌으로 엄청 빨리 들어봤다. 사실 내가 알고 있는 내용이 많아서 빨리 들었던 것도 있다. 그리고 이제 내가 부족한 것들을 하나씩 추가적으로 더 공부해야 한다. 특별히 부족한 부분은 useMemo, useCallback 처럼 최적화하는 부분이나 로딩 구현, 에러 처리, 그리고 새로 알게 된 portal 이나 ref를 전달하는 부분 등이다. 커스텀 훅은 직접 구현해 본 적은 있지만, 자주 하지 않았기 때문에 그것도 자주 시도해 봐야 할 것 같다. 아무튼 useEffect 빼고는 거의 대부분 다시 보면서 정리해봐야 할 것 같기 때문에 이번주도 전체적으로 다시 강의를 들어보면서 공부할 생각이다.


profile
데이터리터러시를 중요하게 생각하는 프론트엔드 개발자

0개의 댓글