https://school.programmers.co.kr/learn/courses/30/lessons/120808
++++++++++++++++++++
#include <bits/stdc++.h>
using namespace std;
vector<int> solution(int numer1, int denom1, int numer2, int denom2) {
int a= numer1*denom2+numer2*denom1;
int b=denom1*denom2;
vector<int> answer={(a)/gcd(a,b), b/gcd(a,b)};
return answer;
}
기약분수이기 때문에 gcd() 로 나누어야 된다는 생각이 들었고, 처음에는 gcd()를 직접 구현할까 했는데, 내장함수가 있다는걸 기억해서
gcd() 함수를 헤더를 추가해서 사용하게 되었다. math 헤더에 있는것으로 기억한다. 지금의 경우는 기억해서 gcd() 함수를 사용하였는데, 기억이 안나면 gcd의 정의를 이용해서 직접 구현하여서라도 사용해서 풀도록 하자
+++++++++++++++++++
유클리드 호제법을 이용하여서 gcd를 정의해서 푸는 방법의 경우는,
#include <string>
#include <vector>
using namespace std;
int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);
}
vector<int> solution(int denum1, int num1, int denum2, int num2) {
vector<int> answer;
int lcm=num1*num2/gcd(num1,num2);
denum1*=(lcm/num1);
denum2*=(lcm/num2);
int sum_denum=denum1+denum2;
int gcd_=gcd(sum_denum,lcm);
answer.push_back(sum_denum/gcd_);
answer.push_back(lcm/gcd_);
return answer;
}
이와같은 코드를 작성할 수 있다.
또는 gcd를 이용하지 않고,
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int denum1, int num1, int denum2, int num2) {
vector<int> answer;
int denum = (denum1 * num2) + (denum2 * num1);
int num = num1 * num2;
for(int i = min(denum, num); i >= 2 ; i--)
{
if(denum % i == 0 && num % i == 0)
{
denum /= i;
num /= i;
break;
}
}
answer.push_back(denum);
answer.push_back(num);
return answer;
}
이와같이 나누어지도록 만들수도 있다.
하지만 그냥 math 헤더에 있는 gcd를 이용하는 풀이가 더욱 간결하다고 느껴진다.
==========================================================
<배열이라고 주는 문제의 표현에 대한 의문점에 관하여>
==========================================================
처음 프로그래머스 문제를 통해서 접하게 됐을때부터 이해가 잘 안가던 형태로, 배열을 주었다고 하면서 vector를 주는것에 대해서 한번 시험겸 해서 array를 넘겨주고 return도 그렇게 해볼까 한다.
일단 가장 처음 형태는 아래와 같다.
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int numer1, int denom1, int numer2, int denom2) {
vector<int> answer;
return answer;
}
gpt에서 위와 같은 힌트를 얻어서 코드를 작성해보았다.
작성한 코드는 아래와 같다.
#include <bits/stdc++.h>
using namespace std;
array<int,2> solution(int numer1, int denom1, int numer2, int denom2) {
array<int,2> answer ={ numer1*denom2 + numer2*denom1 , denom1*denom2};
return answer;
}
이러한 코드를 제출했을때 얻게되는 내용은.
일단은 이정도까지 해보았다.
배열이라고 제시하고 vector를 주는 부분에 대해서 vector를 배열이라고 할 수 있는지에 대해서 gpt에 질문해보고 답을 받아보았다.
결론적으로 array를 이용하는 경우는 까다로우니 문제에서 배열이라고 주고, vector로 반환값을 제시해주는 문제 형태를 만나면
동적배열인 vector를 떠올려서 이를 활용한 풀이를 생각해보도록 하자.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Lv.0 나머지 구하기 (0) | 2023.09.12 |
---|---|
Lv.0 배열 두 배 만들기 (0) | 2023.09.12 |
Lv.0 숫자 비교하기 (0) | 2023.09.12 |
Lv.0 두 수의 나눗셈 (0) | 2023.09.12 |
Lv.0 몫 구하기 (0) | 2023.09.12 |