HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
👻
개발 기록
/
코딩테스트 스터디
코딩테스트 스터디
/
Roman to Integer

Roman to Integer

Link
https://leetcode.com/problems/roman-to-integer/
Deadline
Aug 26, 2021
Status
Archived
Type
Hash Table

📑 문제

notion image

✏️ 풀이

재영
/** * @param {string} s * @return {number} */ const convertSymbolIntoValue = symbol => { const symbolValues = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000, }; return symbolValues[symbol]; } /* 1. 문자별 값들을 다 객체에 저장해둔다. 2. 예외 상황들에 대해 조건을 달아놓는다. 3. s를 스택화 시켜서, 빼면서 값을 계산. */ const romanToInt = s => { let result = 0; const sArr = s.split(""); while (sArr.length) { const now = sArr.pop(); const nowSLastSymbol = sArr[sArr.length - 1]; if ((now === 'V' || now === 'X') && nowSLastSymbol === 'I') { sArr.pop(); result = (now === 'V') ? result + 4 : result + 9; } else if ((now === 'L' || now === 'C') && nowSLastSymbol === 'X') { sArr.pop(); result = (now === 'L') ? result + 40 : result + 90; } else if ((now === 'D' || now === 'M') && nowSLastSymbol === 'C') { sArr.pop(); result = (now === 'D') ? result + 400 : result + 900; } else { result += convertSymbolIntoValue(now); } } return result; }; const s = "MCMXCIV"; console.log(romanToInt(s))
저는 스택으로 풀었습니다!
  1. 결국 뒤에서부터 다루되, 문자를 추가하는 여부는 마지막 스택의 문자를 비교하면 되기 때문입니다.
  1. 따라서 스택에서 문자를 뺍니다.
  1. 특정 문자가 들어온다면, 현재 스택의 tail에 조건에 맞는 다른 문자가 있는지를 찾습니다.
  1. 따라서 이를 계속 처리해 나가면서, 스택이 모두 빌 때까지 실행합니다.
  1. 결과 값을 리턴합니다.
 
효성
const symbols = { "I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000 }; var romanToInt = function(s) { let sum = 0; for(let i=0; i<s.length; i++) { symbols[s[i]] < symbols[s[i+1]] ? sum -= symbols[s[i]] : sum+= symbols[s[i]] } return sum; }
  1. Roman 값을 객체로 저장합니다.
  1. 주어진 string의 첫 번째 값(i)과 두 번째 값(i+1)을 비교합니다.
  1. 두 번째 값이 클 경우 i 값을 빼고, 작을 경우 i 값을 더합니다.
💡
Roman이 int가 되는 방식을 생각하면 각 자리마다 덧셈, 뺄셈 문제임을 알 수 있음.
😰
if문으로 예외처리를 하려고 하다보니 조건이 복잡해져서 포기했음.
은찬
var romanToInt = function(s) { const map = new Map(); const length = s.length; let answer = 0; map.set("I", 1); map.set("IV", 4); map.set("IX", 9); map.set("V", 5); map.set("X", 10); map.set("XL", 40); map.set("XC", 90); map.set("L", 50); map.set("C", 100); map.set("CD", 400); map.set("CM", 900); map.set("D", 500); map.set("M", 1000); for(let i = 0; i < s.length; i++){ const s1 = map.get(s.slice(i, i + 1)); const s2 = map.get(s.slice(i, i + 2)); if(s2){ answer += s2; i++; } else{ answer += s1; } } return answer; };
Map을 활용해 문제를 풀었습니다.
문자가 나올 수 있는 경우의 수가 많지 않기 때문에 일일이 map에 넣었습니다.
그 후 for문을 이용해 주어진 문자열 s를 하나씩 탐색합니다.
 
s1은 현재 인덱스에서 문자 하나를 뗀 문자열을 키로 가지는 value를 가집니다.
s2는 현재 인덱스에서 문자 두 개를 뗀 문자열을 키로 가지는 value를 가집니다.
 
만약 s2가 있으면 해당 키를 가지는 value의 값을 answer에 더하고, i 인덱스를 하나 더 플러스 해줍니다.(문자 2개를 읽었기 때문에)
 
만약 s2가 undefined로 나오면 문자 하나만 맵에 있다는 뜻이기 때문에 해당 값을 answer에 더해줍니다.
 
for문을 모두 돌면 answer를 리턴해줍니다.