[Programmers] 숫자 카드 나누기 - JavaScript

Joosi_Cool·2023년 5월 1일
1

Programmers

목록 보기
73/98
post-thumbnail
post-custom-banner

문제설명

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

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

예를 들어, 카드들에 10, 5, 20, 17이 적혀 있는 경우에 대해 생각해 봅시다. 만약, 철수가 [10, 17]이 적힌 카드를 갖고, 영희가 [5, 20]이 적힌 카드를 갖는다면 두 조건 중 하나를 만족하는 양의 정수 a는 존재하지 않습니다. 하지만, 철수가 [10, 20]이 적힌 카드를 갖고, 영희가 [5, 17]이 적힌 카드를 갖는다면, 철수가 가진 카드들의 숫자는 모두 10으로 나눌 수 있고, 영희가 가진 카드들의 숫자는 모두 10으로 나눌 수 없습니다. 따라서 철수와 영희는 각각 [10, 20]이 적힌 카드, [5, 17]이 적힌 카드로 나눠 가졌다면 조건에 해당하는 양의 정수 a는 10이 됩니다.

철수가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayA와 영희가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayB가 주어졌을 때, 주어진 조건을 만족하는 가장 큰 양의 정수 a를 return하도록 solution 함수를 완성해 주세요. 만약, 조건을 만족하는 a가 없다면, 0을 return 해 주세요.


제한사항

제한사항

  • 1 ≤ arrayA의 길이 = arrayB의 길이 ≤ 500,000
  • 1 ≤ arrayA의 원소, arrayB의 원소 ≤ 100,000,000
  • arrayAarrayB에는 중복된 원소가 있을 수 있습니다.

입출력 예
arrayA arrayB result
[10, 17] [5, 20] 0
[10, 20] [5, 17] 10
[14, 35, 119] [18, 30, 102] 7

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • 철수가 가진 카드에 적힌 숫자들은 모두 3으로 나눌 수 없고, 영희가 가진 카드에 적힌 숫자는 모두 3으로 나눌 수 있습니다. 따라서 3은 조건에 해당하는 양의 정수입니다. 하지만, 철수가 가진 카드들에 적힌 숫자들은 모두 7로 나눌 수 있고, 영희가 가진 카드들에 적힌 숫자는 모두 7로 나눌 수 없습니다. 따라서 최대값인 7을 return 합니다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges



설계 과정

함수를 2개 생성
1. 배열 값 모두 안나눠져야 true리턴하는 함수
인자: num, array
array를 돌면서 num이 모두 안나눠지면 true
나눠지는게 있으면 false리턴
2. 배열 값 모두 나눠져야 true리턴하는 함수
인자: num, array
array를 돌면서 num이 모두 나눠지면 true
안 나눠지는게 있으면 false리턴

  • 이를 가지고 아래과정 시행
  1. arrayA에 가장 작은 값에서부터 2까지 아래 과정 시행 => i
    arrayA에 있는 값은 i를 모두 나눠야한다. -> 2번함수
    arrayB에 있는 값을 i를 모두 나뉘면 안된다. -> 1번함수
    이 값이 있다면 i를 저장하고 break
  2. arrayB기준에서도 반대로 해서 i를 저장
  3. 두 값을 비교해서 큰 값을 리턴


정답 코드

//배열 값 모두 안나눠져야 true리턴
function divNotFunction(num,array){
    for(var i = 0;i<array.length;i++){
        if(array[i]%num===0){
            return false;
        }
    }
    return true;
}

//배열안 모두 나눠져야 true리턴
function divFunction(num,array){
    for(var i = 0;i<array.length;i++){
        if(array[i]%num!==0){
            return false;
        }
    }
    return true;
}


function solution(arrayA, arrayB) {
    
    arrayA = arrayA.sort((a,b)=>a-b);  
    arrayB = arrayB.sort((a,b)=>a-b);    
    
    var answer1=0,answer2=0;
    
    for(var i = arrayA[0];i>=2;i--){
        if(divFunction(i,arrayA)){
            if(divNotFunction(i,arrayB)){
                answer1 = i;
                break;
            }
        }
    }
    
    for(var i = arrayB[0];i>=2;i--){
        if(divFunction(i,arrayB)){
            if(divNotFunction(i,arrayA)){
                answer2 = i;
                break;
            }
        }
    }
    return answer1>answer2? answer1 :answer2;
}


결과



profile
집돌이 FE개발자의 노트
post-custom-banner

0개의 댓글