[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” 입력전까지 무한 반복한다.
조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문 작성;
}
약수와 배수인지를 구할 때는 % 를 사용해 나머지가 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개의 입력방식을 사용해서 결과를 출력한다.
- Scanner 클래스
- 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 문이 포함되어 있는가장 가까운 반복문만 빠져 나온다.
[여기서 잠깐!]
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. 성능 비교
입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.
관련 페이지
Leave a comment