기록 보관소

[프로그래머스] 코딩 기초 트레이닝 PART 18(C++) 본문

코딩 테스트/프로그래머스

[프로그래머스] 코딩 기초 트레이닝 PART 18(C++)

JongHoon 2024. 2. 8. 23:43

프로그래머스 코딩 테스트 연습 : 코딩 기초 트레이닝(C++)

https://school.programmers.co.kr/learn/challenges?order=recent&languages=cpp&partIds=44139&page=5

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr


프로그래머스 코딩 기초 트레이닝 : x 사이의 개수

https://school.programmers.co.kr/learn/courses/30/lessons/181867

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명

문자열 myString이 주어집니다.

myString을 문자 "x"를 기준으로 나눴을 때 나눠진 문자열 각각의 길이를 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.


제한사항

  • 1 ≤ myString의 길이 ≤ 100,000
    • myString은 알파벳 소문자로 이루어진 문자열입니다.

입출력 예

입출력 예
입출력 예 설명


코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(string myString) {
    vector<int> answer;
    int count = 0;
    
    for(auto str : myString) {
        if (str == 'x') {
            answer.push_back(count);
            count = 0;
        }
        else
            count++;
    }
    
    answer.push_back(count);
    
    return answer;
}

결과


프로그래머스 코딩 기초 트레이닝 : 문자열 잘라서 정렬하기

https://school.programmers.co.kr/learn/courses/30/lessons/181866

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명

문자열 myString이 주어집니다.

"x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 사전순으로 정렬한 배열을 return 하는 solution 함수를 완성해 주세요.

단, 빈 문자열은 반환할 배열에 넣지 않습니다.


제한사항

  • 1 ≤ myString ≤ 100,000
    • myString은 알파벳 소문자로 이루어진 문자열입니다.

입출력 예

입출력 예
입출력 예 설명


코드

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

using namespace std;

vector<string> solution(string myString) {
    vector<string> answer;
    string temp = "";
    
    for(auto str : myString) {
        if (str == 'x') {
            if (temp != "") {
                answer.push_back(temp);
                temp = "";
            }
        }
        else
            temp += str;
    }
    
    if (temp != "")
        answer.push_back(temp);
    
    sort(answer.begin(), answer.end());
    
    return answer;
}
// 다른 사람의 풀이 1 : x를 모두 공백으로 대체한 뒤, vector에 저장하는 방법

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

using namespace std;

vector<string> solution(string myString) {
    vector<string> answer;

    for(auto& c : myString)
    {
        if( c == 'x')
        {
            c = ' ';
        }
    }

    string str;
    stringstream ss;
    ss.str(myString);
    while(ss >> str)
    {
        answer.emplace_back(str);
    }

    sort(answer.begin(),answer.end());

    return answer;
}
// 다른 사람의 풀이 2 : 문자열을 substr로 잘라서 벡터에 넣어서 해결하는 방법

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

using namespace std;

vector<string> solution(string myString) {
    vector<string> answer;
    int index = 0;
    for(int i=0;i<myString.length();i++){
        if(myString[i]=='x'){
            if(index!=i)answer.push_back(myString.substr(index,i-index));
            index = i+1;
        }
    }

    if(index!=myString.length())answer.push_back(myString.substr(index,myString.length()-index));

    sort(answer.begin(),answer.end());
    return answer;
}

결과


프로그래머스 코딩 기초 트레이닝 : 간단한 식 계산하기

https://school.programmers.co.kr/learn/courses/30/lessons/181865

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명

문자열 binomial이 매개변수로 주어집니다.

binomial은 "a op b" 형태의 이항식이고 a와 b는 음이 아닌 정수, op는 '+', '-', '*' 중 하나입니다.

주어진 식을 계산한 정수를 return 하는 solution 함수를 작성해 주세요.


제한사항

  • 0 ≤ ab ≤ 40,000
  • 0을 제외하고 ab는 0으로 시작하지 않습니다.

입출력 예

입출력 예
입출력 예 설명


코드

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

using namespace std;

int solution(string binomial) {
    vector<string> v;
    string str;
    stringstream ss(binomial);
    int answer = 0;
    
    
    while(ss >> str)
        v.push_back(str);
    
    if (v[1] == "+") answer = stoi(v[0]) + stoi(v[2]);
    else if (v[1] == "-") answer = stoi(v[0]) - stoi(v[2]);
    else answer = stoi(v[0]) * stoi(v[2]);
    
    return answer;
}
// 다른 사람의 풀이 1 : vector 없이 string과 char로 해결하는 방법

