TIL_250424

듀듀·2025년 4월 24일

spring_TIL

목록 보기
49/53

숫자 카드 나누기

링크텍스트


문제 설명

  1. A, B 배열 각각의 최대공약수를 구한다.

  2. 각 최대 공약수가 상대방의 배열의 모든 수와 나눴을 때, 딱 떨어지지 않으면 조건을 지킨것이다.

  3. 조건을 지킨 쪽의 최대공약수를 반환하되, 둘 다 조건을 지켰을 경우 더 큰 값을 반환한다. 둘 다 조건을 지키지 않았을 경우 0을 반환한다.

입출력 예로 이해해보자

1번 입출력
A:[10,17]의 최대공약수는 1, B:[5,20]의 최대공약수는 5이다.
A의 최대공약수인 1은 B의 배열에서 모두 나누어 떨어진다. 그러므로 A는 조건을 지키지 못했다.
B의 최대공약수인 5는 A의 배열에서 10에서 나누어 떨어진다. 그러므로 B는 조건을 지키지 못했다.
0을 반환.

2번 입출력
A:[10,20]의 최대공약수는 10, B:[5,17]의 최대공약수는 1이다.
A의 최대공약수인 10은 B의 배열 모두에서 나누어 떨어지지 않는다. 그러므로 A는 조건을 지켰다.
B의 최대공약수인 1은 A의 배열에서 모두 나누어 떨어진다. 그러므로 B는 조건을 지키지 못했다.
A의 최대공약수인 10을 반환.

3번 입출력
A[14,35,119]의 최대공약수는 7, B:[18,30,102]의 최대공약수는 3이다.
A의 최대공약수인 7은 B의 모든 배열에서 나누어 떨어지지 않는다. 그러므로 A는 조건을 지켰다.
B의 최대공약수인 3은 A의 모든 배열에서 나누어 떨어지지 않는다. 그러므로 B는 조건을 지켰다.
A와 B 둘 다 조건을 지켰으므로 그 중 큰 수인 7을 반환.


시행착오 및 문제 풀이

풀이

  1. A와 B 배열의 최대공약수를 구한다. 이때, 처음 값을 넣어주고 시작했으므로 for문은 1부터 돈다.

  2. 조건 판단
    2-1. A의 최대공약수가 B에서 하나라도 나누어 떨어지면 A 조건 실패
    2-2. B의 최대공약수가 A에서 하나라도 나누어 떨어지면 B 조건 실패

  3. 조건에 따라 값 반환
    3-1. 둘 다 조건을 만족한다면 두 최대공약수 중 큰 수 반환
    3-2. a가 조건을 만족했다면 a 반환
    3-3. b가 조건을 만족했다면 b 반환
    3-4. 둘 다 조건을 만족하지 못했다면 0 반환


오답 코드

//최대공약수
import java.util.*;
class Solution {
    public int solution(int[] arrayA, int[] arrayB) {
        int answer = 0;
        
        int ans_a = arrayA[0];
        int ans_b = arrayB[0];
        
        for(int i=1; i<arrayA.length; i++) {
            //a,b의 최대공약수
            ans_a = gcd(ans_a, arrayA[i]);
            ans_b = gcd(ans_b, arrayB[i]);
        }
        
        boolean check_a = false;
        boolean check_b = false;
        
        //A의 최대공약수가 B에서 나누어 떨어지지 않으면
        for(int i=0; i<arrayB.length; i++) {
            if(arrayB[i] % ans_a != 0) {
                check_b = true;
            }
        }
        
        //B의 최대공약수가 A에서 나누어 떨어지지 않으면
        for(int i=0; i<arrayA.length; i++) {
            if(arrayA[i] % ans_b != 0) {
                check_a = true;
            }
        }
        
        if(check_b) {
            answer = ans_a;
        }
        else if(check_a) {
            answer = ans_b;
        }
        //둘 다 조건을 만족하지 않는다면
        else if(!check_a && !check_b) {
            answer = 0;
        }
        //둘 다 조건을 만족한다면
        else {
            answer = Math.max(ans_a, ans_b);
        }
        
        return answer;
    }
    
    //최대공약수
    public int gcd(int a, int b) {
        if(b==0) {
            return a;
        }
        return gcd(b,a%b);
    }
}
테스트 1
입력값 〉	[10, 17], [5, 20]
기댓값 〉	0
실행 결과 〉	실행한 결괏값 5이 기댓값 0과 다릅니다.
테스트 2
입력값 〉	[10, 20], [5, 17]
기댓값 〉	10
실행 결과 〉	테스트를 통과하였습니다.
테스트 3
입력값 〉	[14, 35, 119], [18, 30, 102]
기댓값 〉	7
실행 결과 〉	테스트를 통과하였습니다.
테스트 결과 (~˘▾˘)~
3개 중 2개 성공

