📑 문제

✏️ 풀이
재영
/** * @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))
저는 스택으로 풀었습니다!
- 결국 뒤에서부터 다루되, 문자를 추가하는 여부는 마지막 스택의 문자를 비교하면 되기 때문입니다.
- 따라서 스택에서 문자를 뺍니다.
- 특정 문자가 들어온다면, 현재 스택의 tail에 조건에 맞는 다른 문자가 있는지를 찾습니다.
- 따라서 이를 계속 처리해 나가면서, 스택이 모두 빌 때까지 실행합니다.
- 결과 값을 리턴합니다.
효성
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; }
- Roman 값을 객체로 저장합니다.
- 주어진 string의 첫 번째 값(i)과 두 번째 값(i+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를 리턴해줍니다.