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

23-01-15

by GameStudy 2023. 1. 15.

Ex) Level0 - 소인수분해 [X]

  두 개의 풀이를 진행해보았으나, 둘다 100점이 아님.

  문제점을 못 찾겠어서 일단 스킵.

<hide/>

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(int n) {
    vector<int> answer;
    
    // 1번 풀이
    for (int i = 2; i <= n; ++i)
    {
        if (n % i == 0)
        {
            answer.push_back(i);
            n /= i;
        }
    }
    
    return answer;
}
<hide/>

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(int n) {
    vector<int> answer;
    
    // 2번 풀이
    vector<int> vDivisors;
    for (int i = 1; i * i <= n; ++i)
    {
        if (n % i == 0)
        {
            vDivisors.push_back(i);
            vDivisors.push_back(n / i);
        }
    }
    
    size_t uSizeOfDivisors = vDivisors.size();
    for (size_t i = 0; i < uSizeOfDivisors; ++i)
    {
        bool IsPrime = true;
        for (int j = 2; j < vDivisors[i]; ++j)
        {
            if (vDivisors[i] % j == 0)
            {
                IsPrime = false;
            }
        }
        if (true == IsPrime && 1 != vDivisors[i])
        {
            answer.push_back(vDivisors[i]);
        }
    }
    
    sort(answer.begin(), answer.end());
    
    return answer;
}

  

 

Ex) Level0 - 영어가 싫어요

  map 초기화 방법을 자꾸 까먹음.

<hide/>

#include <string>
#include <vector>
#include <map>

using namespace std;

#define COMMON_OFFSET (3)

long long solution(string numbers) {
    long long answer = 0;
    
    map<string, int> mStrToInt = { {"zer", 0}, {"one", 1}, {"two", 2},{"thr", 3},{"fou", 4},{"fiv", 5},{"six", 6},{"sev", 7},{"eig", 8},{"nin", 9}};
    map<string, int> mStrToOffset = { {"zer", 1}, {"one", 0}, {"two", 0},{"thr", 2},{"fou", 1},{"fiv", 1},{"six", 0},{"sev", 2},{"eig", 2},{"nin", 1}};
        
    size_t uSizeOfNumbers = numbers.size();
    for (size_t i = 0; i < uSizeOfNumbers;)
    {
        string strNumber = "";
        for (size_t j = i; j < i + COMMON_OFFSET; ++j)
        {
            strNumber += numbers[j];
        }
        answer = answer * 10 +  mStrToInt[strNumber];
        i += COMMON_OFFSET + mStrToOffset[strNumber];
    }
    
    return answer;
}

 

 

Ex) Level0 - 잘라서 배열로 저장하기

<hide/>

#include <string>
#include <vector>

using namespace std;

vector<string> solution(string my_str, int n) {
    vector<string> answer;
    
    int iSizeOfMyStr = static_cast<int>(my_str.size());
    int iLine = iSizeOfMyStr / n;
    for (int i = 0; i < iLine; ++i)
    {
        answer.push_back(my_str.substr(i * n, n));
    }
    
    int iRemain = iSizeOfMyStr % n;
    if (0 != iRemain)
    {
        answer.push_back(my_str.substr(iLine * n));
    }
    
    return answer;
}

 

Ex) Level0 - 문자열 계산하기

<hide/>

#include <string>
#include <vector>
#include <sstream>

using namespace std;

int solution(string my_string) {
    int answer = 0;
    
    stringstream ss;
    ss.str(my_string);
    
    int iOperand;
    char chOperator;
    ss >> answer;
    while (false == ss.eof())
    {
        ss >> chOperator;
        ss >> iOperand;
        
        switch (chOperator)
        {
            case '+':
                answer += iOperand;
                break;
            case '-':
                answer -= iOperand;
                break;
            default:
                break;
        }
    }
    
    return answer;
}

 

Ex) Level0 - 구슬을 나누는 경우의 수

  구슬은 모두 다르게 생겼습니다. -> 중복이 없다. -> 순열 or 조합

  구슬을 고르는 순서는 고려하지 않습니다 -> 조합

<hide/>

#include <string>
#include <vector>

using namespace std;

void Combination(int _iCurrentN, int _iN, int _iCurrentR, int _iR, int& _iAnswer, vector<bool>& _vbVisit)
{
    if (_iCurrentR == _iR)
    {
        ++_iAnswer;
        return;
    }
    else
    {
        for (int i = _iCurrentN; i < _iN; ++i)
        {
            if (true == _vbVisit[i])
            {
                continue;
            }
            _vbVisit[i] = true;
            Combination(i, _iN, _iCurrentR + 1, _iR, _iAnswer, _vbVisit);
            _vbVisit[i] = false;
            
        }
    }
}

int solution(int balls, int share) {
    int answer = 0;
    
    vector<bool> vbVisit;
    vbVisit.resize(balls + 1, false);
    
    Combination(0, balls, 0, share, answer, vbVisit);
    
    return answer;
}

 

