code/[프로그래머스] python

[코딩 테스트 연습 입문] 합성수 찾기

오리는짹짹 2022. 12. 26. 12:00

문제

약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.

 

❗제한사항

  • 1 ≤ n ≤ 100

 

입출력 예

 

입출력 예 설명

입출력 예 #1

  • 10 이하 합성수는 4, 6, 8, 9, 10 로 5개입니다. 따라서 5를 return합니다.

입출력 예 #1

  • 15 이하 합성수는 4, 6, 8, 9, 10, 12, 14, 15 로 8개입니다. 따라서 8을 return합니다.

 

✔풀이

def solution(n):
    answer = 0
    for i in range(n,0,-1):
        count=0
        for k in range(i-1,1,-1):
            if i%k==0:
                count=1
        answer+=count
    return answer

📝설명

이중 for문으로 문제를 해결했다.

n이하의 합성수의 개수를 return해야 하기 때문에, 첫번째 for문에서는 n부터 1씩 줄어들게 할거고, 두번째 for문에서는 합성수를 찾아 개수를 카운팅할거다.

첫번째 for문에서 우선 count=0으로 초기화한다. 그 이유는 바로 두번째 for문에서 알 수 있다.

우선, 두번째 for문에서는 합성수를 찾아야 한다.

합성수는 약수의 개수가 3개 이상인 수이다.

자연수는 기본적으로 자기자신과 1을 약수로 갖기 떄문에,  해당 for문에서는 2~n-2의 자연수 중 약수를 더 갖는가만 확인하면 된다.

만약 또다른 약수가 있다면, 해당 수는 합성수이기 때문에 count=1로 정의한다.

그렇게되면 두번째 for문이 실행되는 동안 또다른 약수가 발견되더라도 count=1로 계속 유지된다.

이렇게 나온 count를 answer에 더하면, answer에 1이 더해진다.

두번째 for문의 실행이 종료되면 첫번째 for문이 반복범위 안에서 다음 반복으로 넘어간다.

이때 count가 두번째 for문을 통해서 1로 정의되어 있기 때문에 0으로 다시 정의해야 한다.

개선한다면?

 

👑모범 답안

 

👀느낀 점

: 모범 답안과 비슷하게 코드를 짰다 뿌-듯

내가 생각해야 할 점은 if에서도 break를 사용할 수 있다는 거!!