일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- HashMap
- LIS
- 다이나믹프로그래밍
- 새벽코딩
- Python
- 브루트포스
- dfs
- 완전탐색
- 시뮬레이션
- Java
- 배열
- 백트래킹
- BufferedReader
- Stack
- BFS
- 스택
- 프로그래머스
- 다리 만들기
- 아스키코드
- 백준
- 알고리즘
- 탐색
- Queue
- DP
- 그리디
- 문자열
- SQL
- oracle
- 구현
- 빅데이터
- Today
- Total
새벽코딩
[프로그래머스] N개의 최소공배수 (JAVA) (level2) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/12953
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.
제한 사항- arr은 길이 1이상, 15이하인 배열입니다.
- arr의 원소는 100 이하인 자연수입니다.
※ JAVA 코드 (N개의 최소공배수)
import java.util.*;
class Solution {
static int yaksu;
public static int solution(int[] arr) {
int answer = 0;
int num = 1;
int b = 0;
int len = arr.length; // 배열크기
Arrays.sort(arr);
int tmp = LCM(arr[1], arr[0]);
int A, B;
// 최대공약수 반복
for(int i = 2; i < len; i++) {
if(arr[i] >= tmp) {
A = arr[i];
B = tmp;
} else {
A = tmp;
B = arr[i];
}
b = LCM(A, B);
tmp = b;
}
answer = b;
return answer;
}
// 최소공배수
public static int LCM(int a, int b) {
return (a * b) / GCD(a, b);
}
// 최대공약수
public static int GCD(int a, int b) {
// 나누어 떨어지면
if( a % b == 0) {
yaksu = b;
} else {
GCD (b, a % b);
}
return yaksu;
}
}
※ 생각정리 (N개의 최소공배수)
[알고있어야 하는 상식]
1. 유클리드 호제법 - 두 수의 최대공약수를 구할때 사용하는 알고리즘
두 수 A, B (144, 60)의 최대공약수를 구하기 위해서는 어떤 과정을 거칠까?
먼저, A에서 B를 나눈 나머지를 구한다. 이때 나머지가 0이라면(나누어 떨어진다면) 제수 B가 두수의 최대공약수가 된다.
만약 나머지가 0이 아니라면(나누어 떨어지지 않는다면) 피제수에 B를 제수에 A % B( A를 B로 나눈 나머지)를 대입하여 위의 과정을 반복한다.
이를 코드로 본다면 다음과 같다.
// 최대공약수
public static int GCD(int a, int b) {
// 나누어 떨어지면
if( a % b == 0) {
yaksu = b;
} else {
GCD (b, a % b);
}
return yaksu;
}
이때, 최대공약수를 활용하여 두 수(A, B)의 최소 공배수까지 구할 수 있다.
최소공배수 = (A * B) / 최대공약수
// 최소공배수
public static int LCM(int a, int b) {
return (a * b) / GCD(a, b);
}
단순히 두수의 최대공약수, 최소공배수를 구하는 문제였다면 해당 문제가 level2이지 않을 것이고 N개의 수(최대 15개)의 수의 최소 공배수를 구하여야한다.
문제해결을 위해 두 수씩 짝지어 최소공배수를 구하여 해당 최소공배수와 다음 수와의 최소공배수를 구하여 순차적으로 문제를 해결하여야한다.
- 새벽코딩-
'알고리즘' 카테고리의 다른 글
[백준] [2839] 설탕 배달 (JAVA) (dp) (3) | 2023.10.10 |
---|---|
[프로그래머스] 연속 부분 수열 합의 개수 (JAVA) (level2) (2) | 2023.10.09 |
[프로그래머스] 예상 대진표 (JAVA) (level2) (0) | 2023.10.08 |
[프로그래머스] 점프와 순간 이동 (JAVA) (1) | 2023.10.05 |
[프로그래머스] 문자열 내 마음대로 정렬하기 (JAVA) (0) | 2023.09.14 |