본문 바로가기
C++/프로그래머스 문제풀이

23-01-19

by GameStudy 2023. 1. 19.

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;
}

'C++ > 프로그래머스 문제풀이' 카테고리의 다른 글

23-02-02  (0) 2023.02.02
23-01-20  (0) 2023.01.20
23-01-18  (0) 2023.01.18
23-01-17  (0) 2023.01.17
23-01-16  (0) 2023.01.16

댓글