[CDT - Javascript] 프로그래머스 연습문제 @ 숫자 카드 나누기

김현수·2024년 1월 26일
0

cdt

목록 보기
41/51


🖋️ 숫자 카드 나누기


# 문제 설명

철수와 영희는 선생님으로부터
숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후
다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 a의 값을 구하기

  • 조건

    • 철수가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고
      영희가 가진 카드들에 적힌 모든 숫자들 중
      하나도 나눌 수 없는 양의 정수 a

    • 영희가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고
      철수가 가진 카드들에 적힌 모든 숫자들 중
      하나도 나눌 수 없는 양의 정수 a

  • 매개 변수

    • 철수가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayA
    • 영희가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayB
  • 반환값

    • 주어진 조건을 만족하는 가장 큰 양의 정수 a를 return
    • 만약, 조건을 만족하는 a가 없다면, 0을 return

  • 📢 제한사항

    • 1 ≤ arrayA의 길이 = arrayB의 길이 ≤ 500,000
    • 1 ≤ arrayA의 원소, arrayB의 원소 ≤ 100,000,000
    • arrayA와 arrayB에는 중복된 원소가 존재 가능

  • 📰 입출력 예시

arrayAarrayBresult
[10, 17][5, 20]0
[10, 20][5, 17]10
[14, 35, 119][18, 30, 102]7



  • CODE

const gcd = (n1, n2) => {
  let last = n1 % n2;
  return n2 === 0 ? n1 : gcd(n2, last);
};

function solution(arrayA, arrayB) {
  let answer = 0;
  let [gcdA, gcdB] = [arrayA[0], arrayB[0]];
    
  for (let i = 1; i < arrayA.length; i++) {
    gcdA = gcd(gcdA, arrayA[i]);
    gcdB = gcd(gcdB, arrayB[i]);
  }
    
  if (gcdA === 1) gcdA = 0;
  if (gcdB === 1) gcdB = 0;

  if (!arrayA.some((v) => v % gcdB === 0)) answer = Math.max(answer, gcdB);
  if (!arrayB.some((v) => v % gcdA === 0)) answer = Math.max(answer, gcdA);

  return answer;
}

풀이

  • 최대공약수와 내장기능을 통해 solution 구하기

  • 각각 최대 공약수 gcd 구하기
  • 해당 최대공약수가 각각 안 나눠질 때 반환값
profile
일단 한다

0개의 댓글