এই টিউটোরিয়ালে, আমরা একটি প্রোগ্রাম লিখব যা একটি স্ট্রিং-এ সিগন্যাল সব পজিশনে পৌঁছাতে কতক্ষণ লাগে সেটা ক্যালকুলেট করবে। একটি উদাহরণ দিয়ে ব্যাখ্যা করি।
আমাদের একটি স্ট্রিং থাকবে যেটে শুধু s এবং p ক্যারেক্টার থাকবে। s হলো সিগন্যাল (signal) এবং p হলো স্ট্রিং-এ পজিশন (position)। একটি সিগন্যাল s-থেকে শুরু হয় এবং বাম ও ডান দুটি দিকে ট্রাভেল করে। আমরা ধরে নিচ্ছি স্ট্রিং-এ নেক্সট পজিশনে যেতে এক ইউনিট টাইম লাগে। আমাদের কাজ হলো সব পজিশন-কে সিগন্যাল-এ রূপান্তর করতে কতটুকু টাইম লাগবে সেটা ক্যালকুলেট করা।
কিছু উদাহরণ দেখি।
ইনপুট - pppppspss
আউটপুট - 5
ইনপুট - pspspsps
আউটপুট - 1
ইনপুট - ssssss
আউটপুট - 0
সমস্যাটি সমাধানের ধাপগুলো:
- একটি স্ট্রিং এবং টাইম (০) ইনিশিয়ালাইজ করুন
- স্ট্রিংয়ের ওপর ইটারেট করুন।
- কন্টিনিউয়াস p ক্যারেক্টার গণনা করুন এবং কাউন্ট একটি ভেরিয়েবলে স্টোর করুন।
- যদি কারেন্ট ক্যারেক্টার s হয় এবং p কাউন্ট প্রিভিয়াস টাইমের চেয়ে বেশি হয় তবে চেক করুন s বাম পাশে আছে কিনা।
- যদি s দুপাশেই থাকে, তবে কাউন্ট দুভাগ করুন কারণ s দুদিকেই ট্রাভেল করতে পারে।
- p কাউন্ট রিসেট করুন।
উদাহরণ
কোডটি দেখি।
#include <bits/stdc++.h>
using namespace std;
int timeToConvertToSignalString(string sample_string, int string_len) {
int p_count = 0, time = 0;
for (int i = 0; i <= string_len; i++) {
if (sample_string[i] == 'p') {
p_count++;
} else {
if (p_count > time) {
bool is_present_left_side = false;
if (((i - p_count) > 0) && (sample_string[i - p_count - 1] == 's')) {
is_present_left_side = 1;
}
if (is_present_left_side) {
p_count = ceil((double)p_count / 2);
}
time = max(time, p_count);
}
p_count = 0;
}
}
return time;
}
int main() {
string sample_string = "pppppspss";
int n = sample_string.size();
cout << timeToConvertToSignalString(sample_string, n) << endl;
return 0;
}
আউটপুট
5
প্রোগ্রামটি অন্য কেসের সাথে রান করে চেক করুন।
উপসংহার
টিউটোরিয়ালে যদি কোনো প্রশ্ন থাকে, তবে কমেন্ট সেকশনে জানান।