Ex) Level1 - 서울에서 김서방 찾기
find() 함수를 이용해서 나온 Iterator를 가지고, Iterator 간의 합차를 이용하면 인덱스를 얻을 수 있다.
<hide/>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(vector<string> seoul) {
string answer = "";
answer += "김서방은 ";
size_t uIndex = find(seoul.begin(), seoul.end(), "Kim") - seoul.begin();
answer += to_string(uIndex) + "에 있다";
return answer;
}
Ex) Level1 - 나누어 떨어지는 숫자 배열
<hide/>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr, int divisor) {
vector<int> answer;
size_t uSizeOfArr = arr.size();
answer.reserve(uSizeOfArr);
for (size_t i = 0; i < uSizeOfArr; ++i)
{
if (arr[i] % divisor == 0)
{
answer.push_back(arr[i]);
}
}
if (true == answer.empty())
{
answer.push_back(-1);
}
else
{
sort(answer.begin(), answer.end());
}
return answer;
}
Ex) Level1 - 핸드폰 번호 가리기
<hide/>
#include <string>
#include <vector>
using namespace std;
#define LAST_NUMBER_COUNT (4)
string solution(string phone_number) {
string answer = "";
string strStars = "";
size_t uSizeOfPhoneNumber = phone_number.size();
for (size_t i = 0 ; i < uSizeOfPhoneNumber - LAST_NUMBER_COUNT; ++i)
{
strStars += "*";
}
answer = phone_number.replace(phone_number.begin(), phone_number.end() - LAST_NUMBER_COUNT, strStars);
return answer;
}
Ex) Level1 - 제일 작은 수 제거하기
min_element()는 algorithm 헤더에 있다.
반환 자료형이 Iterator다.
<hide/>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr) {
vector<int> answer;
if (1u == arr.size())
{
answer.push_back(-1);
return answer;
}
size_t uSizeOfArr = arr.size();
answer.reserve(uSizeOfArr - 1);
int iMin = *min_element(arr.begin(), arr.end());
for (size_t i = 0; i < uSizeOfArr; ++i)
{
if (iMin == arr[i])
{
continue;
}
answer.push_back(arr[i]);
}
return answer;
}
Ex) Level1 - 음양 더하기
부호 반복문을 돌면서 바로 누적합 했어도 되네..
<hide/>
#include <string>
#include <vector>
#include <numeric>
using namespace std;
int solution(vector<int> absolutes, vector<bool> signs) {
int answer = 0;
size_t uSizeOfAbsolutes = absolutes.size();
for (size_t i = 0; i < uSizeOfAbsolutes; ++i)
{
if (false == signs[i])
{
absolutes[i] *= -1;
}
}
answer = accumulate(absolutes.begin(), absolutes.end(), 0);
return answer;
}
Ex) Level1 - 없는 숫자 더하기
<hide/>
#include <string>
#include <vector>
#include <numeric>
using namespace std;
#define SUM_MAX (45)
int solution(vector<int> numbers) {
int answer = -1;
answer = SUM_MAX - accumulate(numbers.begin(), numbers.end(), 0);
return answer;
}
Ex) Level1 - 가운데 글자 가져오기
<hide/>
#include <string>
#include <vector>
using namespace std;
string solution(string s) {
string answer = "";
int iSizeOfS = s.size();
if (iSizeOfS % 2 == 1)
{
answer += s[iSizeOfS / 2];
}
else
{
answer += s[iSizeOfS / 2 - 1];
answer += s[iSizeOfS / 2];
}
return answer;
}
Ex) Level1 - 수박수박수?
<hide/>
#include <string>
#include <vector>
using namespace std;
string solution(int n) {
string answer = "";
int iFlip = 1;
for (int i = 0; i < n; ++i)
{
if (1 == iFlip)
{
answer += "수";
}
else
{
answer += "박";
}
iFlip *= -1;
}
return answer;
}
Ex) Level1 - 내적
numeric 헤더에 inner_product() 함수가 있음.
accumulate() 함수와 사용법이 유사함. outter_product()는 없더라..
<hide/>
#include <string>
#include <vector>
#include <numeric>
using namespace std;
int solution(vector<int> a, vector<int> b) {
int answer = inner_product(a.begin(), a.end(), b.begin(), 0);
return answer;
}
Ex) Level1 - 문자열 내림차순으로 배치하기
<hide/>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string s) {
string answer = "";
sort(s.begin(), s.end(), [](char a, char b) {
return a > b;
});
answer = s;
return answer;
}
Ex) Level1 - 약수의 개수와 덧셈
<hide/>
#include <string>
#include <vector>
using namespace std;
size_t CalculateDivisorCount(int _iN)
{
size_t uCount = 0u;
for (int i = 1; i * i <= _iN; ++i)
{
if (_iN % i == 0)
{
++uCount;
if (i != _iN / i)
{
++uCount;
}
}
}
return uCount;
}
int solution(int left, int right) {
int answer = 0;
for (int i = left; i <= right; ++i)
{
if (CalculateDivisorCount(i) % 2 == 0)
{
answer += i;
}
else
{
answer -= i;
}
}
return answer;
}
Ex) Level1 - 문자열 다루기 기본
문제가 좀 이상함. 문자열 길이가 4 또는 6..?
<hide/>
#include <string>
#include <vector>
using namespace std;
bool solution(string s) {
bool answer = true;
size_t uSizeOfS = s.size();
if (4 != uSizeOfS && 6 != uSizeOfS)
{
answer = false;
return answer;
}
for (size_t i = 0; i < uSizeOfS; ++i)
{
if ('0' <= s[i] && s[i] <= '9')
{
continue;
}
else
{
answer = false;
break;
}
}
return answer;
}
Ex) Level1 - 부족한 금액 계산하기
반복문으로 풀면 풀 수 있을 것 같은데, 내 생각에 등차수열의 합 공식으로
훨씬 빠르게 구할 수 있을 것 같다. 근데, Sn 공식이 자꾸 틀린건지.. 안풀림.. 나중에 토론해보는걸로.
<hide/>
using namespace std;
long long solution(int price, int money, int count)
{
long long answer;
long long n = count;
long long a = price;
long long d = price;
long long an = a + (n - 1) * d;
long long llSn = (n / 2) * (a + an);
if (money < llSn)
{
answer = llSn - static_cast<long long>(money);
}
else
{
answer = 0;
}
return answer;
}
Ex) Level1 - 행렬의 덧셈
<hide/>
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer;
size_t uRowSize = arr1.size();
size_t uColumnSize = arr1[0].size();
answer.resize(uRowSize, vector<int>(uColumnSize, 0));
for (size_t i = 0; i < uRowSize; ++i)
{
for (size_t j = 0; j < uColumnSize; ++j)
{
answer[i][j] = arr1[i][j] + arr2[i][j];
}
}
return answer;
}
Ex) Level1 - 직사각형 별찍기
오래간만에 별찍기..!
<hide/>
#include <iostream>
using namespace std;
int main(void) {
int a;
int b;
cin >> a >> b;
for (int i = 0; i < b; ++i)
{
for (int j = 0; j < a; ++j)
{
cout << '*';
}
cout << endl;
}
return 0;
}
Ex) Level1 - 최대공약수와 최소공배수
최소공배수는 굳이 구할 필요가 없음. 최대공약수만 잘 구해주면 됨.
<hide/>
#include <string>
#include <vector>
using namespace std;
#define ANSWER_SIZE (2)
int GetGCD(int _iN, int _iM)
{
int iRemain;
while (0 != _iM)
{
iRemain = _iN % _iM;
_iN = _iM;
_iM = iRemain;
}
return _iN;
}
vector<int> solution(int n, int m) {
vector<int> answer;
answer.reserve(ANSWER_SIZE);
int iGCD = GetGCD(n, m);
answer.push_back(iGCD);
int iLCM = (n / iGCD) * (m / iGCD) * iGCD;
answer.push_back(iLCM);
return answer;
}
Ex) Level1 - 같은 숫자는 싫어
스택/큐 카테고리인데, 왜 스택/큐인지..?
algorithm 헤더의 unique() 함수를 사용하면 빠르게 풀 수 있을듯.
다만 unique() 함수의 반환값이 중복 값들의 시작 위치를 가리킴.
따라서 erase() 함수로 한 번 지워줘야함.
<hide/>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr)
{
vector<int> answer;
size_t uSizeOfArr = arr.size();
answer.reserve(uSizeOfArr);
vector<int>::iterator iterBeginOfDuplicate = unique(arr.begin(), arr.end());
arr.erase(iterBeginOfDuplicate, arr.end());
answer = arr;
/*
answer.push_back(arr[0]);
for (size_t i = 1; i < uSizeOfArr; ++i)
{
if (arr[i] != arr[i - 1])
{
answer.push_back(arr[i]);
}
}
*/
return answer;
}
댓글