본문 바로가기

프로그래머스 코딩(자바)/Level 0

Programmers Level 0 - 합성수 찾기

728x90

문제 설명

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

 
제한사항
  • 1 ≤ n ≤ 100

입출력 예
n result
10 5
15 8

입출력 예 설명

입출력 예 #1

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

입출력 예 #1

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
    public int solution(int n) {
        int answer = 0;
        // 1, 2, 3은 합성수가 아니다.
        for(int i=4;i<=n;i++) { 
            // i가 합성수이면 개수 증가!!!
            int j = 1;
            // 1씩 증가하면서 나누어 떨어질때까지
            while(i%++!= 0); 
            // 나누어졌을때 나누는 수가 자기 자신이면 소수 아니면 합성수!!!
            if(i!=j) { 
                answer++;
            }
        }
        return answer;
    }
}
 

 

  4부터 n까지 반복한다.
  나누어 떨어질떄까지 i값을 증가시켜 반복한다.
  나누어 떨어졌을떄 나누는 값이 자기 자신이면 소수이다.
  자기 자신이 아니면 합성수이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
    public int solution(int n) {
        int answer = 0;
        for(int i=2;i<=n;i++) { // 1, 2, 3은 합성수가 아니다.
            if(!isPrime(i)) { 
                answer++;
            }
        }
        return answer;
    }
    public boolean isPrime(int num) {
          for(int i=2; i<=num/2; i++) {
              if(num%i==0return false;
          }
          return true;
    }
}
 

 

  소수를 판단하는 isPrime()메서드를 만들고
  소수가 아니면 개수를 증가 시킨다.

 

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.stream.IntStream;
class Solution {
        public int solution(int n) {
            return (int) IntStream.rangeClosed(1, n)
              .filter(
                      v ->(int) IntStream
                      .rangeClosed(1, v)
                      .filter(i -> v % i == 0)
                      .count() > 2
              ).count();
        }
}
 

 

  IntStream을 이용하여 해결하였다.
  
  1 ~ v까지 약수들의 개수를 구하고
  (int) IntStream
               .rangeClosed(1, v)
               .filter(i -> v % i == 0)
               .count() 

그 중에서 약수의 개수가  2개보다 큰경우가 합성수 이므로 

다시한번 filter()를 이용해서 걸러서 

개수를 구한다.

  (int) IntStream.rangeClosed(1, n)
              .filter(
                      v ->(int) IntStream
                      .rangeClosed(1, v)
                      .filter(i -> v % i == 0)
                      .count() > 2
              ).count()

 

 

728x90