[level 2] 숫자 카드 나누기 - 135807

July 18, 2024

문제 링크

성능 요약

메모리: 142 MB, 시간: 41.46 ms

구분

코딩테스트 연습 > 연습문제

채점결과

정확성: 100.0<br/>합계: 100.0 / 100.0

제출 일자

2024년 07월 18일 23:49:38

문제 설명

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

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

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

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

<hr>

<h5>제한사항</h5>

<p>제한사항</p>

<ul> <li>1 ≤ <code>arrayA</code>의 길이 = <code>arrayB</code>의 길이 ≤ 500,000</li> <li>1 ≤ <code>arrayA</code>의 원소, <code>arrayB</code>의 원소 ≤ 100,000,000</li> <li><code>arrayA</code>와 <code>arrayB</code>에는 중복된 원소가 있을 수 있습니다.</li> </ul>

<hr>

<h5>입출력 예</h5> <table class="table"> <thead><tr> <th>arrayA</th> <th>arrayB</th> <th>result</th> </tr> </thead> <tbody><tr> <td>[10, 17]</td> <td>[5, 20]</td> <td>0</td> </tr> <tr> <td>[10, 20]</td> <td>[5, 17]</td> <td>10</td> </tr> <tr> <td>[14, 35, 119]</td> <td>[18, 30, 102]</td> <td>7</td> </tr> </tbody> </table> <hr>

<h5>입출력 예 설명</h5>

<p><strong>입출력 예 #1</strong></p>

<ul> <li>문제 예시와 같습니다.</li> </ul>

<p><strong>입출력 예 #2</strong></p>

<ul> <li>문제 예시와 같습니다.</li> </ul>

<p><strong>입출력 예 #3</strong></p>

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

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

풀이

java
import java.util.*;

class Solution {
    
    public List<Integer> getDiv(int a) {
        
        List<Integer> arr = new ArrayList<>();
        
        // 숫자의 제곱근까지 반복
        for(int i=1; i<=Math.sqrt(a); i++) {
            if(a % i= 0) {
                arr.add(i);
                arr.add(a / i);
            }
        }
        return arr; // 약수 리스트
    }
    
    // 최대공약수
    public int problem(int[] arr1, int[] arr2) {
        List<Integer> div = getDiv(arr1[0]);
        Collections.sort(div, Collections.reverseOrder()); // 내림차순
        int i, j;
        boolean GCD; // 최대공약수?
        for (i=0; i<div.size()-1; i++) {
            GCD= false; // 초기화
            int num= div.get(i); //현재 숫자
            for(j= 0; j < arr1.length; j++) {
                if(arr1[j] % num = 0)
                {
                    break;
                }
            }
            if (=arr1.length)
            {
                GCD= true;                
            }
            if (GCD) { // 최대공약수일 때
                for (=0; j<arr2.length; j++) {
                    if(arr2[j] % num= 0)
                    {
                        break;
                    }
                }
                if(j= arr2.length)
                    return num;
            }
        }
        return 0;
    }
    
    public int solution(int[] arrayA, int[] arrayB) {
        int answer= 0;
        int 철수;
        int 영희;
        Arrays.sort(arrayA);
        Arrays.sort(arrayB);
        
        // 각자의 최대공약수
        철수 = problem(arrayA, arrayB);
        영희 = problem(arrayB, arrayA);
        answer= 철수 > 영희 ? 철수 : 영희;
        return answer;
    }
    
}

댓글

댓글을 불러오는 중...