https://school.programmers.co.kr/learn/courses/30/lessons/120878
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <string>
#include <vector>
using namespace std;
int solution(int a, int b) {
int answer = 0;
int coa = a;
int cob = b;
// 기약분수로 바꾸기
for (int i = a; i >= 2; i--)
{
if (coa % i == 0 && cob % i == 0)
{
coa /= i;
cob /= i;
}
}
bool ansch = true;
// 분모의 소인수찾기
for (int i = 2; i <= cob; i++)//인수
{
bool ch = false;
if (cob % i == 0)
{
for (int j = 2; j < i; j++)// 인수 중 소수인지?
{
if (i % j == 0)
{
ch = true;
break;
}
}
// false면 소인수임
if (ch == false)
{
if (i != 2 && i != 5)
ansch = false;
}
}
}
if (ansch == true)return 1;
else return 2;
}
설명
이 문제는 주어진 a, b에 대해서 a/b 분수가 유한소수인지를 판단하는 것이다.
유한소수인지 판단하는 근거는 a/b를 기약분수로 나타냈을 때, b의 소인수가 2,5로만 이루어져있는 것이다.
소인수란 소수인 인수라는 뜻이다.
문제를 푸는 순서는
1. a/b를 기약분수로 나타낸다.
2. b의 소인수를 찾아낸다.
3. 그 소인수 중 2와 5가 아닌 것이 있는지 확인한다.
이다.
int coa = a;
int cob = b;
// 기약분수로 바꾸기
for (int i = a; i >= 2; i--)
{
if (coa % i == 0 && cob % i == 0)
{
coa /= i;
cob /= i;
}
}
변수 coa, cob 에 각각 a,b값을 넣어준다. (원본 값 유지를 위함이다.)
a부터 2까지 차례로 보며 a와 b가 동시에 나눠지는 수가 있는지 확인하며 계속 약분한다.
그럼 기약분수의 분모,분자가 cob,coa가 된다.
bool ansch = true;
// 분모의 소인수찾기
for (int i = 2; i <= cob; i++)//인수
{
bool ch = false;
if (cob % i == 0)
{
for (int j = 2; j < i; j++)// 인수 중 소수인지?
{
if (i % j == 0)
{
ch = true;
break;
}
}
그리고 분모의 소인수를 찾기위해 2부터 cob까지 for문으로 차례로 살펴본다.
cob가 나눠지는 i 중에(인수 중에) 그 i가 소수인지를 j for문으로 2부터 i-1 까지 확인한다.
만약 나누어 떨어지는 수가 있다면 소수가 아닌 것이다.
그래서 소수가 아니면 ch값은 true가 된다.
// false면 소인수임
if (ch == false)
{
if (i != 2 && i != 5)
ansch = false;
}
따라서 ch값이 false면 i는 소인수라는 뜻이고 이 때, i가 2 또는 5인지를 확인하면 된다.
여기서 ansch가 i for문 동안 true 값을 유지한다면 1을 리턴하면 된다.
만약 false값이라면 2를 리턴한다.
'알고리즘 > 프로그래머스 1단계' 카테고리의 다른 글
프로그래머스 - 다항식 더하기 - C++ (0) | 2023.09.19 |
---|---|
프로그래머스 - 연속된 수의 합 - C++ (0) | 2023.09.18 |
프로그래머스 - 옹알이 - C++ (0) | 2023.09.16 |
프로그래머스 - 분수의 덧셈 - C++ (0) | 2023.09.15 |
프로그래머스 - 삼각형의 완성 - C++ (0) | 2023.09.13 |