ধরি আমাদের কাছে একটি স্ট্রিং S আছে। দৈর্ঘ্য n। এই nটি বক্স পরস্পর সংলগ্ন, পজিশন i-এ 'R' থাকলে i-তম বক্স ডান দিকে ধাক্কা দেওয়া হচ্ছে। একইভাবে 'L' বাম দিকে ধাক্কা দেওয়া বোঝায়, '.' খালি স্থান বোঝায়। প্রাথমিক কনফিগারেশন থেকে শুরু করে, প্রতিটি টাইম ইউনিটে, ডান দিকে ধাক্কা খাওয়া একটি বক্স পরবর্তী বক্সকে ডান দিকে ধাক্কা দিতে পারে, বাম দিকের জন্যও একই কাজ প্রযোজ্য। যখন আর কোনো মুভমেন্ট সম্ভব নয় তখন সব বক্সের চূড়ান্ত পজিশন খুঁজে বের করতে হবে।
উদাহরণ
ইনপুট: R..R...L.
আউটপুট: RRRRR.LL.
সমাধানের ধাপসমূহ
- N := স্ট্রিংয়ের আকার
- movement := আকার N-এর অ্যারে, 0 দিয়ে পূরণ করা
- m := 0
- i = 0 থেকে N-1 পর্যন্ত লুপ:
- যদি string[i] == 'R', তবে m := N
- অন্যথায় যদি string[i] == 'L', তবে m := 0
- অন্যথায় m := max(m - 1, 0)
- movement[i] := movement[i] + m
- m := 0
- i = N-1 থেকে 0 পর্যন্ত উল্টো লুপ:
- যদি string[i] == 'L', তবে m := N
- অন্যথায় যদি string[i] == 'R', তবে m := 0
- অন্যথায় m := max(m - 1, 0)
- movement[i] := movement[i] - m
- movement-এর প্রতিটি উপাদান m এর জন্য: m == 0 হলে '.', m > 0 হলে 'R', অন্যথায় 'L' যোগ করে স্ট্রিং তৈরি করুন।
পাইথন কোড উদাহরণ
def get_final_pos(string):
N = len(string)
movement = [0] * N
m = 0
for i in range(0, N):
if string[i] == 'R':
m = N
elif string[i] == 'L':
m = 0
else:
m = max(m - 1, 0)
movement[i] += m
m = 0
for i in range(N - 1, -1, -1):
if string[i] == 'L':
m = N
elif string[i] == 'R':
m = 0
else:
m = max(m - 1, 0)
movement[i] -= m
return "".join('.' if m == 0 else 'R' if m > 0 else 'L' for m in movement)
print(get_final_pos('R..R...L.'))
ইনপুট
'R..R...L.'
আউটপুট
RRRRR.LL.