오늘 하루도 기존에 풀었던 문제들을 복습했다.
복습을하면서 문제를 통째로 외운다는 느낌이
많이 들었는데 그래도 내가 코드를 알고있기때문에
이런 문제를 만나게 되어도 해결 할 수 있다는 생각은 들게 되었다.
다만 지금 내게 만족스럽지 못한점이 한가지가 계속 걸리는데
문제를 해결하는 순서를 제대로 정하지를 못하는것이 만족스럽지 못하다.
글로 쓰고있어도 글의 순서가 뒤죽박죽이되버린다.
머리가 복잡해지는것같고 생각이 잘 정리되지 않는다.
단순히 실력에대한 불만족이 계속 남아서 그런건지
아니면 내가 제대로 생각을 못하는건지 모르겠다.
어떻게 해야될지도 모르겠다.
계속 같은걸 들여다보고 있어야되는걸까?
어떤 문제의 레퍼런스를 보면 이해가 되는데
정작 그 문제를 백지에서 풀려고하면 막막해진다.
그나마 좀 나은건 그래도 수도코드로는 작성이 되는데
코드로 옮기는게 전혀 되지 않는다.
아직도 이런상태면 안된다는 생각이 된다.
알고리즘 문제들은 대부분이 난이도가 높은 문제라고 생각된다.
이런 문제들은 보통은 기업에 입사하기 전 코딩 테스트를 볼때
주로 풀게된다고 들었는데 그래서 그런지 정말 어렵게 나온다.
문제의 풀이법을 하나도 모르겠던 문제는 이 문제였다.
적어도 다른 문제들은 어디서부터 시작해야될지 감이 잡혔는데
이문제는 그러지 못해 레퍼런스를 먼저 보게되었다.
문제
수를 입력받아 제곱근 값을 소수점 두 자리까지 리턴해야 합니다.
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번째자리까지 리턴
}
실제로 이런 코드를 얼마나 사용할지는 모르겠지만
복잡한 과정을 해결할 수 있는 능력을 키우기 위함이라고 생각된다.