알고리즘
프로그래머스 [Lv. 2] 숫자 카드 나누기 {언어 : JavaScript} [2024.05.05 수정]
스위태니
2024. 4. 24. 20:49
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/135807?language=javascript
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답 코드
function solution(arrayA, arrayB) {
const n = arrayA.length;
const gcd = (arr) => {
let dp = Array(n).fill().map(() => 0);
dp[0] = arr[0];
for (let i = 1; i < n; i++) {
let [n1, n2] = [dp[i-1], arr[i]];
while (n1) {
[n1, n2] = [n2%n1, n1];
};
dp[i] = n2;
};
return dp[n-1];
};
const gcdA = gcd(arrayA);
const gcdB = gcd(arrayB);
const isValid = (num, arr) => {
let isNotDevidedUp = true;
for (const a of arr) {
if (a % num == 0) {
isNotDevidedUp = false;
break;
};
};
return isNotDevidedUp
};
const resultA = isValid(gcdA, arrayB) ? gcdA : 0;
const resultB = isValid(gcdB, arrayA) ? gcdB : 0;
const answer = Math.max(resultA, resultB);
return answer;
}
풀이 방법
- 배열 A와 B의 최대공약수를 각각 구한다.
- 구한 최대 공약수를 서로 다른 배열에서 나누어 떨어지는지 확인한다.
- 나누어 떨어진다면 조건에 맞지 않으므로 0으로 바꾼다.
- 구해준 결과값 A와 B 중 최대 값을 answer로 바꾼다.
- answer를 반환한다.
느낀점
- 최대공약수를 구할 수 있으면 쉽게 풀 수 있는 문제
수정내역
- gbc => 최대공약수를 표현했는데 틀렸음
- gbc => gcd로 변경
https://sound-programming.tistory.com/175
최대공약수, 최소공배수, 유클리드 호제법 {언어: 자바스크립트}
구현 // 최대공약수 const gcd = (n1, n2) => { // 일반적으로 n1이 크다고 전제하고 계산 if (n2 > n1) { [n1, n2] = [n2, n1]; }; // n2가 0이 될 때까지 진행 while (n2) { [n1, n2] = [n2, n1%n2]; }; return n1 }; // 단순 최소공배
sound-programming.tistory.com