본문 바로가기

ALGORITHM/문자열

[Swift] LeetCode: Roman to Integer (문자열)

https://leetcode.com/problems/roman-to-integer/

 

Roman to Integer - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

처음 문제를 풀었을 때 dictionary로 돌면서 미리 넣어둔 symbol값을 숫자값 + " " 로 바꿔주고 split으로 단어를 나눠서 모두 더하도록 했다.

XIV  -> 10 4 -> 10 + 4 = 14

 

간과하고 있었던 사실은 dictionary에 순서가 없다는 것이었다.

내가 짠 코드는 IV 를 먼저 바꾸고 I랑 V를 나중에 바꿔야 제대로 바뀌는데 

I 와 V 를 먼저 바꾸면 제대로 된 값이 나오지 않는다.

class Solution {
    func romanToInt(_ s: String) -> Int {
        
        let symbols = [ "IV" : 4, "IX" : 9, "XL" : 40, "XC" : 90, "CD" : 400, "CM" : 900,
                       "I" : 1, "V" : 5, "X" : 10, "L" : 50, "C" : 100, "D" : 500, "M" : 1000]
        
        var str = s
        
        for (key, value) in symbols {
            str = str.replacingOccurrences(of: key, with: String(value) + " ")
        }
        
        let array = str.split(separator: " ").map{ Int($0)! }
        
        return array.reduce(0, { $0 + $1 })
    }
}

 

 

그래서 두개의 배열로 나누어서 값을 바꿔주었다.

새로배운 reduce 함수도 배열값을 모두 더해주도록 구현하였다.

class Solution {
    func romanToInt(_ s: String) -> Int {
        
        let symbols = [ "IV", "IX", "XL", "XC", "CD", "CM", "I", "V", "X", "L", "C", "D", "M" ]
        let symbolNumber = [ 4, 9, 40, 90, 400, 900, 1, 5, 10, 50, 100, 500, 1000 ]

        
        var str = s
        
        for i in 0..<symbols.count {
            str = str.replacingOccurrences(of: symbols[i], with: String(symbolNumber[i]) + " ")
        }
        
        let array = str.split(separator: " ").map{ Int($0)! }
        
        return array.reduce(0, { $0 + $1 })
    }
}

 

 

다른 사람의 코드도 구경을 해보자

String 을 for 문으로 돌릴 수가 있군아...?!

 

val 현재 값

out 값 = out 값 + 현재 문자 값이 prev보다 작거나 같으면 prev, 크면 -prev

prev 에 현재 값을 넣는다

 

로마숫자를 잘 이해를 못해서 생각하지 못한 풀이였다 ㅎ..ㅎ

class Solution {
    private let dict: [Character:Int] = ["I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000]
    
    func romanToInt(_ s: String) -> Int {
        var prev = 0, out = 0
        for i in s {
            let val = dict[i] ?? 0
            out += val <= prev ? prev : -prev
            prev = val
        }
        out += prev
        return out
    }
}