[백준] 5086번 : 배수와 약수 - JAVA [자바]
-
문제
수학 3 카테고리의 첫 문제다!
- 알고리즘 [접근 방법]
이번 문제는 워낙 쉬운 문제라 크게 설명 할 것이 없다.
두 수가 주어질 때 다음 조건 아래 만족하는 것에 따라 출력을 해주면 된다.
1. 첫 번째 수가 두 번째 수의 약수일 때 (= 두 번째 수가 첫 번째 수의 배수일 때)
2. 첫 번째 수가 두 번째 수의 배수일 때 (= 두 번째 수가 첫 번째 수의 약수일 때)
3. 첫 번째 수와 두 번째 수가 서로 약수와 배수의 관계가 아닐 때
// 첫 번째 수가 두 번째 수의 약수일 때 (= 두 번째 수가 첫 번째 수의 배수일 때)
if(second % first == 0) {
}
// 첫 번째 수가 두 번째 수의 배수일 때 (= 두 번째 수가 첫 번째 수의 약수일 때)
else if(first % second == 0) {
}
// 첫 번째 수와 두 번째 수가 서로 약수와 배수의 관계가 아닐 때
else {
}
- 3가지 방법을 사용하여 풀이한다.
이전 포스팅과 여타 다를 바 없이 입력 방법을 달리하여 풀어볼 것이다.
또한 추가로 Scanner에서는 매번 출력하는 방법과 StringBuilder을 사용하여 하나의 문자열로 묶은 뒤 한 번에 출력하는 방법을 사용하고, BufferedReader에서는 StringBuilder만 사용할 것이다.
1 . Scanner + System.out.println()
2 . Scanner + StringBuilder
3. BufferedReader + StringBuilder
- 풀이
- 방법 1 : [Scanner + System.out.println()]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(true) {
int first = in.nextInt();
int second = in.nextInt();
if(first == 0 && second == 0) break;
if(second % first == 0) {
System.out.println("factor");
}
else if(first % second == 0) {
System.out.println("multiple");
}
else {
System.out.println("neither");
}
}
}
}
가장 기본적인 방법이다. 워낙 쉬워서.. 별달리 설명할 것이 없다.
- 방법 2 : [Scanner + StringBuilder]
출력 문자는 3가지로 정해져 있기 때문에 미리 선언해놓고 StringBuilder을 사용하여 문자열을 묶어주는 방식이다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String f = "factor\n";
String m = "multiple\n";
String n = "neither\n";
Scanner in = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
while(true) {
int first = in.nextInt();
int second = in.nextInt();
if(first == 0 && second == 0) break;
if(second % first == 0) {
sb.append(f);
}
else if(first % second == 0) {
sb.append(m);
}
else {
sb.append(n);
}
}
System.out.println(sb);
}
}
크게 어려울 것은 없을 것이다. 이번 문제는 중복을 고려하지 않아도 되니 오히려 쉬웠을 수도 있다.
- 방법 3 : [BufferedReader + StringBuilder]
위 방법2에서 입력방법을 Scanner 대신 BufferedReader을 사용하여 풀이한 방법이다.
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 {
String f = "factor\n";
String m = "multiple\n";
String n = "neither\n";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
while(true) {
st = new StringTokenizer(br.readLine()," ");
int first = Integer.parseInt(st.nextToken());
int second = Integer.parseInt(st.nextToken());
if(first == 0 && second == 0) break;
if(second % first == 0) {
sb.append(f);
}
else if(first % second == 0) {
sb.append(m);
}
else {
sb.append(n);
}
}
System.out.println(sb);
}
}
크게 어려울 것은 없을 것이다. 이번 문제는 중복을 고려하지 않아도 되니 오히려 쉬웠을 수도 있다.
- 성능
채점 번호 : 23238514 - 방법 3 : BufferedReader + StringBuilder
채점 번호 : 23238512 - 방법 2 : Scanner + StringBuilder
채점 번호 : 23238510 - 방법 1 : Scanner + System.out.println()
데이터가 적어 출력상의 큰 차이는 없는듯..
- 정리
오랜만에 매우 쉽게 풀 수 있는 문제였다. 근래 포스팅 빈도가 약간 줄었는데, 자료구조 시리즈와 프로그래밍 기초 시리즈를 구성하다보니.. 벌려놓은 일들이 많아 어떻게든 수습하기 위해 좀 바빴다. 그래도 어느정도 정리가 되었으니 백준 알고리즘 문제도 무리 없이 포스팅할 수 있다. 만약 어렵거나 이해가 되지 않은 부분이 있다면 언제든 댓글 남겨주시면 최대한 빠르게 답변드리겠다.
'JAVA - 백준 [BAEK JOON] > 정수론 및 조합론' 카테고리의 다른 글
[백준] 11050번 : 이항 계수 1 - JAVA [자바] (17) | 2020.10.27 |
---|---|
[백준] 3036번 : 링 - JAVA [자바] (0) | 2020.10.23 |
[백준] 2981번 : 검문 - JAVA [자바] (10) | 2020.10.22 |
[백준] 2609번 : 최대공약수와 최소공배수 - JAVA [자바] (14) | 2020.10.20 |
[백준] 1037번 : 약수 - JAVA [자바] (6) | 2020.10.15 |