(JAVA)
0. 문제 및 입출력 예제
문제
약수의 개수가 세 개 이상인 수를 합성수라고 합니다.
자연수 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합니다.
1. 문제 분석
우선 합성수에 대해서 알아보았다. 수학과 너무 멀어져있는 나이기에....
합성수는 1과 자기 자신뿐 아니라 다른 수를 약수로 갖는 수를 말한다고 한다.
소수는 약수의 개수가 2개인 수이지만 합성수는 약수의 개수가 3개 이상인 수라고 할 수 있다.
문제를 보면서 느낀것은 소수가 아니면 합성수인 것 같다. 소수를 빼는 방법도 괜찮을 것 같다고 생각이 든다.
첫번째 입출력 예시를 보면 10 이하의 합성수는 4, 6, 8, 9, 10 으로 5개라고 나와있는데 그렇다면 1, 2, 3, 5, 7 은 소수에 해당한다.
두번째 입출력 예시를 보면 15 이하의 합성수는 4, 6, 8, 9, 10, 12, 14, 15 로 8개, 1, 2, 3, 5, 7, 11, 13 소수는 7개이다.
그러면 소수를 구하는 방법부터 생각해봐야겠다.
소수는 1과 자기자신만 약수로 가질 수 있기 때문에, 그 외의 경우를 어떻게 계산할 수 있을까? 나머지가 나오게되면 그 수는 약수가 될 수 없다. 몫과 나머지 0으로 구성이 되어야 약수라고 할 수 있기 때문이다.
그러면 2 또는 3을 이용하여 숫자를 나누다보면 각자의 약수들이 나올 것이다. 그럼 맨 처음 2, 3 을 제외한 나머지 숫자들은 2, 3으로 나누었을 때 나머지가 생긴다면 소수에 해당한다.
2. 방법
문제 분석을 하면서 내가 생각한대로 코드를 써내려갔는데 쉽게 통과는 되었지만... 조금 더 다듬어보려고 한다.
class Solution {
public int solution(int n) {
int answer = 0;
for (int i = 0; i<n; i++){
if(i%2 == 0){
if(i == 2){
answer -= 1;
}
answer += 1;
}
else if (i%3 == 0){
if(i == 3){
answer -= 1;
}
answer += 1;
}
}
return answer;
}
}
코드가 매우 지저분하고 조건문의 depth가 깊어서 조금 수정해보려고 한다.
뭐 사실... 테스트 케이스도 모두 통과 하지 못했다... ㅎ
왜인지 생각해보면 내가 너무 입출력 예에 해당하는 코드를 구성한것 같았다. 다시 해봐야겠다...
천천히 생각해보면 2로 나뉘어질 경우와 3으로 나뉘어질 경우와 2,3 으로 나눠지지 않는 경우가 있다.
그럼 내가 지금 놓친 것은 2, 3 으로 나눠지지 않는 경우이다.
그럼 이럴 경우만 제외를 하는 방법은?
3. 느낀점
갑자기 숫자 계산들을 하려다보니 조건들이랑 숫자 계산에 집중하여 중요한 것들을 놓친 것 같다.
이제 차근차근 순서를 생각하면서 풀어보면서 감을 익혀야 할 것 같다.
'알고리즘 > 프로그래머스:LV00' 카테고리의 다른 글
[LV00] 모음 제거 (1) | 2023.11.02 |
---|---|
[LV00] 팩토리얼 (1) | 2023.11.01 |
[LV00] 점의 위치 구하기 (0) | 2023.06.19 |
[LV00] 배열 회전시키기 (0) | 2023.06.19 |
[LV00] 공 던지기 (1) | 2023.06.19 |