C#

[프로그래머스 힌트/답/해석] 유한소수 판별하기

Guk-blog 2024. 1. 30. 15:37
728x90
반응형

힌트

더보기

- 유한 소수는 분모를 최대 약분했을 때 2나 5만 존재해야한다

정답

더보기

방법 1

while(b % 2 == 0) b /= 2;
while(b % 5 == 0) b /= 5;
if(a%b!=0)return 2;
return 1;

방법 2

while(b % 2 == 0) b /= 2;
while(b % 5 == 0) b /= 5;
if(a%b!=0)return 2;
return 1;
for(int i=(a > b ? b : a); i>= 2; i--){
    if(a%i==0 && b%i==0){
        a/=i;
        b/=i;
        break;
    }
}
if(b==1)return 1;
var denomArr = Enumerable.Range(1,b).Where(x=> (b % x == 0 && x != 1 && x % 2 != 0)|| x == 2);
var demArr = denomArr.Where(x=> !denomArr.Any(y=> y != x && x % y == 0));
return demArr.Any(x=> x!=2 && x!= 5) ? 2 : 1;

해석

더보기

 

while(b % 2 == 0) b /= 2;
while(b % 5 == 0) b /= 5;

분모를 2와 5로 나누었을 때 나머지가 0일 경우 계속 반복해서 나누어 준다

if(a%b!=0)return 2;

이후 분자와 분모를 나누었을 때 나머지가 0이 아니면 무한 소수이다

for(int i=(a > b ? b : a); i>= 2; i--)

a와 b 중 작은 수 만큼 반복한다 

if(a%i==0 && b%i==0){
                    a/=i;
                    b/=i;
                    break;
                }

 a와 b 중 작은 수에서 점점 숫자가 1만큼 작아진 값이 a와 b를 나누었을 때 나머지가 0일 경우 해당 수를 나누어 주고 반복을 멈춘다

var denomArr = Enumerable.Range(1,b).Where(x=> (b % x == 0 && x != 1 && x % 2 != 0)|| x == 2);

 1부터 분모의 값 개수만큼 숫자를 만든 뒤 숫자들 중 b를 나누었을 때 나머지가 0이되고 1이 아니며 2의 배수가 아닐 경우 이거나 2인 경우를 저장한다

var demArr = denomArr.Where(x=> !denomArr.Any(y=> y != x && x % y == 0));

 denomArr에 저장한 값들이 같은 숫자가 아니고 다른 숫자와 나누었을 때 나머지가 0이 되지않는 경우에만 저장한다

return demArr .Any(x=> x!=2 && x!= 5) ? 2 : 1;

 demArr에서 2와 5가 아닌 숫자가 존재할 경우 2를, 존재하지 않을 경우 1을 리턴한다

728x90
반응형