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 을 사용해보면서 문제를 확실히 직면할 수 있었다.
#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;
}
substr(시작 문자열의 index); => n번째 index부터 끝까지의 문자열
substr(시작 문자열의 index, 문자열의 길이 m); => n번째 index부터 m개의 문자열