반응형
문제 설명
소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.
- 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.
제한사항
- a, b는 정수
- 0 < a ≤ 1,000
- 0 < b ≤ 1,000
첫 번째로, a와 b의 최대공약수를 구하는 코드를 작성한다. 그 후 a와 b를 최대공약수로 나누면, 기약분수가 된다.
이제 b를 소인수분해 했을 때, 2와 5만 존재하면 1을 리턴, 그게 아니라면 2를 리턴하면 되는데, sort된 소인수 배열을 구하고 string에 소인수를 덧셈연산해서 2,5,25를 조건부에 추가해 주는 방식으로 구현하였다.
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public int solution(int a, int b) {
int gongyaksoo = 0;
for(int i = 1; i<=a;i++) if(a%i==0) for (int j = 1; j <= b; j++) if(b%j==0) if(i==j) gongyaksoo=i;
b/=gongyaksoo;
if(b==1)return 1;
int[] primeFactor = prime_factor(b);
String pf_str = "";
Arrays.sort(primeFactor);
for(int pf : primeFactor)pf_str+=pf;
if(pf_str.equals("2")||pf_str.equals("5")||pf_str.equals("25")) return 1;
else return 2;
}
static int[] prime_factor(int n){
ArrayList<Integer> arr = new ArrayList<>();
for(int i = 2;i<=n;i++) {
int primeNumberCount=0;
for(int j = 2;j<i;j++) if(i%j==0)primeNumberCount++;
if(n%i==0&&primeNumberCount==0) {
n/=i;
if(!arr.contains(i))arr.add(i);
}
}
return arr.stream().mapToInt(i -> i).toArray();
}
}
반응형
'코딩테스트 > Programmers_LV0' 카테고리의 다른 글
Programmers_JAVA_저주의 숫자 3 (0) | 2022.11.24 |
---|---|
Programmers_JAVA_컨트롤 제트 (0) | 2022.11.24 |
Programmers_JAVA_직사각형 넓이 구하기 (0) | 2022.11.23 |
Programmers_JAVA_삼각형의 완성 조건_2 (0) | 2022.11.23 |
Programmers_JAVA_캐릭터의 좌표 (0) | 2022.11.23 |