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%++j != 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==0) return 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
'프로그래머스 코딩(자바) > Level 0' 카테고리의 다른 글
Programmers Level 0 - 모스부호 (1) (0) | 2023.03.03 |
---|---|
Programmers Level 0 - 중복된 문자 제거 (0) | 2023.03.03 |
Programmers Level 0 - 문자열 정렬하기 (2) (0) | 2023.03.03 |
Programmers Level 0 - 숫자 찾기 (0) | 2023.03.03 |
Programmers Level 0 - 369 게임 (0) | 2023.03.03 |