일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 스택
- 배열 리스트
- windows 12
- 카니발대학교 공대강국
- vrm posing desktop
- 시작
- 택시 기하학
- 그래픽 디자인
- i자형 인재
- 마인크래프트
- 영어
- 자료구조
- 그리디 알고리즘
- 큐
- 병역일터
- 코딩테스트
- c#
- 이진 탐색
- unity engine
- 빅오 표기법
- T자형 인재
- 2025 대한민국 채용박람회
- 브루트포스 알고리즘
- 라자냐
- VRoid Studio
- 잴다의 전설 티어스 오브 더 킹덤
- 다이나믹프로그래밍
- 우선순위 큐
- 닌텐도 스위치 2
- blender
Archives
- Today
- Total
WalkerJei's Lifelog
백준알고리즘 2609번 최대공약수와 최소공배수 C# 본문
세부 정보
- 사이트: 백준알고리즘
- 번호: 2609
- 문제명: 최대공약수와 최소공배수
- 언어: C#
- 분류: 수학, 정수론, 유클리드 호제법
- 비고:
문제
두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.
출력
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
풀이
최대공약수와 최소공배수는 항상 자연수로 구성되며 0은 일반적으로 자연수가 아님을 명심해야 한다.
수를 나눌 때 가장 작은 공약수로 나누는 것부터 시작하면 더 나눌 수 있는데 나눠지지 않고 그냥 넘어갈 수 있기에 가장 큰 공약수로 나누는 것부터 시작해야 깔끔하게 나눌 수 있다.
// 문자열로 두 자연수를 입력받아 공백으로 구분
string[] input = Console.ReadLine().Split();
// 문자열 형태의 자연수를 정수로 전환해 배열에 배치
int[] number = new int [2];
number[0] = Convert.ToInt32(input[0]);
number[1] = Convert.ToInt32(input[1]);
// 오름차순으로 배열 정렬
Array.Sort(number);
// 최대공약수 the greatest common denominator
int gcd = 1;
// 최소공배수 the least common multiple
int lcm = 1;
// 배열에 입력한 가장 작은 수부터 시작해 1씩 차감하며 1에 도달할 때까지 반복
for(int i = number[0]; i >= 1; i--)
{
// 두 수의 공약수들로만 나눠진다.
if (number[0] % i == 0 && number[1] % i == 0)
{
// 최대공약수에 나눌 때 사용한 수를 곱한다
gcd *= i;
// 최소공배수에 나눌 때 사용한 수를 곱한다
lcm *= i;
// 배열 내 수를 최대한 큰 수로 나누어 크기를 줄인다
number[0] /= i;
number[1] /= i;
}
}
// 최종적인 최소공배수 완성을 위해 더 이상 나눌 수 없는 배열의 수를 곱한다.
lcm *= number[0] * number[1];
// 최대공약수 출력
Console.WriteLine(gcd);
// 최소공배수 출력
Console.WriteLine(lcm);
후기
처음 시도했을 때 유클리드 호제법을 어설프게 시도하다가 실패했다. 큰 수를 작은 수로 나눈 나머지가 곧 최대공약수라고 생각했으나 아니었다. 변수 문제를 의심해서 최대공약수와 최소공배수의 초기값을 0으로 안 해서 그런 줄 알기도 했다. 하지만 앞서 말했듯이 자연수라는 전제 조건을 믿었기에 초기값 문제라는 생각은 사그라들었다. 그리하여 공약수로 나눌 때 가장 큰 공약수로 시작해야 제대로 나눠진다는 것을 알았다. 오늘도 하나 배웠다.
'소프트웨어 개발 > 코딩테스트(기성 문제)' 카테고리의 다른 글
백준알고리즘 4153번 직각삼각형 C# (0) | 2025.03.08 |
---|---|
백준알고리즘 2163번 초콜릿 자르기 C# (0) | 2025.03.07 |
백준알고리즘 5086번 배수와 약수 C# (0) | 2025.03.06 |
백준알고리즘 1037번 약수 C# (0) | 2025.03.04 |
백준알고리즘 1712번 손익분기점 C# (1) | 2025.03.03 |