🤣 나의 풀이
아래 코드로 풀이하면 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 구문으로 작성했을 때는 출력문이 두 개씩 나와서 난감했는데, 이런 식으로 외부의 변수를 선언하고 그 값을 변경하는 식으로 활용하면 되는 것을 배웠다.
'📓 Study > Coding Test' 카테고리의 다른 글
[Algorithm Jobs] 소수 판별 (0) | 2021.11.10 |
---|---|
[Algorithm Jobs] 윷놀이 (0) | 2021.11.10 |
[Programmers/JAVA] 자연수 뒤집어 배열로 만들기 (0) | 2021.10.25 |
[Programmers/JAVA] 평균 구하기 (0) | 2021.09.24 |
[Programmers/JAVA] 핸드폰 번호 가리기 (0) | 2021.09.23 |
댓글