코북
Keep going
코북
전체 방문자
오늘
어제
  • 분류 전체보기 (113)
    • Computer Science (20)
      • 인터넷 (10)
      • 운영체제 및 일반지식 (4)
      • 공통 요구사항 (4)
      • WAS (2)
    • DataBase (17)
    • JavaScript (22)
    • Spring (15)
    • Java (4)
    • ASP.NET (5)
    • C# (6)
    • 알고리즘 (8)
    • HTML5 + CSS (5)
    • Git & GitHub (5)
    • Machine Learning (5)
    • 좋은 글 공유 (1)

최근 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
코북

Keep going

[Java]소인수분해
알고리즘

[Java]소인수분해

2022. 1. 25. 12:42

 

 안녕하세요 코북입니다. 오늘은 소인수분해에 대한 문제를 풀었는데 여러가지 풀이 방법이 있어 기록하려고 합니다. 먼저 소인수분해의 뜻을 알아야 문제를 풀 수 있습니다. 어렸을 때부터 들어봤지만 정확히 무슨 뜻인지는 저도 잘 몰랐던 것 같습니다. 

 

소인수분해란?

소인수분해는 어떤 수를 소수인 인수로 분해하는 것이다. 소수는 1과 자기 자신으로만 나누어 떨어지는 정수를 의미한다. 소인수분해가 중요한 이유는 현대 암호학의 가장 기본 토대가 되는 부분이기 때문이다. 두 수의 곱셈을 결과로 나타내기는 쉬워도 결과를 두 수의 곱셈으로 나타내기는 어렵다는 역발상에서 시작되는 것이 암호학의 기초이기 때문에 그렇다고 한다.

 

 저는 두 가지 방식으로 문제를 해결했습니다.

첫 번째는 while문과 if문을 사용한 풀이이고, 두 번째는 for문과 while문을 이용한 풀이입니다.

 

1. while문과 if문 사용

public class Java09 {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("소인수분해 할 수를 입력하세요. : ");
		int num = sc.nextInt();
		int i=2;
		
		while(num>=i) 
		{
			if(num%i==0) 
			{
				System.out.print(i);
				num /= i;
			}
			else 
			{
				i++;
			}
		}
	}
}

 

입력하는 값이 i보다 클 때 while문이 동작하고 나누어 떨어진 값을 반복적으로 출력해줍니다. 그리고 더 이상 나누어 떨어지지 않으면 i를 더해주는 방식입니다. 입력값이 i보다 커지면 while문은 동작을 멈춥니다. 여기서 위의 풀이처럼 인수 중간에 '*'를 추가하려면 다음과 같은 조건을 생성해주면 됩니다.

 

public class Java09 {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("소인수분해 할 수를 입력하세요. : ");
		int num = sc.nextInt();
		int i=2;
		
		while(num!=1) //입력값이 1이 아닌 경우에만 동작
		{
			if(num%i==0) 
			{
				System.out.print(i);
				num /= i;
				if (num>i) //나눠지는 값이 i보다 큰 경우에만 * 삽입
				{
					System.out.print("*");					
				} 
				else 
				{
					break;
				}
			} 
			else 
			{
				i++;
			}
		}
	}
}

 

2. for문과 while문 사용

public class Java09_2 {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("소인수분해 할 수를 입력하세요. : ");
		int num = sc.nextInt();
		
		for(int i=2; i<=num; i++) 
		{
			while(num%i==0) 
			{
				System.out.print(i);
				num/=i;
			}
		}
	}
}

결국 나누는 수를 반복하고 더 이상 반복이 되지 않을 때 더하는 규칙은 같습니다. 여기서도 중간에 *식을 넣어주려면 위에서 추가했던 if문을 삽입해주면 됩니다. 코드는 아래와 같습니다.

 

public class Java09_2 {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("소인수분해 할 수를 입력하세요. : ");
		int num = sc.nextInt();

		for(int i=2; i<=num; i++) 
		{
			while(num%i==0) 
			{
				System.out.print(i);
				num/=i;
				
				if(num>i) 
				{
					System.out.print("*");
				} 
				else 
				{
					break;
				}
			}
		}
	}

}

 

배운 점

소인수분해에 대해 더 정확한 개념을 알 수 있었고, 왜 소인수분해가 중요한지도 배울 수 있는 기회였다. while문에서 언제 break를 걸어야 하는지 생각해 볼 수 있는 시간이었다.

 

 

 

본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.

https://terms.naver.com/entry.naver?docId=925907&cid=47324&categoryId=47324

https://st-lab.tistory.com/152

https://st-lab.tistory.com/100

 

 

저작자표시 비영리 동일조건 (새창열림)

'알고리즘' 카테고리의 다른 글

[Java] 가까운 거리 찾기 (1차원)  (0) 2022.02.08
[Java]수열 n번째 항까지 출력  (0) 2022.02.01
[Java]팩토리얼 - 재귀 함수  (0) 2022.01.24
[Java]최대 공약수, 최소 공배수 구하기(feat.유클리드 호제법)  (0) 2022.01.23
[Java]1-2+3-4+...+99-100 계산  (0) 2022.01.22
    '알고리즘' 카테고리의 다른 글
    • [Java] 가까운 거리 찾기 (1차원)
    • [Java]수열 n번째 항까지 출력
    • [Java]팩토리얼 - 재귀 함수
    • [Java]최대 공약수, 최소 공배수 구하기(feat.유클리드 호제법)
    코북
    코북

    티스토리툴바