본문 바로가기
lecture.js/algorithm.log

#010 소인수분해

by malda 2017. 7. 12.
#문제)
자연수 N을 입력받아 소인수 분해하여 그 결과를 출력하는 알고리즘을 제시하라.
- 입력받은 정수 N이 2보다 작으면 알고리즘을 종료한다.
- 입력받은 정수 N이 소수이면 '소수'라고 출력한다.
- 입력받은 정수 N이 소수가 아니면 소인수 분해한 결과를 출력한다.
- 132는 2 X 2 X 3 X 11 과 같이 소인수 분해된다.
- 다양한 입력별 알고리즘의 실행 예시는 다음과 같다.

입력: 132 -> 출력: "2*2*3*11"
입력: 37 -> 출력: "소수"
입력: 20 -> 출력: "2*2*5"
입력: 0 -> 알고리즘 종료

소인수분해 할 결과를 저장 해야 하기 때문에 스택 사용이 필요하다.

그럼, 소인수분해 규칙을 살펴보자
먼저, 2부터 시작하여 N값을 %연산을 했을때 결과가 0인 경우, 2로 나눌 수 있는 수이기 때문에 나눈다.
스택에 2를 저장하고 반복하고, 2로 나누었을 때 나머지가 있다면 2를 +1 증가시킨다.


package dataStructure.prediction.problem;

import java.util.Scanner;
import java.util.Stack;

public class Factorization {
   
    private Scanner scanner = null;
    private Stack<Integer> factorizationStack = null;
   
    public Factorization() {
        // TODO Auto-generated constructor stub
        this.scanner = new Scanner(System.in);
        this.factorizationStack = new Stack<Integer>();
    }
   
    public void execute() {
        while(true) {
            System.out.println("please input number : (if you want to quit input '-1')");
            int command = scanner.nextInt();
            if(command == -1) {
                break;
            }
           
            if(isPrimeNumber(command)) {
                System.out.println("this number is prime number : "+command);
            }else {
                factorization(command);
            }
            print();
           
        }
        scanner.close();
    }
   
    private boolean isPrimeNumber(int num) {
        boolean isPrimeNumber = true;
        int v = 2;
        while(v < num) {
            if(num%v == 0) {
                isPrimeNumber = false;
                break;
            }
            v++;
        }
        return isPrimeNumber;
    }
   
    private void factorization(int num) {
        int v = 2;
        while(v <= num) {
            if(num%v==0) {
                num = num/v;
                factorizationStack.add(v);
            }else {
                //개선필
                v++;
            }
        }
    }
   
    public void print() {
        StringBuilder result = new StringBuilder();
        while(!factorizationStack.isEmpty()) {
            result.append(factorizationStack.pop());
            if(!factorizationStack.isEmpty()) {
                result.append("*");
            }
        }
        System.out.println(result.toString());
    }
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       Factorization factorization = new Factorization();
       factorization.execute();
      
    }

}

*개선 필이라고 한부분은 소인수 분해이므로 굳이 1씩 증가할 필요없이 한단계 높은 소수로 올리면 되지만
소수를 모름. 그래서 isPrimeNumber할때 배열로 넣어놓을까 고민중


'lecture.js > algorithm.log' 카테고리의 다른 글

#012 버블 정렬  (0) 2017.07.18
#011 한글로 변환  (0) 2017.07.18
#009 소수 판별  (0) 2017.07.12
#008 고속버스 배치  (0) 2017.07.12
#007 배열 회전  (0) 2017.07.10