TIL 220120

김상한·2022년 1월 21일
0

Today I Learned

목록 보기
3/9

반복문

코플릿 반복문을 풀면서 기존에 내가 알고 있던 개념들을 다시 점검할 수 있었다.
그 중에서 수학적으로 기존에 놓쳤던 개념이 문제풀이에 적용된 사례가 있어서 내가 처음 푼 코드와 레퍼런스 코드를 비교해서 정리하고자 한다.

첫번째 문제는 임의의 num 숫자가 소수인지 여부를 리턴하는 문제였다.
문제를 풀기 위해 수도코드를 먼저 작성하였다.

// 소수는 1과 자기 자신만을 약수로 가지는 수이다.
// 따라서 num을 1~num까지의 숫자로 나누었을 때 1과 num을 제외한
// 다른 숫자로 나누어 떨어진다면 소수가 아니다.
// 나누어 떨어지는 숫자의 개수를 count로 선언하고 0을 할당한다.
// num이 i로 나누어 떨어진다면 count에 1을 더해준다
// count가 2이면 true를 리턴하고 아니라면 false를 리턴한다.

수도코드를 실제 코드로 옮기면

let count = 0;
for (let i=0; i <= num; i++) {
if (num % i === 0) {
count += 1
}
}
if (count === 2) {
return true
} else {
return false
}

다음과 같이 쓸 수 있다. 테스트를 실행해보니 코드가 목적에 맞게 잘 실행되는 것을 확인하였다.

레퍼런스 코드를 확인해보니

let sqrt = parseInt(Math.sqrt(num));
if (num === 1) {
return false;
}
if (num === 2) {
return true;
}
if (num % 2 === 0) {
return false;
}
for (let i = 3; i <= sqrt; i += 2) {
if (num % i === 0) {
return false;
}
}
return true;

다음과 같이 적혀 있었는데 왜 제곱근의 정수부분을 활용하는지 이해가 되지 않았다. 그래서 검색을 해본 결과 소수 판별의 기준으로 제곱근이 활용된다는 개념이 기존에 존재했다는 것을 알게 되었다.

소수인지 판별 할 자연수의 제곱근을 기준으로 그 숫자의 약수들의 곱셈은 대칭적으로 곱셈이 일어나게 됩니다. 따라서 소수인지 판별할때는 그 자연수의 제곱근 이하의 수까지만 검사를 하면 됩니다. 검사할 데이터를 제곱근 개 이하로 줄일 수 있습니다.

수학적으로 알지 못했던 개념을 알게 되어서 다음 번에 같은 문제를 만나면 두 개의 풀이로 활용할 수 있을 것이다.
코드의 길이는 내가 푼 풀이가 더 짧지만 for문이 작동하는 횟수는 레퍼런스 코드가 적기 때문에 두 가지의 풀이를 정리해두면 추후에 원하는 방향에 따라 두 가지를 적용할 수 있겠다는 생각을 했다.

profile
성장하는 사람

0개의 댓글