자료구조 & 알고리즘/코딩테스트

[JS 코딩테스트] 코테 입문 수학 <합성수 찾기> , <팩토리얼> 풀기

칠구의 스터디 2024. 3. 15. 13:37

문제 출처

https://school.programmers.co.kr/learn/challenges/beginner?order=acceptance_desc

<합성수 찾기>
[문제 설명]
약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.

[제한사항]
1 ≤ n ≤ 100

[입출력 예]
 n      result
10       5
15       8

 

처음에 내가 푼 정답
function solution(n) {
    let answer = 0;
      for(let i = 4; i<=n; i++){
         if(i % 2 === 0 || i % 3 === 0){
             answer ++ ;   
         }
      }
    return answer; 
}

합성수 즉 소수가 아닌 수를 찾는 문제이기 때문에

단순히 2나 3으로 나누어 떨어지면 모두 소수가 아니라고 생각했다

그래서  for 문도 2와 3을 제외하기 위해 i를 4부터 시작했다 

하지만 내 정답은 틀렸다...ㅜㅜ

알고 보니 25나 49같이 2와 3으로 나누어 떨어지지 않지만 소수가 아닌 합성수인 경우가 있었다 🫢🫢

 

다시 푼 정답
function solution(n) {
    let answer = 0
    for(i=1; i<=n; i++) {
        let cnt = 0
        for(j=1; j<=i ; j++) {
            if(i%j == 0) {
                cnt += 1
            }
        }
        if(cnt > 2) {
            answer += 1
        }
    }
    return answer
}

원래는 위의 코드에 25나 49인 케이스만 추가할까도 했는데 내가 생각하지 못한 수가 또 있을까봐

카운트를 세는 변수 cnt를 만들어서 i를 j로 나누었을 때 나누어 떨어지는 경우가 2보다 클 때 값을 출력하도록 하였다.

 

느낀점

이 문제를 풀고 다른 사람이 푼 풀이를 봤는데 제곱근을 반환하는 함수인 Math.sqrt()가 있다는 것을 첨 알게 되었다...!!

또한 문제를 한번에 풀 수 있을 줄 알았는데 한번에 풀지 못했다는 게 아쉬웠다 ㅠㅠ

 


<팩토리얼>
[문제 설명]
i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.
i! ≤ n


[제한사항]
0 < n ≤ 3,628,800

[입출력 예]
 n             result
3628800    10
 7                3
정답
function solution(n) {
    let fac = 1;
    let i = 1;
    
    while (fac <= n) {
        fac *= i;
        i++;
    }
    
    return i - 2;
}

이 문제는 n에 가장 가까운 수 i를 출력하는 문제이기 때문에 while 문을 사용해서

가장 가까운 수를 출력하고자 하였다.

이렇게 끝난 줄 알았는데 자꾸 틀리는 것이었다 콘솔로 출력해서 수 보니....

2
3
4
5

n이 7일 때 원하는 값은 3인데 i가 초과한다는 것을 알게 되었다

그래서 마지막에 -2를 해서 문제를 풀 수 있었다.