성능 요약
메모리: 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
풀이
javaimport 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; } }