멋사/TIL

230503 3주 3일차 TIL. Codeup 1274, 프로그래머스 소인수분해

yeooniyeoon 2023. 5. 3. 19:13
728x90
SMALL

소수 구하기에서 

소수란 1과 자기 자신만을 약수로 갖는 수를 말한다.

 

처음 코드를 작성할 땐 for문으로 2부터 n-1 까지 나누어 떨어지는 수가 없으면 소수로 판별하도록 작성했는데

for문의 조건값을 루트 n으로 줘도 된다는 사실을 배웠다.

 

사실 예전에도 한번 봐서 알고 있었는데 그때보고 쓸일이 없어서 까먹고 있었다.

역시 뭐든 계속하지 않으면 까먹는다..

그래서 코드를 수정했다.

근데 Math.sqrt는 반환값이 double형이기 때문에 사용 시 주의해야 한다.

나는 소인수분해 문제를 풀 때 배열크기에도 sqrt를 사용했는데 배열 크기는 int값으로 줘야하기에 오류가 발생했다.

그래서 (int)를 붙여 타입 캐스팅을 해줬다. 아니면 n/2로 주어도 괜찮다.

 

 

 

 

Codeup 1274 소수 판별

https://www.codeup.kr/problem.php?id=1274

import java.util.Scanner;

public class Codeup1274 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        String isFactor = "prime";

        for (int i = 2; i <= Math.sqrt(num) / 2; i++) {
            if (num % i == 0) {
                isFactor = "not prime";
                break;
            }
        }
        System.out.println(isFactor);
    }
}

이때 주의할 것은 for문 조건값 범위에 루트 num을 포함해야 한다는 점이다.

 

 

 

 

 

 

프로그래머스 소인수분해

https://school.programmers.co.kr/learn/courses/30/lessons/120852

import java.util.Arrays;

public class ProgrammersPrimeFactorization {
    public static int[] solution(int n) {
        int[] tempArr = new int[n / 2];
        int idx = 0;
        for (int i = 2; i <= n; i++) { // n의 약수 구하기
            boolean isPrime = true;
            if (n % i == 0) {
                for (int j = 2; j < i; j++) { // 해당 약수가 소수인지 판별
                    if (i % j == 0) {
                        isPrime = false;
                        break;
                    }
                }
                if (isPrime) { // 소수면 arr에 추가
                    tempArr[idx] = i;
                    idx++;
                }
            }
        }
        int[] answer = new int[idx];
        for (int i = 0; i < idx; i++)
            answer[i] = tempArr[i];
        return answer;
    }
    public static void main(String[] args) {
        int[] arr = solution(210);
        System.out.println(Arrays.toString(arr));
    }
}

통과한 뒤 다른 코드들을 보았는데 다들 list를 사용해서 풀었다..배열은 한번 선언한 뒤 크기를 변경할 수 없기에 list를 사용해 푸는 것이 훨씬 적절해 보였다.

 

그러나 난 list를 사용할 줄 모르기 때문에 이렇게 풀 수 밖에 없다...list를 배우고 나서 더 효율적인 방법으로 풀어보도록 하겠다.

728x90
반응형
SMALL