본문 바로가기
코딩테스트/프로그래머스

[연습 문제] 숫자 카드 나누기 - JAVA

by 의정부핵꿀밤 2022. 11. 17.
728x90

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

 

프로그래머스

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

programmers.co.kr


간단한 문젠데 조건을 제대로 읽지 않고 풀어서 조금 헤멨던 문제다...😥

 

난 요 부분 조건이 헷갈렸다

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

예를 들어 철수가 [10, 17]을 갖고 영희가 [5, 20]을 가졌다고 가정해보자

그러면 철수가 가진 카드를 모두 나눌 수 있는 숫자는 없고, 영희가 가진 카드를 모두 나눌 수 있는 숫자는 [5]가 있다

이 때 애초에 철수가 가진 카드를 모두 나눌 수 있는 숫자가 없기 떄문에 위의 조건 중 1번은 성립되지 않는다

그래서 영희가 가진 카드를 모두 나눌 수 있는 숫자인 5가 철수의 카드 [10, 17]을 나눌 수 있는지 확인하면 되는데, 이 때 10은 5로 나눠지니까 답은 0이다

 

암튼 저게 좀 헷갈렸다

 

그래서 문제 풀이 방식은 다음과 같다

 

 

[문제 풀이]

  1. arrayA(철수)와 arrayB(영희)에 대해 각각 해당 배열을 모두 나눌 수 있는 숫자 배열을 구한다 -> getDivisors()
  2. 그리고 구한 숫자 배열로 반복문을 돌면서 철수와 영희의 숫자 카드 중 나눠지는 숫자가 있는지 확인하고, 없다면 그 중의 최댓값을 반환한다
    • arrayA를 모두 나눌 수 있는 숫자 배열을 listA, arrayB를 모두 나눌 수 있는 숫자 배열을 listB라고 한다
    • 이 때 listA와 listB의 원소는 getDivisors()에 의해 오름차순으로 정렬된 값이 들어가 있다
    • 따라서 listA의 뒤의 원소(큰 숫자)부터 arrayB의 원소들이 나눠지는지 확인하고, 모두 나눠지지 않는다면 현재 값이 가장 큰 값이니까 answer로 업데이트한다
    • 위의 과정을 listB와 arrayA에 대해서도 하여 그 중 가장 큰 값을 반환한다

 

 

사실 쉬운 문제였는데 뇌에 힘을 빼고 풀면 방황할 수 있는 문제였따..

(맞아,, 내 얘기야,,,^_ㅠ)

 


자바 코드)

import java.util.*;

class Solution {
    public int solution(int[] arrayA, int[] arrayB) {
        int answer = 0;
        List<Integer> listA = getDivisors(Arrays.stream(arrayA).distinct().toArray());
        List<Integer> listB = getDivisors(Arrays.stream(arrayB).distinct().toArray());

        for(int i=listA.size()-1;i>=0;i--) {
            int a = listA.get(i);
            
            Boolean check = true;
            for(int b : arrayB) {
                if(b%a==0) {
                    check = false;
                    break;
                }
            }
            if(check) {
                answer = a;
                break;
            }
        }
        
        for(int j=listB.size()-1;j>=0;j--) {
            int b = listB.get(j);
            
            Boolean check = true;
            for(int a : arrayA) {
                if(a%b==0) {
                    check = false;
                    break;
                }
            }
        
            if(answer<b && check) {
                answer = b;
                break;
            }   
        }
        return answer;
    }

    // 배열의 원소를 모두 나눌 수 있는 수를 반환하는 메소드
    public List<Integer> getDivisors(int[] array) {
        List<Integer> list = new ArrayList<>();
        Arrays.sort(array);
        int min = array[0];

        for(int i=2;i<=min;i++) {
            Boolean check = true;
            for(int num : array) {
                if(num%i!=0) {
                    check=false;
                    break;
                }
            }
            if(check) {
                list.add(i);
            }
        }

        return list;
    }
}
728x90

댓글