https://leetcode.com/problems/roman-to-integer/
처음 문제를 풀었을 때 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
}
}
'ALGORITHM > 문자열' 카테고리의 다른 글
[Swift] 프로그래머스 Lv1. 신규 아이디 추천 (0) | 2022.05.10 |
---|---|
[Swift] LeetCode: Longest Common Prefix (문자열) (0) | 2022.03.15 |
[Swift] 2941 크로아티아 알파벳 (replacingOccurrences 함수) (0) | 2022.03.06 |
[Swift] 2779 블라인드 (문자열) (0) | 2022.03.05 |
[Swift] Lv2.문자열 압축 (String.Index) (0) | 2022.03.03 |