#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보다 큼
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 (길이 넘어가면 남은 거 전부)
}
숫자로 받어면 앞의 0이 사라짐
만약 t = "10203", p = "15"일 때 부분 문자열 "02"는 실제로 2라는 숫자
int나 long long이면 "02" → 2 로 변해서 원래 모양 정보를 망가짐
그리고 p가 엄청 길면 (예: 20자리 이상) → long long 범위를 초과해서 오버플로 발생
string으로 하면 substr로 바로 비교 가능
➡ 문자열 비교는 길이만 같으면 숫자 크기 비교와 동일하게 동작하니까 안전하다!
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"은 빠짐!!!!
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를 수정했다. 위젯별로 정리해서 올릴 계획이라 얼른 정리해야 겠다.