posted by REDFORCE 2017. 12. 15. 22:36

자연수로 이루어진 길이가 같은 수열 A,B가 있습니다. 최솟값 만들기는 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱한 값을 누적하여 더합니다. 이러한 과정을 수열의 길이만큼 반복하여 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다.

예를 들어 A = [1, 2] , B = [3, 4] 라면

  1. A에서 1, B에서 4를 뽑아 곱하여 더합니다.
  2. A에서 2, B에서 3을 뽑아 곱하여 더합니다.

수열의 길이만큼 반복하여 최솟값 10을 얻을 수 있으며, 이 10이 최솟값이 됩니다.
수열 A,B가 주어질 때, 최솟값을 반환해주는 getMinSum 함수를 완성하세요.


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int getMinSum(vector<int> A, vector<int> B)
{
int answer = 0;
int forward = 0, backward = 0;
std::sort(A.begin(), A.end());
std::sort(B.begin(), B.end());
int endIndex = A.size();
for (int i = 0; i< endIndex; i++)
{
forward = A[i];
backward = B[endIndex - i - 1];
answer += forward * backward;
}
return answer;
}
int main()
{
vector<int> tA{1,2}, tB{3,4};
//아래는 테스트 출력을 위한 코드입니다.
cout<<getMinSum(tA,tB);
}
view raw main.cpp hosted with ❤ by GitHub

'Programming > C++' 카테고리의 다른 글

프로그래머스 Level 1.약수의 합  (0) 2017.12.15
알고리즘 문제 예제 4  (0) 2017.12.06
알고리즘 문제 예제 3  (0) 2017.12.06
알고리즘 문제 예제 2  (0) 2017.12.06
알고리즘 문제 예제 1  (0) 2017.12.06
posted by REDFORCE 2017. 12. 15. 22:32

어떤 수를 입력받아 그 수의 약수를 모두 더한 수 sumDivisor 함수를 완성해 보세요. 예를 들어 12가 입력된다면 12의 약수는 [1, 2, 3, 4, 6, 12]가 되고, 총 합은 28이 되므로 28을 반환해 주면 됩니다.


#include<iostream>
using namespace std;
int sumDivisor(int n)
{
int result = 0;
for(int i =1; i <= n; i++)
{
if(n % i == 0)
result += i;
}
return result;
}
int main()
{
int testCase = 10;
int testAnswer = sumDivisor(testCase);
cout<<testAnswer;
}
view raw main.cpp hosted with ❤ by GitHub


'Programming > C++' 카테고리의 다른 글

프로그래머스 Level 2.최솟값 만들기  (0) 2017.12.15
알고리즘 문제 예제 4  (0) 2017.12.06
알고리즘 문제 예제 3  (0) 2017.12.06
알고리즘 문제 예제 2  (0) 2017.12.06
알고리즘 문제 예제 1  (0) 2017.12.06
posted by REDFORCE 2017. 12. 6. 14:39

프로그래머스 Level 1.행렬의 덧셈


문제 ----------------------------------------------------------

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬을 입력받는 sumMatrix 함수를 완성하여 행렬 덧셈의 결과를 반환해 주세요.

예를 들어 2x2 행렬인 A = ((1, 2), (2, 3)), B = ((3, 4), (5, 6)) 가 주어지면, 같은 2x2 행렬인 ((4, 6), (7, 9))를 반환하면 됩니다.(어떠한 행렬에도 대응하는 함수를 완성해주세요.)

----------------------------------------------------------



#include<iostream>
#include<vector>
using namespace std;
vector<vector<int> > sumMatrix(vector<vector<int> >A, vector<vector<int> >B)
{
vector<vector<int>> answer;
for (int i = 0; i < A.size(); i++)
{
std::vector<int> col;
for (int j = 0; j < A[i].size(); j++)
{
int sum = A[i][j] + B[i][j];
col.emplace_back(sum);
}
answer.emplace_back(col);
}
return answer;
}
int main()
{
vector<vector<int> > a{{1,2},{2,3}}, b{{3,4},{5,6}};
vector<vector<int> > answer = sumMatrix(a,b);
for(int i=0;i<answer.size();i++)
{
for(int j=0;j<answer[0].size();j++)
{
cout<<answer[i][j]<<" ";
}
cout<<"\n";
}
}
view raw main.cpp hosted with ❤ by GitHub


posted by REDFORCE 2017. 12. 5. 15:52

최근 여러 곳에 이력서를 넣으면서 프로그래머스를 이용한 온라인 코딩테스트를 제출하는 곳이 여럿 보이길래, 한번 프로그래머스에 나오는 알고리즘 연습 문제들을 풀어보기 시작했습니다.


----------------------------------------------------------


프로그래머스 Level 1.피보나치 수


문제 ----------------------------------------------------------

피보나치 수는 F(0) = 0, F(1) = 1일 때, 2 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 점화식입니다. 2 이상의 n이 입력되었을 때, fibonacci 함수를 제작하여 n번째 피보나치 수를 반환해 주세요. 예를 들어 n = 3이라면 2를 반환해주면 됩니다.

----------------------------------------------------------



재귀함수를 사용하여 간단하게 구할 수 있는 방법이 있지만

시간복잡도가 기하급수적으로 증가하므로


다음과 같이 이전 계산을 기억해두어 계산하는 방법이 있다.



#include<iostream>
using namespace std;
long long fibonacci(int n)
{
long answer = 0;
long a = 0;
long b = 1;
for (int i = 0; i < n; i++)
{
if (i != 0)
{
answer = a + b;
a = b;
b = answer;
}
}
return answer;
}
int main()
{
int testCase = 10;
long long testAnswer = fibonacci(testCase);
cout << testAnswer;
}
view raw main.cpp hosted with ❤ by GitHub