상세 컨텐츠

본문 제목

숫자 카드 나누기 (연습문제)

프로그래머스 코딩테스트 풀이

by 발발개발 2022. 12. 12. 10:58

본문

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

 

프로그래머스

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

programmers.co.kr

 

풀이

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

class Solution {
    public int solution(int[] arrayA, int[] arrayB) {
        Set<Integer> divideSetA = new HashSet<>();
        Set<Integer> divideSetB = new HashSet<>();

        Arrays.sort(arrayA);
        Arrays.sort(arrayB);

        for (int divide = 2; divide <= arrayA[0]; divide++) {
            if (arrayA[0] % divide == 0) {
                divideSetA.add(divide);
            }
        }

        for (int divide = 2; divide <= arrayB[0]; divide++) {
            if (arrayB[0] % divide == 0) {
                divideSetB.add(divide);
            }
        }

        Set<Integer> removeSetA = new HashSet<>();
        Set<Integer> removeSetB = new HashSet<>();

        for (int i = 1; i < arrayA.length; i++) {
            for (int divide : divideSetA) {
                if (arrayA[i] % divide != 0) {
                    removeSetA.add(divide);
                }
            }

            for (int divide : divideSetB) {
                if (arrayB[i] % divide != 0) {
                    removeSetB.add(divide);
                }
            }
        }

        for (int remove : removeSetA) {
            divideSetA.remove(remove);
        }

        for (int remove : removeSetB) {
            divideSetB.remove(remove);
        }

        int max = 0;

        max = getMax(arrayB, divideSetA, max);
        max = getMax(arrayA, divideSetB, max);

        return max;
    }

    private int getMax(int[] array, Set<Integer> divideSet, int max) {
        for (int divide : divideSet.stream().sorted((o1, o2) -> o2 - o1).collect(Collectors.toList())) {
            int cnt = 0;

            for (int num : array) {
                if (num % divide == 0) {
                    break;
                } else {
                    cnt++;
                }
            }

            if (cnt == array.length) {
                max = Math.max(max, divide);
                break;
            }
        }

        return max;
    }
}

관련글 더보기

댓글 영역