Lv 0. 합성수 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/120846

 

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    for(int i=1; i<=n; i++){
        int cnt=0;
        for(int j=1; j<=n; j++){
            if(i%j==0) cnt++;
        }
        if(cnt>=3) answer++;
    }
    return answer;
}

위가 내가 작성한 풀이이고, 

이 문제를 풀고 나서 다른 사람의 풀이를 보니까, 합성수가 가지는 특성상, 1, 2, 3 은 절대 합성수가 될 수 없기 때문에, 판별할때 그 수들에 대해서는 위와 같은 for문을 돌릴 필요가 없다는걸 알 수 있었다. 그와 같은 해당 풀이를 첨부해 보자면, 

#include <string>
#include <vector>

using namespace std;
bool isComposite(int n)
{
    int cnt = 0;
    for(int i = 1; i<=n; i++){
        if(n % i == 0) 
            cnt++;
        if(cnt >= 3)
            return true;
    }
    return false;
}

int solution(int n) {
    int answer = 0;
    for(int i = 4; i<=n; i++){
        if(isComposite(i))
            answer++;
    }
    return answer;
}

이와 같았다. solution 함수에서 int i=4 부터로 시작되는 것을 통해 알 수 있다. 

물론 연산 차이에서는 아주 큰 차이가 발생하는 것은 아니지만, (1과 2와 3 의 딱 세가지 경우만 내 코드에서는 추가적으로 체크해볼테니) 그래도 이와 같이 경우를 확실하게 구분하고 불필요한 것은 코드에서 첨부하지 않도록 하는 설계를 하도록 하자. 

 

  Comments,     Trackbacks