오답 이유

아아! 이건 내가 조건을 잘못 이해했다! ㅇㅋㅇㅋ 수정할게


오답 코드

//최대공약수
import java.util.*;
class Solution {
    public int solution(int[] arrayA, int[] arrayB) {
        int answer = 0;
        
        //처음 값
        int ans_a = arrayA[0];
        int ans_b = arrayB[0];
        
        for(int i=0; i<arrayA.length; i++) {
            //a,b의 최대공약수
            ans_a = gcd(ans_a, arrayA[i]);
            ans_b = gcd(ans_b, arrayB[i]);
        }
        
        boolean check_a = true;
        boolean check_b = true;
        
        //A의 최대공약수가 B에서 하나라도 나누어 떨어지면
        for(int i=0; i<arrayB.length; i++) {
            if(arrayB[i] % ans_a == 0) {
                //a의 조건 실패
                check_a = false;
                break;
            }
        }
        
        //B의 최대공약수가 A에서 하나라도 나누어 떨어지면
        for(int i=0; i<arrayA.length; i++) {
            if(arrayA[i] % ans_b == 0) {
                //b의 조건 실패
                check_b = false;
                break;
            }
        }
        
        //a가 조건을 만족했다면 a 반환
        if(check_a) {
            answer = ans_a;
        }
        //b가 조건을 만족했다면 b 반환
        else if(check_b) {
            answer = ans_b;
        }
        //둘 다 조건을 만족한다면 a와 b중 큰 값 반환
        else if(check_a && check_b) {
            answer = Math.max(ans_a, ans_b);
        }
        else {
            answer = 0;
        }
        
        return answer;
    }
    
    //최대공약수
    public int gcd(int a, int b) {
        if(b==0) {
            return a;
        }
        return gcd(b,a%b);
    }
}

77.8 넌 또 뭐야

오답 이유

//a가 조건을 만족했다면 a 반환
        if(check_a) {
            answer = ans_a;
        }
        //b가 조건을 만족했다면 b 반환
        else if(check_b) {
            answer = ans_b;
        }
        //둘 다 조건을 만족한다면 a와 b중 큰 값 반환
        else if(check_a && check_b) {
            answer = Math.max(ans_a, ans_b);
        }
        else {
            answer = 0;
        }

여기가 틀렸다.
A의 조건과 B의 조건이 둘 다 만족했는데 A의 조건 먼저 판단해버리면 A의 값이 반환되어버린다. 이때 B의 값이 더 크면 틀린다.
그러므로 A와 B의 조건을 함께 판단하는 것을 먼저 해야 한다. ㅇㅋㅇㅋ 수정할게


정답 코드

//최대공약수
import java.util.*;
class Solution {
    public int solution(int[] arrayA, int[] arrayB) {
        int answer = 0;
        
        //처음 값
        int ans_a = arrayA[0];
        int ans_b = arrayB[0];
        
        for(int i=1; i<arrayA.length; i++) {
            //a,b의 최대공약수
            ans_a = gcd(ans_a, arrayA[i]);
            ans_b = gcd(ans_b, arrayB[i]);
        }
        
        boolean check_a = true;
        boolean check_b = true;
        
        //A의 최대공약수가 B에서 하나라도 나누어 떨어지면
        for(int i=0; i<arrayB.length; i++) {
            if(arrayB[i] % ans_a == 0) {
                //a의 조건 실패
                check_a = false;
                break;
            }
        }
        
        //B의 최대공약수가 A에서 하나라도 나누어 떨어지면
        for(int i=0; i<arrayA.length; i++) {
            if(arrayA[i] % ans_b == 0) {
                //b의 조건 실패
                check_b = false;
                break;
            }
        }
        
        //둘 다 조건을 만족한다면 a와 b중 큰 값 반환 (check_a와 check_b를 제일 먼저 확인해주어야 한다)
        if(check_a && check_b) {
            answer = Math.max(ans_a, ans_b);
        }
        //a가 조건을 만족했다면 a 반환
        else if(check_a) {
            answer = ans_a;
        }
        //b가 조건을 만족했다면 b 반환
        else if(check_b) {
            answer = ans_b;
        }
        else {
            answer = 0;
        }
        
        return answer;
    }
    
    //최대공약수
    public int gcd(int a, int b) {
        if(b==0) {
            return a;
        }
        return gcd(b,a%b);
    }
}

정답!
문제의 핵심인 최대공약수를 바로 알아챘다. 건 좀 뿌듯한데 최대공약수 저 쉬운 코드가 왜 매번 작성할때마다 헷갈려서 연습장에 18, 30... 이런거 적으면서 푸는지..ㅜㅜㅜ

0개의 댓글