[Algorithm Jobs] 약수 구하기 오답 노트

    🤣 나의 풀이

     

    아래 코드로 풀이하면 30점이 나온다.

     

    ✔ 굳이 배열을 사용할 이유가 있었을까? 

    ✔ 테스트 케이스 하나를 기준으로 생각하지 말고 다양한 테스트 케이스를 생각해보고 그에 맞는 로직 짜 보자.

    ✔  조건식(int i=1;i <=n), (n% i==0)을 잘 세웠다. 

    import java.util.Scanner;
    public class Main{
         public static void main(String[]args){
            // 사용자에게 값을 입력 받는다.
            Scanner sc = new Scanner(System.in);
    
            // 약수 n
            int n = sc.nextInt();
    
            // k번째로 작은 수
            int k = sc.nextInt();
    
            int [] arr = new int[n+1];
    
            for(int i=1;i<=n;i++){
                if(n%i==0) arr[i] = i;
            }
            if(arr.length < k) System.out.print(0);
            if(arr.length > k ) System.out.print(arr[k]);
        }
    }

     

     

    💡 풀이 아이디어

    n이 주어졌을 때 숫자 n의 약수를 구하다가 k번째 약수만 구하면 되는 문제이다.
    약수를 모두 다 구할 필요는 없고 k번째 약수만 구하면 된다.

     

    1. 작은 약수부터 구하기

    2. 구하는 약수가 몇 번째 인가?

     

    🔥 모범 답안

    package com.practice;
    
    import java.util.Scanner;
    
    public class Pre_09 {
       
        public static void main(String[]args){
            // 사용자에게 값을 입력 받는다.
            Scanner sc = new Scanner(System.in);
    
            // 약수 n
            int n = sc.nextInt();
            
            // k번째로 작은 수
            int k = sc.nextInt();
    
            int count = 0; // 몇 번째 약수인가?를 확인하는 용도
            int flag = 0; // if문 안에 들어갔는지 아닌지를 확인하는 용도
    
            for(int i=1;i<=n;i++){
                if(n%i==0) {// n은 i의 배수인가? == i는 n의 약수이다.
                    count++; // i는 count번째 약수이다.
                    if(count == k){ // 10의 약수 1,2,5,10인 k의 개수는 4만 나와야한다.
                        System.out.println(i); // 
                        flag = 1; 
                    }
                }
            }
            if(flag == 0){
                System.out.println(0);
            }
        }
    
    }

     

    📝 해설

     

    1. 만약 10의 약수 중 4번째 숫자를 구하려고 한다면, 10% i == 0 인 값들이 조건식 안으로 들어오게 된다.

    2. i의 값인 1,2,5,10이 조건식 안으로 들어오게 되고, 이때 count가 증가된다.

    3. 만약 k의 값이 4라면 count == k가 일치하므로 1,2,5,10에서 4번째 i의 값인 10을 출력하게 되는 것이다.

       k의 값이 3이라면 3번째 i의 값인 5를 출력하게 된다.

    4. 이어서 flag를 1로 변경한다.

       왜? (== 4번째 값을 뽑았다. == 이 조건식이 수행되었다.== 이 조건식이 수행되지 않았을 때 flag의 값은 0이다. ==  count!= k  ==       즉, k는 약수의 개수를 초과했다.)

    5. 만약 flag의 값이 0이라면 조건식이 수행되지 않고 0이 출력된다.

        10의 약수는 1,2,5,10으로  약수의 개수는 총 4개인데 만약 5번째 약수를 구하라고 한다면 count == k가 아니므로 조건식 안으로 들어가지 못하고 flag = 1로 변경되지 않아서 0이 출력되는 것이다. 

     



    🌱 TIL

     

    if문이 실행되었는지 확인하는 용도인 flag를 변수로 선언한 부분이 인상적이었다. 

    if ~ else 구문으로 작성했을 때는 출력문이 두 개씩 나와서 난감했는데, 이런 식으로 외부의 변수를 선언하고 그 값을 변경하는 식으로 활용하면 되는 것을 배웠다.

     

     

    728x90

    댓글