기록 보관소

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

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

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

JongHoon 2024. 2. 5. 22:38

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

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

 

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

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

school.programmers.co.kr


프로그래머스 코딩 기초 트레이닝 : 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

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

 

프로그래머스

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

programmers.co.kr


문제 설명

문자열 myString과 pat가 주어집니다.

myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요.


제한사항

  • 5 ≤ myString ≤ 20
  • 1 ≤ pat ≤ 5
    • pat은 반드시 myString의 부분 문자열로 주어집니다.
  • myString과 pat에 등장하는 알파벳은 대문자와 소문자를 구분합니다.

입출력 예

입출력 예
입출력 예 설명


코드

#include <string>
#include <vector>

using namespace std;

string solution(string myString, string pat) {
    int idx = 0;
    
    while(myString.find(pat, idx) != string::npos)
        idx = myString.find(pat, idx) + pat.size();
    
    return myString.substr(0, idx);
}
// 다른 사람의 풀이 : rfind를 사용하는 방법

#include <string>
#include <vector>

using namespace std;

string solution(string myString, string pat) {
    return myString.substr(0, myString.rfind(pat)+pat.length());
}

결과


프로그래머스 코딩 기초 트레이닝 : 문자열이 몇 번 등자하는지 세기

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

 

프로그래머스

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

programmers.co.kr


문제 설명

문자열 myString과 pat이 주어집니다.

myString에서 pat이 등장하는 횟수를 return 하는 solution 함수를 완성해 주세요.


제한사항

  • 1 ≤ myString ≤ 1000
  • 1 ≤ pat ≤ 10

입출력 예

입출력 예
입출력 예 설명


코드

#include <string>
#include <vector>

using namespace std;

int solution(string myString, string pat) {
    int idx = 0, count = 0;
    
    while(myString.find(pat, idx) != string::npos) {
        idx = myString.find(pat, idx) + 1;
        count++;
    }
    
    return count;
}

결과


프로그래머스 코딩 기초 트레이닝 : ad 제거하기

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

 

프로그래머스

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

programmers.co.kr


문제 설명

문자열 배열 strArr가 주어집니다.

배열 내의 문자열 중 "ad"라는 부분 문자열을 포함하고 있는 모든 문자열을 제거하고 남은 문자열을 순서를 유지하여 배열로 return 하는 solution 함수를 완성해 주세요.


제한사항

  • 1 ≤ strArr의 길이 ≤ 1,000
    • 1 ≤ strArr의 원소의 길이 ≤ 20
    • strArr의 원소는 알파벳 소문자로 이루어진 문자열입니다.

입출력 예

입출력 예
입출력 예 설명


코드

#include <string>
#include <vector>

using namespace std;

vector<string> solution(vector<string> strArr) {
    vector<string> answer;
    
    for (auto str : strArr)
        if(str.find("ad") == string::npos)
            answer.push_back(str);
    
    return answer;
}
// 다른 사람의 풀이 : remove_if를 사용해서 원소를 제거하고 return 하는 방법

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

vector<string> solution(vector<string> v) {
    return vector(v.begin(), remove_if(v.begin(), v.end(), [](string s) { return s.find("ad") != -1; }));
}

결과


프로그래머스 코딩 기초 트레이닝 : 공백으로 구분하기 1

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

 

프로그래머스

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

programmers.co.kr


문제 설명

단어가 공백 한 개로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • my_string은 영소문자와 공백으로만 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string의 맨 앞과 맨 뒤에 글자는 공백이 아닙니다.

입출력 예

입출력 예
입출력 예 설명


코드

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

using namespace std;

vector<string> solution(string my_string) {
    vector<string> answer;
    string word;
    stringstream ss(my_string);
    
    while (getline(ss, word, ' '))
        answer.push_back(word);
    
    return answer;
}
// 다른 사람의 풀이 1 : while 조건문에 getline 없이 해결하는 방법

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

using namespace std;

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

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

    return answer;
}
// 다른 사람의 풀이 2 : 정규 표현식 regex로 해결하는 방법

#include <bits/stdc++.h>
using namespace std;

vector<string> solution(string my_string) {
    regex rx(" ");
    sregex_token_iterator iter(my_string.begin(), my_string.end(), rx, -1), end;
    return {iter, end};
}

결과


프로그래머스 코딩 기초 트레이닝 : 공백으로 구분하기 2

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

 

프로그래머스

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

programmers.co.kr


문제 설명

단어가 공백 한 개 이상으로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • my_string은 영소문자와 공백으로만 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string의 맨 앞과 맨 뒤에도 공백이 있을 수 있습니다.
  • my_string에는 단어가 하나 이상 존재합니다.

입출력 예

입출력 예
입출력 예 설명


코드

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

using namespace std;

vector<string> solution(string my_string) {
    vector<string> answer;
    
    string str;
    stringstream ss(my_string);
    while(ss >> str)
        answer.push_back(str);
    
    return answer;
}

결과


여담

오늘 풀었던 문제 중 3번째 문제 'ad 제거하기'에서 나도 처음에는 erase를 하여 문제를 풀려고 시도했었다.

테스트 케이스도 다 통과했었지만, 정작 제출해보니 3번 케이스부터 다 틀리고 말았고 결국 이해가 잘 안돼서 위와 같이 push_back으로 벡터를 만들어서 해결했다.

이후 질문하기를 통해서 틀린 이유를 찾아봤는데, 간단히 말하면 반복하는 과정에서 원소를 지울 경우 바로 뒤의 원소가 스킵되는 일이 발생할 수 있기 때문이라고 한다.

출처 : https://school.programmers.co.kr/questions/48354

 

프로그래머스

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

programmers.co.kr