TIL Day-28

백광호·2021년 1월 3일
0

TIL

목록 보기
28/55

코드스테이츠 28일차

오늘 하루도 기존에 풀었던 문제들을 복습했다.
복습을하면서 문제를 통째로 외운다는 느낌이
많이 들었는데 그래도 내가 코드를 알고있기때문에
이런 문제를 만나게 되어도 해결 할 수 있다는 생각은 들게 되었다.

다만 지금 내게 만족스럽지 못한점이 한가지가 계속 걸리는데
문제를 해결하는 순서를 제대로 정하지를 못하는것이 만족스럽지 못하다.
글로 쓰고있어도 글의 순서가 뒤죽박죽이되버린다.

머리가 복잡해지는것같고 생각이 잘 정리되지 않는다.
단순히 실력에대한 불만족이 계속 남아서 그런건지
아니면 내가 제대로 생각을 못하는건지 모르겠다.

어떻게 해야될지도 모르겠다.
계속 같은걸 들여다보고 있어야되는걸까?

어떤 문제의 레퍼런스를 보면 이해가 되는데
정작 그 문제를 백지에서 풀려고하면 막막해진다.
그나마 좀 나은건 그래도 수도코드로는 작성이 되는데
코드로 옮기는게 전혀 되지 않는다.

아직도 이런상태면 안된다는 생각이 된다.

새로 배운 것들

알고리즘 문제

알고리즘 문제들은 대부분이 난이도가 높은 문제라고 생각된다.
이런 문제들은 보통은 기업에 입사하기 전 코딩 테스트를 볼때
주로 풀게된다고 들었는데 그래서 그런지 정말 어렵게 나온다.

문제의 풀이법을 하나도 모르겠던 문제는 이 문제였다.
적어도 다른 문제들은 어디서부터 시작해야될지 감이 잡혔는데
이문제는 그러지 못해 레퍼런스를 먼저 보게되었다.

문제

수를 입력받아 제곱근 값을 소수점 두 자리까지 리턴해야 합니다.
Math.sqrt 사용은 금지됩니다.

메소드를 사용하면 간단하지만 문제는 사용이 금지된 점이다.
이 문제의 레퍼런스는 이렇다

function computeSquareRoot(num) {
  const diffs = [1, 0.1, 0.01, 0.001];
  let base = 1;
  for (let i = 0; i < diffs.length; i++) {
    while (base * base < num) {
      base = base + diffs[i];
    }

    if (base * base === num) {
      return base;
    } else {
      base = base - diffs[i];
    }
  }
  return Number(base.toFixed(2));
}

수학적 배경지식이 있어야되는 것처럼 보이고
아직도 이게 어떻게 이렇게 풀리는지 모르겠다.

어느정도 생각해본 내 개인적인 해석은 이렇다.

function computeSquareRoot(num) {
  const diffs = [1, 0.1, 0.01, 0.001];
  // 근사값을 구하는 방식
  let base = 1;
  // 초기값은 1로 설정
  for (let i = 0; i < diffs.length; i++) {
    // 근사값의 배열을 순회하며
    while (base * base < num) {
      // 초기값의 제곱이 입력받은 수보다 낮은 경우
      base = base + diffs[i];
      // 초기값은 근사값의 i번째 요소와 더한다
    }

    if (base * base === num) {
      // 초기값의 제곱이 입력받은 수와 같다면
      return base;
      // 초기값을 그대로 출력
    } else {
      base = base - diffs[i];
      // 아닐 경우 초기값에서 근사값의 i번째 요소만큼 뺀다
    }
  }
  return Number(base.toFixed(2));
  // 최종적으로 나오는 수의 소수점 2번째자리까지 리턴
}

실제로 이런 코드를 얼마나 사용할지는 모르겠지만
복잡한 과정을 해결할 수 있는 능력을 키우기 위함이라고 생각된다.

profile
안녕하세요

0개의 댓글

관련 채용 정보