সমস্যা বিবরণ
গানদের লিস্ট দেওয়া আছে, i-তম গানের duration time[i] সেকেন্ড। দুটি গানের মোট duration ৬০ দিয়ে বিভাজ্য হয় এমন জোড়ার সংখ্যা বের করতে হবে।
উদাহরণ: [30, 20, 150, 100, 40] → ৩ জোড়া: (30,150), (20,100), (20,40) - সবগুলোর যোগফল ৬০-এর গুণিতক।
সমাধানের পদ্ধতি (রিমেইন্ডার ফ্রিকোয়েন্সি)
- রিমেইন্ডার ফ্রিকোয়েন্সি ম্যাপ (ডিকশনারি) মেইনটেইন করুন।
- প্রতিটি time t এর জন্য:
- r = t % 60
- complement = (60 - r) % 60
- ans += freq[complement]
- freq[r]++
- অंत্যে ans ফেরত দিন।
পাইথন উদাহরণ
class Solution(object):
def numPairsDivisibleBy60(self, time):
freq = {}
ans = 0
for t in time:
r = t % 60
complement = (60 - r) % 60
ans += freq.get(complement, 0)
freq[r] = freq.get(r, 0) + 1
return ans
ob1 = Solution()
print(ob1.numPairsDivisibleBy60([30, 20, 150, 100, 40]))
ইনপুট
[30, 20, 150, 100, 40]
আউটপুট
3
ব্যাখ্যা
- t=30: r=30, complement=30, freq[30]=0 → ans=0, freq[30]=1
- t=20: r=20, complement=40, freq[40]=0 → ans=0, freq[20]=1
- t=150: r=30, complement=30, freq[30]=1 → ans=1, freq[30]=2
- t=100: r=40, complement=20, freq[20]=1 → ans=2, freq[40]=1
- t=40: r=40, complement=20, freq[20]=1 → ans=3, freq[40]=2
Counter ব্যবহার করে সংক্ষিপ্ত
from collections import Counter
def numPairsDivisibleBy60(time):
freq = Counter()
ans = 0
for t in time:
ans += freq[(60 - t % 60) % 60]
freq[t % 60] += 1
return ans