Leetcode, Roman to Integer Problemi Çözümü (Kotlin)

Soruda, verilen stringdeki Romen rakamlarından oluşan sayının Integer'a dönüştürülmesi isteniyor.

Romen Rakamları:

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

Kotlin'de bu Romen rakamlarını karşılıkları ile tutabileceğimiz yapı Map koleksiyonu. Bu yüzden önce onu oluşturdum.

class Solution {
    fun romanToInt(s: String): Int {
        var sum: Int = 0
        val romanToInt: Map<Char, Int> = mapOf('M' to 1000, 'D' to 500, 'C' to 100, 'L' to 50, 'X' to 10,'V' to 5, 'I' to 1)

Romen sayılarında 1 (I), 10 (X) veya 100 (C)'ün bir sağında kendisinden büyük bir sayı var ise o büyük sayıdan çıkartılıyor(lar). Yani örnek olarak şöyle:

IV = 4

XL = 40

Böyle bir istisna olmasa Romen rakamlarını iterate edip her birinin karşılığını toplama ekleyebilirdik. Buna da şöyle çözüm buldum: Döngü ile verilen stringin karakterlerini iterate ederken mevcut karakter I, X veya C ise kendisinden bir sonraki elemanı da kontrol edeyim.

- Eğer sonraki eleman büyükse o elemandan çıkararak toplam değişkenine ekleyeyim.

- Büyük değilse veya zaten mevcut karakter o 3 karakterden biri değilse sadece mevcut elemanı toplam değişkenine ekleyeyim.

Kodda daha iyi anlaşılır:

class Solution {
    fun romanToInt(s: String): Int {
        var sum: Int = 0 // TOPLAM
        val romanToInt: Map<Char, Int> = mapOf('M' to 1000, 'D' to 500, 'C' to 100, 'L' to 50, 'X' to 10,'V' to 5, 'I' to 1)
        for (i in s.indices){
            if(i<s.length-1 && (s[i] == 'C' || s[i] == 'X' || s[i] == 'I')){ //3 Romen rakamından biriyse:

                if(romanToInt.get(s[i])!! < romanToInt.get(s[i+1])!!){ //Geçerli eleman, bir sonraki elemendan küçükse...
                    sum += romanToInt.get(s[i+1])!! - romanToInt.get(s[i])!!

                }else{ //Geçerli eleman, bir sonraki elemandan küçük değilse sadece geçerli eleman sum'a ekleniyor.
                    sum += romanToInt.get(s[i])!!
                }
            }else{ //3 Romen rakamından biri değilse direkt geçerli eleman sum'a ekleniyor.
                sum += romanToInt.get(s[i])!!
            }
        }
        return sum
    }
}

Daha malesef bitmedi. Şimdi şöyle bir sorun var. Verilen sayıda I, X veya C karakterlerinden sonraki karakter daha büyük olduğunda gereken işlemi yapıyoruz. Yani o bir sonraki karakterle işimiz aslında bitiyor. Fakat döngü birer birer atladığı için o işimizin kalmadığı bir sonraki indeksin es geçilmesi gerekiyor. Buna da şöyle bir çözüm buldum:

class Solution {
    fun romanToInt(s: String): Int {
        var sum: Int = 0 // TOPLAM
        val romanToInt: Map<Char, Int> = mapOf('M' to 1000, 'D' to 500, 'C' to 100, 'L' to 50, 'X' to 10,'V' to 5, 'I' to 1)
        var continueLoop: Boolean = false
        for (i in s.indices){
            if(continueLoop){ //Başa bu kontrolü ekledim ki continueLoop true yapıldığında döngü 1 sefer atlasın.
                continueLoop = false
                continue
            }
            if(i<s.length-1 && (s[i] == 'C' || s[i] == 'X' || s[i] == 'I')){

                if(romanToInt.get(s[i])!! < romanToInt.get(s[i+1])!!){
                    sum += romanToInt.get(s[i+1])!! - romanToInt.get(s[i])!!
                    continueLoop = true //Bir sonraki döngü es geçilecek.

                }else{
                    sum += romanToInt.get(s[i])!!
                }
            }else{
                sum += romanToInt.get(s[i])!!
            }
        }
        return sum
    }
}

Yorumlar