로마어를 숫자로 변환하는 문제이다.
Input: s = "III"
Output: 3
Explanation: III = 3
여기서 까다로운 조건이 있다.
V 또는 X는 전에 나오는 I는 4나 9가 되고
L 또는 C 전에 나오는 X는 마찬가지로 40 또는 90이 된다는 점이였다.
for loop을 돌면서 i와 i+1를 비교하여 i가 큰 숫자이면 더하고 i+1이 더 크다면 빼주면 된다.
그 전에 해시맵을 만들어서 진행하면 된다.
fun romanToInt(s: String): Int {
var cnt = 0
// 해시키로 만들어준다.
val roman = hashMapOf<Char,Int>()
roman.put('I',1)
roman.put('V',5)
roman.put('X',10)
roman.put('L',50)
roman.put('C',100)
roman.put('D',500)
roman.put('M',1000)
print(s.indices)
// 인덱스로 for loop을 돌아준다
for(i in s.indices){
// index 에러가 나지 않기 위해 i+1 < s 문자열 길이만 비교해주고 위에 말한 것과 같이 i와 i+1를 비교하여 i가 큰 숫자이면 더하고 i+1이 더 크다면 빼준다.
if(i+1 < s.length && roman.get(s.get(i))?: 0 < roman.get(s.get(i+1)) ?: 0){
cnt -= roman[s.get(i)] ?: 0
}else{
cnt += roman[s.get(i)] ?: 0
}
}
return cnt
}
영어라서 느리게 읽히는 것도 있고 기존의 단순한 방식으로만 생각해서 고민을 많이 하게 된 문제였다.