코테/항해99

[99클럽 코테 스터디 2일차 TIL] #문자열2

쪼성윤 2024. 10. 29. 15:28

오늘은 2일 차 천천히 문제를 풀어보도록 하자!

 

문제 설명


숫자 2개의 문자열 t, p를 받아와 t에서 p와 길이가 같은 부분문자열을 슬라이싱하여 크기비교를 하는 문제이다.

https://school.programmers.co.kr/learn/courses/30/lessons/147355?language=cpp

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

생각 흐름


우선 문제를 보자마자, 또 문자열 문제구나.. 싶었다. 문자열 다루는 게 확실히 까다로운 것 같다.

하지만 C++에서는 문자열을 다룰 수 있는 STL 함수들이 많기 때문에 차분하게 떠올려보도록 하였다.

 

우선 t, p를 받아들여와 크기비교를 하는 문제이기 때문에 문자열을 받아와 정수형으로 바꾸는 함수인 stoi함수가 사용되겠다는 생각을 하였다.

 

그리고 부분문자열로 슬라이싱하여 크기비교를 하므로 substr() 함수도 떠올렸다.

 

숫자 문자열인 t, p를 받고 이 둘의 길이의 차만큼 반복문을 돌려 일일이 비교하는 작업을 거쳤다.

 

 

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

int solution(string t, string p) {
    int tlen = t.size(); // 문자열 t의 길이 tlen
    int plen = p.size(); // 문자열 p의 길이 plen
    int answer = 0; // 부분문자열의 개수 answer (정답)

    int pint = stoi(p);
    for (int i = 0; i <= (tlen- plen); i++) {
        if (stoi(t.substr(i, plen)) <= pint) answer++;
    }
    return answer;
}

int main () {
	ios_base::sync_with_stdio();
    cin.tie(); cout.tie();
    string t, p;
    cin >> t >> p;

    cout << solution(t,p);
}

 

하지만 이렇게 하니


실패 (signal: aborted (core dumped))

가 떴다.

 

이것에 대해 구글링을 해보니 자료형의 크기가 작아 더 큰 메모리를 가진 자료형을 써야한다는 것이었다.

 

 

공부한 내용 정리

substr() 함수

다시 한번 substr() 함수를 공부해 보기로 하였다.

basic_string substr(size_type pos = 0, size_type count = npos) const;
substr() 함수는 문자열의 pos번째 문자부터 count 길이만큼의 문자열을 리턴한다.
만약에, 인자로 전달된 부분 문자열의 길이가 문자열보다 길다면, 그 이상을 반환하지 않고 문자열의 끝까지만 리턴한다.

또한 countnpos를 전달한다면, 자동으로 pos부터 원래 문자열의 끝까지 리턴한다.

 

인자

  • pos : 첫 번째 문자의 위치 (원래 문자열에서)
  • count: 부분 문자열의 길이

리턴값

원래 문자열에서 (pos, pos + count)까지의 문자열을 반환한다.

예외

만일 pos 가 원래 문자열의 길이보다 길다면 std::out_of_range 예외를 발생시킨다.

 

 

 

돌아보기


 stoi 함수를 썼다가 오류가 떠서 당황한 나머지 시간을 많이 지체하고 말았다.

aborted, core dump라는 오류에 대해 알아보니 범위에 벗어난 메모리의 접근을 막기 위해 일어나는 오류라고 하여 자료형을 바꿔줘야 한다고 하였다.

 

그래서 stoi 함수를 stoll 함수로 바꾸고 자료형을 int에서 long long으로 바꾸어 풀었다.

 

다음에도 이런 실수를 하지 않도록 유의하면서 문제조건을 읽어야겠다는 생각을 하였다.

 

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

int solution(string t, string p) {
    int tlen = t.size(); // 문자열 t의 길이 tlen
    int plen = p.size(); // 문자열 p의 길이 plen
    int answer = 0; // 부분문자열의 개수 answer (정답)

    long long pll = stoll(p); // p문자열을 long long으로 바꿈
    for (int i = 0; i <= (tlen- plen); i++) {
        if (stoll(t.substr(i, plen)) <= pll) answer++;
    }
    return answer;
}

int main () {
    string t, p;
    cin >> t >> p;

    cout << solution(t,p);
}