sleepyotter
Roman To Integer 본문
못풀고 낑낑대다가 해답에 손을 대고 말았다.
핵심은 '연속된 두 수를 비교했을 때, 작은 숫자가 앞에 온다면' 이다.
이런 경우에만 뒤쪽 수 - 앞쪽 수 한다. (IV = 5-1) 와 같이...
당연히 숫자 2개를 비교하니 루프는 사이즈-1 까지만 돌리고 마지막 숫자는 얄짤없이 더하는 숫자이니 그냥 더하면 된다.
class Solution {
public:
int romanToInt(string s)
{
int sz = s.size();
//만약 길이가 1일 경우에는 맞는 숫자 찾아서 반환하면 된다.
if (s.size() == 1) return hmap[s[0]];
int sum = 0;
for (int i = 0; i < sz - 1; ++i)
{
int curNum = hmap[s[i]];
if (hmap[s[i]] < hmap[s[i + 1]])
curNum *= -1;
sum += curNum;
}
sum += hmap[s[sz - 1]];
return sum;
}
private:
unordered_map<char, int> hmap =
{
{'M', 1000},
{'D', 500},
{'C', 100},
{'L', 50},
{'X', 10},
{'V', 5},
{'I', 1},
};
};
'프로그래밍 > 알고리즘+코딩테스트' 카테고리의 다른 글
Valid Parentheses (0) | 2021.08.24 |
---|---|
Longest Common Prefix (0) | 2021.08.22 |
Palindrome Number (0) | 2021.08.22 |
Reverse Integer (0) | 2021.08.22 |
Two Sum (0) | 2021.08.18 |