13번 문제는 로마 숫자를 실제 숫자로 변환하는 문제였다.
로마 숫자 심벌마다 정해진 value가 있다. (I, V, X만 알았는데 다른 것도 다 실제로 있는 건가...?)
그리고 또 하나의 조건이 더 있다.
4, 9, 40, 90, 400, 900은 표기 조건이 달랐다. 4면 IIII가 아니라 IV으로 표기하는..? 예시를 하나 확인해보자.
Input으로 MCMXCIV라는 문자열이 들어왔을 때 M은 1000, CM은 900, XC는 90, IV는 4로 치환되어 결과값이 1994가 된다.
그냥 기본 로마 숫자만 들어오면 참 좋을 텐데.. 각 자릿수를 확인하는 게 포인트였던 것 같다.
내가 푼 방법
1. 일단 문자열을 봤을 때 IV, IX, XL, XC, CD, CM가 존재하는 경우 결과값에 미리 더한 후 문자열에서 제거
2. 남은 문자열을 for로 돌면서 기본 로마 숫자별로 다시 결과값에 더하기
class Solution {
func romanToInt(_ s: String) -> Int {
var result: Int = 0
var str = s
let romanInt: [Character: Int] = ["I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000]
let exception: [String: Int] = ["IV": 4, "IX": 9, "XL": 40, "XC": 90, "CD": 400, "CM": 900]
for (key, value) in exception {
if str.contains(key), let subRange = str.range(of: key) {
result += value
str.removeSubrange(subRange)
}
}
for char in str {
if let value = romanInt[char] {
result += value
}
}
return result
}
}
기본 로마 숫자는 romanInt에, 예외적으로 표기되는 수들은 exception에 각각 로마 숫자: Int 딕셔너리로 지정했다.
그리고 생각했던 대로 exception에 포함된 문자열이 s에 존재하는 경우 결과 값을 더한 후 해당 문자열을 제거한 뒤에 남은 문자열의 수를 매치해서 더해주었다.
성공 하기는 했는데.... 생각보다 런타임이나 메모리 사용량이 효율적이진 못했다. 또 다른 방법이 생각나면 다시 풀어봐야지
반응형
'Algorithm' 카테고리의 다른 글
Swift로 Leet Code 문제 풀기 - 21. Merge Two Sorted Lists (Easy) (0) | 2022.06.27 |
---|---|
Swift로 Leet Code 문제 풀기 - 14. Longest Common Prefix (Easy) (0) | 2022.02.18 |
Swift로 Leet Code 문제 풀기 - 9. Palindrome Number (Easy) (0) | 2022.02.07 |
Swift로 Leet Code 문제 풀기 - 1. Two Sum (Easy) (0) | 2022.02.04 |
[iOS] Swift 알고리즘 문제 풀기 - input 입력 받기 (0) | 2022.01.28 |