알고리즘/문제풀이

[정수론] 소인수분해

lipnus 2019. 1. 12. 03:10
반응형

백준 11653 소인수분해

https://www.acmicpc.net/problem/11653


1은 소인수분해하면 아무것도 없어야 한다. 1로 출력하면 틀림.

for문에서 N이 계속해서 변하는 것이 특이함.

package com.company;

import java.util.*;

public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();

if(N==1) return;


for(int i=2; i<=N; i++){
if(N%i==0){
System.out.println(i);
N=N/i;
i--;
}
}
}
}




처음풀이

에라토스테네스의 체로 소수를 전부 다 구한다음 그것들로만 나눈다.

근데 연산과정을 보면 체 하는것만 해도 그냥 소인수 바로 구하는 것 보다 많음.

이것도 맞긴 한데 1처리를 안해서 틀린거였다.

package com.company;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();

int[] num = new int[N+1]; //체크되면 1
List<Integer> primeNums = new ArrayList<>();

setPrime(num, primeNums, N);

// System.out.println(primeNums);

if(N==1) return;

for(int i=0; i<primeNums.size(); i++) {

if(N%primeNums.get(i)==0) {
System.out.println(primeNums.get(i));
N = N/primeNums.get(i);
i--;
}
}

}


static void setPrime(int num[], List primeNums, int N) {

for(int start=2; start<=N; start++) {

if(num[start]==1) continue;
// System.out.println("소수: "+start);
primeNums.add(start);

if(Math.sqrt(N) < start) continue; //루트 엔 뒤쪽은 삭제할 필요가 없음

for(int i=start; start*i<=N; i++) {
// System.out.println("-" + start*i);
if(num[start*i]==0) {
num[start*i]=1;
}
}
}
}
}


반응형

'알고리즘 > 문제풀이' 카테고리의 다른 글

[그래프] LCA2  (0) 2019.01.15
파스칼의 삼각형  (0) 2019.01.14
[DFS] 단절점  (0) 2019.01.10
[이진탐색] 나무자르기  (0) 2019.01.07
[순열] 소수찾기  (0) 2019.01.04