문제 설명
약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ n ≤ 100
입출력 예
n result
10 5
15 8
import java.util.ArrayList;
class Solution {
public int solution(int n) {
int answer = 0;
// 합성수를 어떻게 찾나?
// n 이하의 수를 순회해 보자.
for(int i=2; i<=n; i++) {
ArrayList<Integer> arrList = new ArrayList<Integer>();
// 약수를 찾아 보자.
for(int j=1; j<=i; j++) {
if (i % j == 0) {
arrList.add(j);
if (arrList.size() >= 3) {
answer+=1;
break;
}
}
}
}
return answer;
}
}
아, 진짜 웃긴다.
처음에
import java.util.ArrayList;
class Solution {
public int solution(int n) {
int answer = 0;
ArrayList<Integer> arrList = new ArrayList<Integer>();
// 합성수를 어떻게 찾나?
// n 이하의 수를 순회해 보자.
for(int i=2; i<=n; i++) {
// 약수를 찾아 보자.
for(int j=1; j<=i; j++) {
if (i % j == 0 && arrList.size() < 3) {
arrList.add(j);
} else if(arrList.size() >= 3) {
answer+=1;
arrList.clear();
break;
}
}
}
return answer;
}
}
이렇게 짰었다.
그런데 테스트 실패 케이스가 계속 나오는 것이었다.
무엇이 문젤까?
나는 알 수가 없어서 다른 사람한테 물어보니
'약수가 2개인 수는 필터링 안 되지 않니?'라고 해서 보니...
그랬던 것이었다.
그래서 맨 위의 코드로 수정하고 패스~
다른 사람의 코드를 보니
이번에도 역시 희표좌...
import java.util.stream.IntStream;
class Solution {
public int solution(int n) {
return (int) IntStream.rangeClosed(1, n).filter(i -> (int) IntStream.rangeClosed(1, i).filter(i2 -> i % i2 == 0).count() > 2).count();
}
}
깨끗하다.
나도 생각은 이렇게 했는데(생각한 로직이 위와 같은 거 같은데)
시작을 2부터 해서...
(시작을 2부터 한 것도 말이 안 된다. 하려면 1부터 하든가 4부터 해야지 왜 2부터 했을까. 나도 알 수 없다...)
'코딩테스트 연습' 카테고리의 다른 글
세로 읽기 (0) | 2024.04.18 |
---|---|
369게임 (0) | 2024.04.18 |
피자 나눠 먹기 (2) (0) | 2024.04.18 |
문자열 정렬하기 (2) (0) | 2024.04.18 |
숫자 찾기 (0) | 2024.04.18 |