알고리즘/프로그래머스 Level2

[프로그래머스,Java] Level2: 숫자 카드 나누기

류창 2022. 11. 24. 19:03

 

문제분석

 

문제 이해가 좀 난해한 문제다.   

 

3줄요약:

1.조건 1에선  철수는 모두 나눌수있고, 영희는 모두 못나누는 최대값 A

2.조건 2에선 영희는 모두 나눌수 있고, 철수는 모두 나눌수있는 최대값 B

3.A와 B중 가장큰 수를 반환

 

제한사항을 보면 알겟지만, 원소의 크기와 길이가 좀..크다.. 

그래서 제일 쉽게 푸는게 반복문이지만  반복문으로 풀다가 효율성 오류 걱정부터햇다.

 

근데 반복문으로해도 효율성 통과가 되더라..

 

 

메소드를 2개 만들었다.

 

첫번째로,   철수나 영희의 배열을 모두 나눌수있는 숫자들을 판별해서 배열로 반환하는 메소드

 

 

두번째 메소드로,  첫번째로 구한 숫자들로 상대방의 숫자들을 나눌수 없는지를 판별한뒤, 가장큰값을 반환한다.

 

 

 

그 뒤,  앞서 정리한 세줄요약대로 로직을 작성한다.

 

 

문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.util.*;
class Solution {
    public int solution(int[] arrayA, int[] arrayB) {
        int answer = 0;
        
        //조건 1
        int[] A = DivideList(arrayA);
        int getA= NotDivide(A,arrayB);
        
        //조건 2
        int[] B = DivideList(arrayB);
        int getB= NotDivide(B,arrayA);
        
        
        return Math.max(getA,getB);
    }
    
    // 모든숫자를 나눌수있는 숫자 리스트
    public int[] DivideList(int[] arr){
        
        Arrays.sort(arr);
        List<Integer> list = new ArrayList<>();
        
        for(int i=arr[0];i>=2;i--){
            for(int j=0;j<arr.length;j++){
                
                if(arr[j]%i!=0){
                    break;
                }
                else{
                    if(j==arr.length-1){
                      list.add(i);   
                    }
                }
            }
        }
        
        return list.stream().mapToInt(i->i).toArray(); 
    }
    
    public int NotDivide(int[] array, int[] target){
        
        List<Integer> list = new ArrayList<>();      
        for(int i=0;i<array.length;i++){
            
            boolean flag=true;
            for(int j=0;j<target.length;j++){
                if(target[j]%array[i]!=0){
                    continue;
                }
                else{
                    flag=false;
                    break;
                }
           }       
            if(flag){
                list.add(array[i]);
            }
        }      
        Collections.sort(list);     
        if(list.size()==0){
            return 0;
        }
        
        return list.get(list.size()-1);
    }
}
cs