Python ile “FizzBuzz” Mülakat Sorusu Çözümü
Yazılım sektöründe işe alım sürecinde sıkça karşılaşılan ve adayların algoritma bilgilerini ölçmeye yarayan klasik bir problem olan FizzBuzz problemi üzerinde duracağız. Problem, ilk bakışta oldukça basit gibi görünse de, çözüm aşamasında dikkat gerektiren önemli detaylar içerir. Biz bu yazımızda, Python programlama dili ile FizzBuzz mülakat sorusu nasıl çözülebileceğine dair adımları anlatacağız. Öncelikle sorumuzu tanıtalım:
Programınız sırayla 1’den 100’e kadar her sayıyı yazdırmalıdır. Bunu ise şu şekilde yapmalıdır:
- Sayı eğer 3’e bölünebiliyorsa, (örneğin; 3) sayıyı yerine “Fizz” yazdırın.
- Sayı eğer 5’e bölünebiliyorsa, (örneğin; 5) sayıyı yerine “Buzz” yazdırın.
- Sayı eğer hem 3’e hem de 5’e bölünebiliyorsa, (örneğin; 15) sayıyı yazdırmak yerine “FizzBuzz” yazmalıdır.
Evet, FizzBuzz böyle bir soru. Şimdi bu kuralları baz alarak yaklaşımımızı adım adım yazalım ve temsili bir akış şeması çizelim. Bakınız:
- Adım 1: Başla
- Adım 2: 1’den 101’e kadar olan sayılar üzerinde bir döngü başlat.
- Adım 3: Her döngüde, şu kontrol et:
- Eğer sayı hem 3’e hem de 5’e tam bölünüyorsa, “FizzBuzz” yazdır.
- Eğer sayı sadece 3’e tam bölünüyorsa, “Fizz” yazdır.
- Eğer sayı sadece 5’e tam bölünüyorsa, “Buzz” yazdır.
- Eğer sayı 3’e veya 5’e tam bölünmüyorsa, sayıyı yazdır.
- Adım 4: Döngü tamamlandığında, programı bitir.
1. İlk çözümümüzde, tekrarlı bir iş olmasından ötürü for döngüsü kullanabiliriz. Ayrıca koşul durumu belirtildiği için if-elif-else ifadelerini ve and operatörünü kullanacağız.
for i in range(1, 101):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
Çözümde anahtar nokta “if-elif-else” bloğunun doğru sırayla düzenlenmesidir. Bir koşul sağlandığında, ilgili kod bloğu çalıştırılır ve diğer koşullar kontrol edilmeyebilir. Bu nedenle, hem 3’e hem de 5’e bölünebilme koşulunu en başta kontrol etmek kritik bir öneme sahiptir. Eğer 3’e bölünebilme veya 5’e bölünebilme koşullarından biri en başta kontrol edilirse, program hem 3’e hem de 5’e bölünebilme koşulunu kontrol etmeden sonlanır. Bu durumda, program istenmeyen sonuçlar üretir ve bu da hatalı bir çözüm olur.
2. Pekala for döngüsü yerine while döngüsü kullanabiliriz.
sayi = 1
while sayi < 101:
if sayi % 3 == 0 and sayi % 5 == 0:
print ("FizzBuzz")
elif sayi % 3 == 0:
print ("Fizz")
elif sayi % 5 == 0:
print ("Buzz")
else:
print (sayi)
sayi += 1
3. Çoklu if ile şu şekilde çözebiliriz:
for sayi in range(1,101):
string = ""
if sayi%3 == 0:
string += "Fizz" #string = string + "Fizz"
if sayi%5 == 0:
string += "Buzz" #string = string + "Buzz"
if sayi%5 != 0 and sayi%3 != 0:
string += str(sayi) #string = string + str(sayi)
print(string)
Yukarıdaki çözümde “for döngüsü” içinde “çoklu if” yapısı kullanılmıştır. Bu, bir koşul sağlansa bile diğer koşulların da kontrol edileceği anlamına gelir. Bu nedenle, 3’e bölünebilme durumu ilk koşul olarak belirlenmiştir.
Son koşula gelindiğinde, sayının hem 5’e hem de 3’e tam bölünemeyen durumlar için, döngüdeki sayı değeri string’e eklenir.
Eğer bir sayı hem 3’e hem de 5’e bölünebiliyorsa, öncelikle 3’e bölünebildiği için ‘string’ değeri “Fizz” olur. Daha sonra, bu ‘string’ değeri “Buzz” ile birleştirilir ve sonuç “FizzBuzz” olarak elde edilir.
Bu versiyonumuz, her sayı için 3 kontrol yapar ve sonucu string değişkenine ekler, sonra string’i yazdırır. Haliyle, önceki çözümlere göre daha düzenli ve okunabilir bir yaklaşım sağlar.