본문 바로가기

백준

백준 닷컴 단계 별로 풀어보기 9단계

1단계 배수와 약수

  • 입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 10,000이 넘지않는 두 자연수로 이루어져 있다. 마지막 줄에는 0이 2개 주어진다. 두 수가 같은 경우는 없다.
  • 각 테스트 케이스마다 첫 번째 숫자가 두 번째 숫자의 약수라면 factor를, 배수라면 multiple을, 둘 다 아니라면 neither를 출력한다.
package stage09;

import java.util.Scanner;

public class Step_1 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		String str="";
		while (true) {
			int a=scan.nextInt();
			int b=scan.nextInt();
			if (a==0&&b==0) {
				break;
			}
			if(a/b>0&&a%b==0) {
				str+="m";
			} else if (b/a>0&&b%a==0){
				str+="f";
			} else {
				str+="n";
			}		
		}
		for (int i=0; i<str.length(); i++) {
			if (str.charAt(i)=='m') {
				System.out.println("multiple");
			} else if (str.charAt(i)=='f') {
				System.out.println("factor");
			} else {
				System.out.println("neither");
			}
		}
	}
}

A.

  • 반복문의 값을 임시로 받을 str을 선언한다.
  • while문을 true로 만들고 두 수가 0 0일 경우 break되는 반복문으로 한다.
  • a,b의 값의 약수, 배수 관계를 조건으로 설정하고 str에 해당하는 이니셜을 연결한다.
  • 반복문을 통해 str의 각 char값을 비교하여 약수, 배수, 그 외를 출력하도록 한다.

2단계 약수 구하기

  • 첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.
  • 첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.
package stage09;

import java.util.Scanner;

public class Step_2 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int a= scan.nextInt();
		int b= scan.nextInt();
		
		int count=0;
		int show=0;
		for (int i=1; i<=a; i++) {
			if(a%i==0) {
				count++; 
			}
			if (count==b) {
				show = i;
				break;
			}
		}
		System.out.println(show);
	}
}

A.

  • n과 k를 받아준다.
  • int count와 show를 0으로 초기화한다.
  • count는 k번째 약수를 찾기 위한 툴이고, show는 해당 값을 찾았을 때 저장할 변수. 해당 값이 없다면 문제 양식대로 0이 남는다.
  • 반복문을 작성하여 1부터 약수 여부를 확인한다. 약수일 경우 count를 1 늘리고 count가 k까지 도달했는지 체크한다. k까지 도달한 경우 show에 i값을 저장하고 break로 반복문을 멈춘다.
  • show를 출력한다.

3단계 약수들의 합

  • n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).
  • 6 = 1 + 2 + 3
  • n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.
import java.util.Scanner;

public class Step_3 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		while (true) {
			int a = scan.nextInt();
			if (a == -1) {
				break;
			}
			String str = "";
			int sum = 0;
			for (int i = 1; i < a; i++) {
				if (a % i == 0) {
					sum += i;
					str += (i+" ");
				}
			}
			
			String[] arr = str.split(" ");
			
			if (sum == a) {
				System.out.print(a+" = ");
				for (int i=0; i<arr.length; i++) {
					if (i==arr.length-1) {
						System.out.println(arr[i]);
					} else {
						System.out.print(arr[i]+" + ");
					}
				}
			} else {
				System.out.println(a+" is NOT perfect.");
			}
		}
	}
}

A.

  • while문을 만들고 true조건으로 반복시킨다.
  • int a를 받고, -1일 경우 반복문을 종료시킨다.
  • str을 선언하고 “”로 초기화한다.
  • sum을 선언하고 0으로 초기화한다.
  • a의 약수를 찾아서 약수인 경우 sum에 i값을 더하고, str에 i+” “를 하여 저장한다.
  • sum과 a가 같지 않다면 약수가 아님을 출력한다.
  • sum과 a가 같다면 반복문을 만들어 양식에 맞춰 출력한다.
  • str에 담은 숫자를 split(” “)로 잘라서 String 배열로 저장한다.
  • arr의 각 값을 출력하고, 마지막이 되기 전 까지 “ + ”를 더 출력해서 양식에 맞춰준다.

4단계 소수 찾기

  • 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
  • 주어진 수들 중 소수의 개수를 출력한다.
import java.util.Scanner;

public class Step_4 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int test = scan.nextInt();
		int[] arr= new int[test];
		for (int i=0; i<test; i++) {
			arr[i]=scan.nextInt();
		}
		int count = 0;
		for (int i=0; i<test; i++) {
			int factor = 0;
			for (int j=1; j<=arr[i];j++) {
				if(arr[i]%j==0) {
					factor++;
				}
			}
			if(factor==2) {
				count++;
			}
		}
		System.out.println(count);
	}
}

A.

  • 입력된 값을 이용해 int 배열을 만들어준다.
  • count를 0으로 초기화 한다. 소수의 개수를 받음
  • 반복문을 int 배열 수 만큼 반복한다.
  • 반복문 내부에 약수의 수를 받을 factor를 0으로 초기화한다.
  • 1~배열의 값까지 나누어 약수일 경우 factor++가 되는 반복문을 만든다.
  • factor가 2라면 count를 1 올리고 반복하여 나온 count를 출력한다.

5단계 소수

  • M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.
  • 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
import java.util.Scanner;

public class Step_5 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int m = scan.nextInt();
		int n = scan.nextInt();
		
		int sumPrime=0;
		int primeMin=0;
		
		for (int i=m; i<=n; i++) {
			int fact = 0;
			for (int j=1; j<=i; j++) {
				if (i%j==0) {
					fact++;
				}
				if (fact>2) {
					break;
				}
			}
			if (fact==2) {
				sumPrime+=i;
				if(primeMin==0) {
					primeMin=i;
				}
			}
		}
		if (primeMin>0) {
		System.out.println(sumPrime);
		System.out.println(primeMin);
		} else {
			System.out.println("-1");
		}
	}
}

A.

  • 입력 된 값을 m,n에 받아준다.
  • 소수의 합을 구할 sumPrime과 최소 값을 받을 primeMin을 0으로 초기화한다.
  • m~n까지의 반복문을 만든다. 반복문 내부에 fact로 약수를 체크해준다.
  • 각 수의 약수의 개수를 구한다. fact가 2를 초과할 경우 반복문을 멈추게 한다.
  • fact가 2일 경우 해당 i값을 sumPrime에 더하고, primeMin이 0일 경우 primeMin에도 i를 더한다.
  • primeMin이 0이 아닌 경우 sumPrime과 primeMin을 출력하고, 0일 경우 -1을 출력한다.

6단계 소인수 분해

  • N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.
import java.util.Scanner;

public class Step_6 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int a = scan.nextInt();
		int i=2;
		while(a!=1) {
			while(true) {
				if(a%i==0&&a!=1) {
					System.out.println(i);
					a/=i;
				} else {
					i++;
					break;
				}
			}
		}
	}
}

A.

  • 입력 값을 받아오고, 소인수분해 시작할 소수 2를 i에 초기화 해준다.
  • while문을 a가 1이 아닐 경우로 만든다.
  • while문 내부에 각 소수에 대해 인수분해할 while 반복문을 만든다.
  • a%i가 0이면서 a가 1가 아닌 경우 i를 출력하고 a의 값을 i로 나눠주는 조건문을 만들고, 그 이외에는 i를 1 올려 다음 인수에 대해 실시한다.
  • 모든 인수가 출력 되고 a가 1이 된 경우 코드가 종료된다.