크기가 작은 부분 문자열

김여울·2025년 8월 11일
0

내일배움캠프

목록 보기
57/114

크기가 작은 부분 문자열

#include <string>
#include <vector>

using namespace std;

int solution(string t, string p) 
{
    int count = 0;
    int lenT = t.size();
    int lenP = p.size();
    
    for (int i = 0; i + lenP <= lenT; i++)  // 마지막까지 포함
    {
        // string을 사용하면 앞자리 0 유지 가능, 정수 범위 초과도 안전하게 비교 가능
        string part = t.substr(i, lenP); // 부분문자열 자르기
        if (part <= p)  // 문자열 비교
        {
            count++;
        }
    }
    
    return count;
}

예시

이해가 안돼서 ai한테 쉽게 설명해달라고 했다...

t = 1 0 2 0 3
p = "15" (길이 = 2)

비교 과정 (칸 슬라이딩)

[1][0] 2 0 3"10""15"1 [0][2] 0 3"02""15"1 0 [2][0] 3"20""15"1 0 2 [0][3]"03""15" ✅

결과
✅인 경우 = "10", "02", "03" → 총 3

시각 흐름

슬라이드1: 10
슬라이드2: 02
슬라이드3: 20
슬라이드4: 03
초록 ✅ : p보다 작거나 같음

빨강 ❌ : p보다 큼

substr

string substr(size_t 시작위치, size_t 길이);
문자열 자를 때 쓸 수 있는 함수

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

int main() {
    string text = "abcdef";

    cout << text.substr(0, 3) << '\n'; // abc
    cout << text.substr(2, 2) << '\n'; // cd
    cout << text.substr(4, 5) << '\n'; // ef (길이 넘어가면 남은 거 전부)
}
  • 시작위치가 문자열 길이보다 크면 에러 대신 빈 문자열 반환함
  • 길이가 남은 글자 수보다 크면 → 남은 글자만 반환함

string 으로 하는 이유

  • 숫자로 받어면 앞의 0이 사라짐

  • 만약 t = "10203", p = "15"일 때 부분 문자열 "02"는 실제로 2라는 숫자

  • int나 long long이면 "02" → 2 로 변해서 원래 모양 정보를 망가짐

  • 그리고 p가 엄청 길면 (예: 20자리 이상) → long long 범위를 초과해서 오버플로 발생

  • string으로 하면 substr로 바로 비교 가능

➡ 문자열 비교는 길이만 같으면 숫자 크기 비교와 동일하게 동작하니까 안전하다!

for문 완료 조건 수정

1. 원래 조건 : i < lenT - lenP

i < 5 - 2
i < 3
가능한 i는 : 0, 1, 2
i=0: [1][0] 2 0 3   → "10"
i=1: 1 [0][2] 0 3   → "02"
i=2: 1 0 [2][0] 3   → "20"
여기서 끝 → "03"은 빠짐!!!!

2. 수정 조건 : i + lenP <= lenT

i + 2 <= 5
i <= 3
가능한 i는 : 0, 1, 2, 3
i=0: [1][0] 2 0 3   → "10"
i=1: 1 [0][2] 0 3   → "02"
i=2: 1 0 [2][0] 3   → "20"
i=3: 1 0 2 [0][3]   → "03" ✅
03까지 계산됨!!!!

차이점

1번 조건 i < lenT - lenP → 마지막 "03" 비교 안 함
2번 조건 i + lenP <= lenT → 마지막까지 비교 가능

40번 진입하다가 너무 어려워서 또 되돌아갈까 생각하다가 풀기로 했다.
정말 못 풀겠는 건 넘어가고 30분 정도는 고민을 해야겠다...
언제쯤 혼자 쉽게 풀 수 있을까..? 🥲

그리고 오늘은 하루종일 PPP 팀플 총기 정보 UI를 수정했다. 위젯별로 정리해서 올릴 계획이라 얼른 정리해야 겠다.

0개의 댓글