[BaekJoon] 5086번 - 배수와 약수 (java)

1. 문제

👉 문제 바로가기

- 조건

시간 제한 메모리 제한
1초 128MB


- 문제

4 × 3 = 12이다.
이 식을 통해 다음과 같은 사실을 알 수 있다.
3은 12의 약수이고, 12는 3의 배수이다.
4도 12의 약수이고, 12는 4의 배수이다.
두 수가 주어졌을 때, 다음 3가지 중 어떤 관계인지 구하는 프로그램을 작성하시오.

- 입력

입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 10,000이 넘지않는 두 자연수로 이루어져 있다. 마지막 줄에는 0이 2개 주어진다. 두 수가 같은 경우는 없다.

- 출력

각 테스트 케이스마다 첫 번째 숫자가 두 번째 숫자의 약수라면 factor를, 배수라면 multiple을, 둘 다 아니라면 neither를 출력한다.

- 예제

  입력      출력  
8 16
32 4
17 5
0 0
factor
multiple
neither





2. 풀이



2-0. 알고리즘

while 반복문을 사용해 “0 0” 입력전까지 무한 반복한다.

while (조건식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문 작성;
}




약수와 배수인지를 구할 때는 % 를 사용해 나머지가 0인 경우를 찾으면 된다.

만약 첫 번째 숫자(a)가 두 번째 숫자(b)의 약수라면, b % a == 0 이다.
만약 첫 번째 숫자(a)가 두 번째 숫자(b)의 배수라면, a % b == 0 이다.
따라서, 조건문을 사용해 약수와 배수를 체크하고 해당하는 문자열을 출력한다.

if(b % a == 0){
    System.out.println("factor");
}else if(a % b == 0){
    System.out.println("multiple");
}else{
    System.out.println("neither");
}





2개의 입력방식을 사용해서 결과를 출력한다.

  1. Scanner 클래스
  2. BufferedReader 클래스


2-1. Scanner 클래스

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        while(true){
            int a = sc.nextInt(); 
            int b = sc.nextInt(); 
            
            if(a==0 && b==0){
                break;
            }
            
            if(b % a == 0){
                System.out.println("factor");
            }else if(a % b == 0){
                System.out.println("multiple");
            }else{
                System.out.println("neither");
            }
            
        }
    }
}

위와같이 객체를 생성할 때, Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는 것을 뜻한다.

int형 데이터를 입력받기 위해 nextInt() 메서드를 사용한다.

break; 는 감싸고 있는 제어문(while)의 블록을 빠져 나오는 기능이다.
반복문에서는 주로 조건문(if)와 같이 사용하여 조건에 해당되는 경우 반복 수행을 종료한다.
여러 반복문이 중첩되어 있는 경우엔 break 문이 포함되어 있는 가장 가까운 반복문만 빠져 나온다.



[여기서 잠깐!]

Scanner에 대해 더 자세히 알고싶다면 여기 를 클릭하세요




2-2. BufferedReader 클래스 사용


readLine() 메서드를 사용해 읽어온 문자열을 공백단위로 분리한다.
문자열 분리 방법으로는 StringTokenizer 클래스를 사용한다.


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        while(true){
            StringTokenizer st = new StringTokenizer(br.readLine());
            
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            
            if(a==0 && b==0){
                break;
            }
            
            if(b % a == 0){
                System.out.println("factor");
            }else if(a % b == 0){
                System.out.println("multiple");
            }else{
                System.out.println("neither");
            }
        }
    }
}

readLine()은 한 줄을 통째로 읽어 String으로 반환하기 때문에, StringTokenizer 클래스의 nextToken()를 이용해 공백으로 구분된 입력값들을 순서대로 가져온다.

Integer.parseInt()을 사용해 String형을 int형으로 변환시켜준다.



[여기서 잠깐!]

BufferedWriter 클래스에 대해 더 알아보고 싶으면 여기를 클릭하면 된다.





3. 성능 비교

image

입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.





관련 페이지

Categories:

Updated:

Leave a comment