Ex) Level0 - 컨트롤 제트

  스택을 이용해서 Z가 나오면 Pop을 함. 다 끝난후엔 empty까지 총합.

<hide/>

#include <string>
#include <vector>
#include <sstream>

using namespace std;

enum { STACK_SIZE = 201, INVALID = -1};

class Stack
{
public:
    Stack()
        : m_arriData{ 0, }
        , m_uTop(0u)
    {
        
    }
    
    void Push(int _iData)
    {
        if (STACK_SIZE - 1 <= m_uTop)
        {
            // Stack overflow.
        }
        else
        {
            m_arriData[++m_uTop] = _iData;
        }
    }
    
    bool Empty()
    {
        return 0u == m_uTop;
    }
    
    int Pop()
    {
        if (true == Empty())
        {
            // Stack underflow.
            return INVALID;
        }
        else
        {
            return m_arriData[m_uTop--];
        }
    }
    
public:
    int m_arriData[STACK_SIZE];
    size_t m_uTop;
};

int solution(string s) {
    int answer = 0;
    
    Stack st;
    stringstream ss;
    ss.str(s);
    while (false == ss.eof())
    {
        string strInput;
        ss >> strInput;
        
        if ("Z" != strInput)
        {
            st.Push(stoi(strInput));
        }
        else
        {
            st.Pop();
        }
    }
    
    while (false == st.Empty())
    {
        answer += st.Pop();
    }

    return answer;
}

 

Ex) Level0 - 외계어 사전

  spell에 담긴 알파벳을 한 번씩만 모두 사용한 단어 -> 중복 없음 -> 순열 or 조합

  순서가 중요함. -> 순열

  크래프톤에서 비슷한 문제가 마지막문제로 나왔었는데..... 인생...

<hide/>

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

void Permutation(int _iN, int _iCurrentR, int _iR, vector<string>& _vstrSpell, vector<string>& _vstrDic, string& _strResult, int& _iAnswer, vector<bool>& _vbVisit)
{
    if (_iCurrentR == _iR)
    {
        if (_vstrDic.end() != find(_vstrDic.begin(), _vstrDic.end(), _strResult))
        {
            _iAnswer = 1;
        }
        return;
    }
    else
    {
        for (int i = 0; i < _iN; ++i)
        {
            if (true == _vbVisit[i])
            {
                continue;
            }
            _vbVisit[i] = true;
            _strResult.replace(_iCurrentR, 1, _vstrSpell[i]);
            Permutation(_iN, _iCurrentR + 1, _iR, _vstrSpell, _vstrDic, _strResult, _iAnswer, _vbVisit);
            _vbVisit[i] = false;
                
        }
    }
}

int solution(vector<string> spell, vector<string> dic) {
    int answer = 2;
    
    int iN = static_cast<int>(spell.size());
    int iR = iN;
    string strResult = "";
    vector<bool> vbVisit;
    vbVisit.resize(iN + 1, false);
    Permutation(iN, 0, iR, spell, dic, strResult, answer, vbVisit);
    
    return answer;
}

 

Ex) Level0 - 종이 자르기 [X]

  재귀함수. 트리형태로 뻗어나가면 될듯.

  그러나, N과 M의 크기가 예사롭지 않음. 메모이제이션 필요.

  30분 넘게 걸려서 포기하고 다음에 풀기로. 배열 참조와 memset()을 활용해봄.

<hide/>

#include <string>
#include <vector>
#include <cstring>

using namespace std;

enum { MEMOIZATION_SIZE = 101, INVALID = -1 };

int Recursive(int _iM, int _iN, int (&Memo)[MEMOIZATION_SIZE][MEMOIZATION_SIZE])
{
    if (INVALID != Memo[_iM][_iN])
    {
        return Memo[_iM][_iN];
    }
    
    if (0 == _iM || 0 == _iN)
    {
        return Memo[_iM][_iN] = 0;
    }
    
    if (1 == _iM && 1 == _iN)
    {
        return Memo[_iM][_iN] = 0;
    }
    else if ((2 == _iM && 1 == _iN) || (1 == _iM && 2 == _iN))
    {
        return Memo[_iM][_iN] = 1;
    }
    else if ((2 == _iM && 2 == _iN))
    {
        return Memo[_iM][_iN] = 3;
    }
    
    return Memo[_iM][_iN] = (Recursive(_iM - 1, _iN, Memo) + Recursive(_iM, _iN - 1, Memo));
}

int solution(int M, int N) {
    int Memoization[MEMOIZATION_SIZE][MEMOIZATION_SIZE];
    memset(Memoization, INVALID, sizeof(Memoization));
    int answer = Recursive(M, N, Memoization);
    return answer;
}

 

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

23-01-17  (0) 2023.01.17
23-01-16  (0) 2023.01.16
23-01-11  (0) 2023.01.11
23-01-10  (0) 2023.01.10
23-01-09  (0) 2023.01.09

댓글