#include <string>
#include <vector>
#include <sstream>
using namespace std;

int solution(string binomial) {
    int answer = 0;

    int a,b;
    char op;

    stringstream ss;
    ss.str(binomial);
    ss >> a>> op >>b;

    if(op == '+')
    {
        answer = a+b;
    }
    else if(op == '-')
    {
        answer = a-b;
    }
    else if(op == '*')
    {
        answer = a*b;
    }

    return answer;
}
// 다른 사람의 풀이 2 : substr을 이용해 해결하는 방법

#include <string>
#include <vector>

using namespace std;

int solution(string binomial)
{
    int answer=0;

    for(int i=0; i<binomial.length(); i++)
    {
        if(binomial[i]=='+')
            answer=stoi(binomial.substr(0, i-1))+stoi(binomial.substr(i+2));
        else if(binomial[i]=='-')
            answer=stoi(binomial.substr(0, i-1))-stoi(binomial.substr(i+2));
        else if(binomial[i]=='*')
            answer=stoi(binomial.substr(0, i-1))*stoi(binomial.substr(i+2));
    }

    return answer;
}

결과


프로그래머스 코딩 기초 트레이닝 : 문자열 바꿔서 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/181864

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명

문자 "A"와 "B"로 이루어진 문자열 myString과 pat가 주어집니다.

myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.


제한사항

  • 1 ≤ myString의 길이 ≤ 100
  • 1 ≤ pat의 길이 ≤ 10
    • myString과 pat는 문자 "A"와 "B"로만 이루어진 문자열입니다.

입출력 예

입출력 예
입출력 예 설명


코드

#include <string>
#include <vector>

using namespace std;

int solution(string myString, string pat) {
    for (auto &str : pat) {
        if (str == 'A')
            str = 'B';
        else
            str = 'A';
    }
    
    return ((myString.find(pat) != string::npos) ? 1 : 0);
}
// 다른 사람의 풀이 : transform을 사용하는 방법

#include <string>
#include <algorithm>
using namespace std;

int solution(string s, string p) {
    transform(p.cbegin(), p.cend(), p.begin(), [](char c) {return c == 'A' ? 'B' : 'A'; });
    return s.find(p)!=string::npos;
}

결과


프로그래머스 코딩 기초 트레이닝 : rny_string

https://school.programmers.co.kr/learn/courses/30/lessons/181863

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명

'm'과 "rn"이 모양이 비슷하게 생긴 점을 활용해 문자열에 장난을 하려고 합니다.

문자열 rny_string이 주어질 때, rny_string의 모든 'm'을 "rn"으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • 1 ≤ rny_string의 길이 ≤ 100
  • rny_string은 영소문자로만 이루어져 있습니다.

입출력 예

입출력 예
입출력 예 설명


코드

#include <string>
#include <vector>

using namespace std;

string solution(string rny_string) {
    string answer = "";
    
    for (auto str : rny_string) {
        if (str == 'm')
            answer += "rn";
        else
            answer += str;
    }
    
    return answer;
}
// 다른 사람의 풀이 1 : 정규 표현식(regex)을 이용해 replace하기

#include <string>
#include <vector>
#include <regex>

using namespace std;

string solution(string rny_string) {
    string answer = "";
    rny_string = regex_replace(rny_string,regex("m"),"rn");
    answer= rny_string;
    return answer;
}
// 다른 사람의 풀이 2 : find와 replace 함수를 이용해서 해결하는 방법

#include <string>
using namespace std;

string solution(string s) {
    for(int it=s.find("m");it!=-1;it=s.find("m"))
        if (it!=string::npos)
            s.replace(it, 1, "rn");
    return s;
}

결과


여담

오늘 풀었던 2번째 문제 '문자열 잘라서 정렬하기'가 개인적으로 정말 아쉽다.

코드에서도 보이듯 억지로 되는대로 풀고 제출해서 코드도 지저분해졌고 뭔가 엉성하게 되버렸다.

구멍 뚫린 곳에 판자로 덮어버리느라 뭔가 누더기가 된 배를 본 느낌이랄까.

다른 사람의 풀이를 보면서 오늘도 부족함을 많이 느낀다. 지난 시간에 공백을 지우는 string stream을 잘 써놓고 활용할 생각도 못했던게 정말 아쉽다.

나도 언젠가 저렇게 잘 응용할 수 있기를...