[C++] 크기가 작은 부분 문자열 - stoll(), substr()

wansuper·2023년 12월 29일
0

CodingTest

목록 보기
21/34

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

내 풀이

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(string t, string p) {
    int answer = 0;
    vector<string> sub_str; // 부분 문자열 담는 vector 선언
    
    int sub_str_size = t.size() - p.size() + 1; // 부분 문자열의 크기
    
    string str = "";
    
    // sub_str 만드는 for문
    for (int i = 0; i < sub_str_size; i++) {
        for (int j = i; j < i + p.size(); j++) {
            
            str += t[j];
        }
        sub_str.push_back(str);
        str = "";   
    }
    
    long long p_int = stoll(p); // p 문자열을 long long으로 변환하여 저장
   
    // sub_str 출력문
    for (int i = 0; i < sub_str_size; i++) {
        cout << sub_str[i] << " ";
    }
   
    // sub_str 내부의 원소를 int형으로 변환
    for (int i = 0; i < sub_str_size; i++) {
        
        // long long형으로 변환되어 비교되는 피연산자
        long long comp = stoll(sub_str[i]);
        
        // p값과 원소 비교 후 작거나 같으면 answer 카운팅
        if (p_int >= comp) {
            answer++;
        }
    }
    
    return answer;
}

int main() {
    
    solution("7000000000111111111111111111", "500000000000000001"); // 10
 // solution("3141592", "271"); // 2
 // solution("500220839878", "7"); // 8
 // solution("10203", "15"); // 3
 
    return 0;
}

분석

  • 전체적으로 아이디어 구상 + 초반 재귀 반복문 모두 잘 구현했다. 이후 디버깅 과정에서 18자리까지의 p의 길이를 고려하느라 애를 먹었는데, 힌트를 참고해서 long long으로 선언하는 것까지는 알아냈지만 stoll()이 처음엔 떠오르지 않았다.

  • long long을 처리하기 전까지는 int형으로 선언 및 비교했기 때문에 정확도가 63.2% 나왔다. 데이터의 범위를 long long으로 고려하니, 안정적으로 구현할 수 있었어서 데이터의 형태에 따른 가용 메모리의 중요성을 더더욱 깨닫을 수 있었던 좋은 기회였다.

  • 내가 추가해본 테스트 케이스인 ("7000000000111111111111111111", "500000000000000001") // 10 을 사용해보면서 문제를 확실히 직면할 수 있었다.


다른 사람의 풀이 - substr()

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

int solution(string t, string p) {
    int answer = 0;
    int n = p.size();

    for (int i = 0; i <= t.size() - n; i++) {
        string s = t.substr(i, n);
        if (s <= p) {
            answer++;
        }
    }
    return answer;
}

분석

  • 부분 문자열을 나타내는 string.substr() 함수가 있었구나!!!
  • substr()의 매개변수

substr(시작 문자열의 index); => n번째 index부터 끝까지의 문자열
substr(시작 문자열의 index, 문자열의 길이 m); => n번째 index부터 m개의 문자열

  • 이 함수를 활용하면 내 코드처럼 장황하지 않아도 쉽게 이해할 수 있겠군!
profile
🚗 Autonomous Vehicle 🖥️ Study Alone

0개의 댓글