Devtraces
개발자취
Devtraces
전체 방문자
오늘
어제
  • 분류 전체보기
    • Baekjoon
    • Programmers

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • BFS
  • level3
  • Set
  • programmers
  • greedy
  • 백준
  • map
  • Matrix
  • binary search
  • recursive
  • math
  • Dijkstra
  • Trie
  • two pointer
  • Queue
  • PriorityQueue
  • GCD
  • stack
  • union-find
  • floyd-warshall
  • level2
  • level4
  • DP
  • dfs
  • 그리디 알고리즘
  • Tree
  • prime number
  • sort
  • java
  • Kakao

최근 댓글

최근 글

티스토리

Devtraces
[프로그래머스 Level.2] 숫자 카드 나누기 (연습문제) (Java)
Programmers

[프로그래머스 Level.2] 숫자 카드 나누기 (연습문제) (Java)

2022. 11. 16. 16:54

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/135807

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

코딩테스트 연습 > 연습문제 > 숫자 카드 나누기

 

 

 

문제 설명

 

 

철수와 영희는 선생님으로부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 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
  • arrayA와 arrayB에는 중복된 원소가 있을 수 있습니다.

 


 

입출력 예

 

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 합니다.

 

 

 

나의 코드

import java.util.*;

class Solution {
    int answer = 0;
    public int solution(int[] arrayA, int[] arrayB) {
        
        int gcdA = arrayA[0];
        for(int i=1; i<arrayA.length; i++)
            gcdA = findGcd(gcdA, arrayA[i]);
        
        int gcdB = arrayB[0];
        for(int i=1; i<arrayB.length; i++)
            gcdB = findGcd(gcdB, arrayB[i]);
        
        if(gcdA == 1 && gcdB == 1)
            return 0;
        
        // 조건1의 경우 : 철수 기준
        // arrayA의 최대공약수를 구한 뒤 최대공약수의 약수들의 집합을 구함
        // 이 집합들로 arrayB를 전부 돌아 나눠지는게 없으면 Math.max 비교로 넣음
        ruleCheck(gcdA, arrayB);
        
        
        // 조건2의 경우 : 영희 기준
        // arrayB의 최대공약수를 구한 뒤 최대공약수의 약수들의 집합을 구함
        // 이 집합들로 arrayA를 전부 돌아 나눠지는게 없으면 Math.max 비교로 넣음
        ruleCheck(gcdB, arrayA);
        
        return answer;
    }
    
    public void ruleCheck(int gcd, int[] array) {
        ArrayList<Integer> list = new ArrayList<>();

        for(int i=2; i<=gcd; i++) {
            if(gcd % i == 0)
                list.add(i);
        }

        boolean flag = true;

        for(int i=list.size()-1; i>=0; i--) {
            for(int j=0; j<array.length; j++) {
                if(array[j] % list.get(i) == 0) {
                    flag = false;
                    break;
                }
            }

            if(flag) {
                answer = Math.max(answer, list.get(i));
                break;
            }
        }
    }
    
    public int findGcd(int a, int b) {
        int r = a % b;
        
        if(r == 0)
            return b;
        else
            return findGcd(b, r);
    }
    
}

 

 

풀이

  1. 우선 arrayA의 모든 숫자의 최대공약수를 구한다.
  2. 이 arrayA의 최대공약수의 약수들이 arrayA의 모든 수를 나눌 수 있는 수이다. 
  3. 그리고 이 약수들로 arrayB의 모든 수를 나눌 수 없는지 확인하면 된다.
  4. 마찬가지로 arrayB의 모든 숫자의 최대공약수를 구한 뒤에 똑같이 확인해주면 된다.

 

 

 

'Programmers' 카테고리의 다른 글

[프로그래머스 Level.2] 카펫 (완전탐색) (Java)  (0) 2022.11.16
[프로그래머스 Level.2] 올바른 괄호 (스택/큐) (Java)  (0) 2022.11.16
[프로그래머스 Level.2] 가장 큰 정사각형 찾기 (연습문제) (Java)  (0) 2022.11.08
[프로그래머스 Level.2] N-Queen (연습문제) (Java)  (0) 2022.11.07
[프로그래머스 Level.2] 3 x n 타일링 (연습문제) (Java)  (0) 2022.11.07
    'Programmers' 카테고리의 다른 글
    • [프로그래머스 Level.2] 카펫 (완전탐색) (Java)
    • [프로그래머스 Level.2] 올바른 괄호 (스택/큐) (Java)
    • [프로그래머스 Level.2] 가장 큰 정사각형 찾기 (연습문제) (Java)
    • [프로그래머스 Level.2] N-Queen (연습문제) (Java)
    Devtraces
    Devtraces

    티스토리툴바