서론
약수, 배수와 소수 2
1 ~ 3 문제풀이
1934 : 최소공배수
문제
https://www.acmicpc.net/problem/1934
1934번: 최소공배수
두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있
www.acmicpc.net
해설
처음에는 아래의 코드처럼 무작정
1부터 A * B까지의 수로 A와 B를 나누어서 둘 다 나누어 떨어지면, 공배수이므로, 이를 출력하고자 하였다.
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
for (int j = 1; j <= (A*B); j++) {
if(j % A == 0 && j % B == 0){
sb.append(j).append("\n");
break;
}
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}
하지만 시간초과가 나왔다. (당연..ㅎ)
그래서 유클리드 호제법을 사용해보기로 하였다.
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int g = gcd(A,B);
sb.append(A * B / g).append("\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
private static int gcd(int a, int b) {
if(a % b == 0){
return b;
}
return gcd(b, a%b);
}
}
유클리드 호제법에 대해서는 다음에 자세히 다뤄보도록 하겠다.
13241 : 최소공배수
문제
https://www.acmicpc.net/problem/13241
13241번: 최소공배수
정수 B에 0보다 큰 정수인 N을 곱해 정수 A를 만들 수 있다면, A는 B의 배수이다. 예: 10은 5의 배수이다 (5*2 = 10) 10은 10의 배수이다(10*1 = 10) 6은 1의 배수이다(1*6 = 6) 20은 1, 2, 4,5,10,20의 배수이다. 다
www.acmicpc.net
해설
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
long N = Long.parseLong(st.nextToken());
long M = Long.parseLong(st.nextToken());
long g = gcd(N, M);
StringBuilder sb = new StringBuilder();
sb.append(N * M / g);
bw.write(sb.toString());
bw.flush();
bw.close();
}
private static long gcd(long a, long b) {
if(a % b == 0){
return b;
}
return gcd(b, a%b);
}
}
이 문제도 동일하게 유클리드 호제법을 사용하였다.
하지만, 처음에는 int형으로 사용했다가 틀렸다..
입력에 long을 쓰라고 이미 알려줬는데, 문제 좀 잘 읽자..ㅋㅋ
1735 : 분수 합
문제
https://www.acmicpc.net/problem/1735
1735번: 분수 합
첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.
www.acmicpc.net
해설
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
long A1 = Long.parseLong(st.nextToken());
long B1 = Long.parseLong(st.nextToken());
st = new StringTokenizer(br.readLine());
long A2 = Long.parseLong(st.nextToken());
long B2 = Long.parseLong(st.nextToken());
long B = B1 * B2;
long A = (A1 * B2) + (A2 * B1);
long g = gcd(A,B);
StringBuilder sb = new StringBuilder();
sb.append(A/g).append(" ").append(B/g);
bw.write(sb.toString());
bw.flush();
bw.close();
}
private static long gcd(long a, long b) {
if(a % b == 0){
return b;
}
return gcd(b, a%b);
}
}
이 문제는 분수의 합을 기약분수로 출력하는 문제이다.
먼저, 통분을 해주기 위해, 각 분모를 곱해주고, 분자에 각각 분모를 곱해주었다.
이를 공식으로 표현하면 아래와 같다.
그리고 마지막으로 기약분수로 만들어주기 위해서 A,B의 최대공약수로 이를 나누어 주었다.
결론
유클리드 호제법을 잊고 있었는데, 자세히 알아보아야 겠다.
'CodingTest > 백준' 카테고리의 다른 글
[백준] 약수, 배수와 소수2_3 (0) | 2023.08.18 |
---|---|
[백준] 약수, 배수와 소수2_2 (0) | 2023.08.17 |
[백준] 집합과 맵_2 (0) | 2023.08.09 |
[백준] 집합과 맵_1 (0) | 2023.08.08 |
[백준] 정렬 (0) | 2023.07.29 |