13 . 로마에서 정수로
 
로마 숫자는 I,V, X, L, C, D, M 의 7가지 기호로 표시됩니다.
 
I: 1,
 V: 5,
X: 10,
 L: 50,
C: 100,
D: 500,
M: 1000,
예를 들어 로마 숫자 II는 1을 2개 더하면 됩니다.
XII. 간단히 X + II로 12가 됩니다. 

로마 숫자는 일반적으로 왼쪽에서 오른쪽으로 큰 순서로 씁니다.
그러나 4의 숫자는 가 아닙니다 IIII. 대신 숫자 4는 IV. 1이 5보다 앞에 있기 때문에 빼면 4가 됩니다.
같은 원리가 9라는 숫자에도 적용됩니다 IX. 빼기가 사용되는 경우는 6가지입니다.

IV(5)와 X(10) 앞에 배치하여 4와 9를 만들 수 있습니다 .
XL(50)과 (100) 앞에 배치하여 C40과 90을 만들 수 있습니다.
CD(500)과 M(1000) 앞에 400과 900을 만들 수 있습니다.
로마 숫자가 주어지면 정수로 변환하십시오.

예 1:

입력: s = "III"
출력: 3
설명: III = 3.
예 2:

입력: s = "LVIII"
출력: 58
설명: L = 50, V= 5, III = 3.
예 3:

입력: s = "MCMXCIV"
출력: 1994
설명: M = 1000, CM = 900, XC = 90 및 IV = 4.

 
문제정리
*로마숫자는 I,V,X,L,C,D,M의 7가지 기호로 표시된다.

문제의 조건 
로마 숫자는 왼쪽에서 오른쪽으로 쓴다.빼기규칙이 존재한다.
1. IV = 4, IX = 9. XL = 40, XC = 90. CD = 400, CM = 900

생각한 풀이방법
1. 로마글자를 저장할 객체를 만들어준다.
2. s문자열의 i번째와 s문자열의 i+1번째를 반복문과 조건문으로 비교해준다.
3. 우선 빼기 조건일 때, 만약에 s 문자열의 i번째보다 s 문자열의 i+1번째 문자열이 더 큰 경우, 빼기 규칙에 포함되는 조건이기 때문에 value 변수 값에서 s 문자열의 i번째 값을 뺀다.
4. 빼기조건이 성립되지않으면 value 변수에 그대로 s문자열의 i번째 (앞에있는 문자열)값을 더해준다.

*value 변수를 for문 밖에서 선언한이유는 for문 안에서 value를 선언하면 반복문을 도는 동안에 
계속해서 value변수는 0이 되어버리기 때문에 누적 값을 계산할 수 없기 때문이다.
 

 

작성코드📍

   function romanToInt(s) {
        roman = {
          //객체를 만들어서, 로마문자에 대응하는 값을 넣어준다. key:value 형태로 저장
          I: 1,
          V: 5,
          X: 10,
          L: 50,
          C: 100,
          D: 500,
          M: 1000,
        };
        let result = 0; //result를 0으로 초기화
        for (let i = 0; i < s.length; i++) {
          //s의 길이만큼 반복
          if (roman[s[i]] < roman[s[i + 1]]) {
            /roman[s[i]]은 i가 0이고 s[i]가 'M'인 경우, romanValue[s[i]]는 romanValue['M']이 된다.
            //이 경우, romanValue 객체에 따르면 'M'은 1000에 해당하므로, romanValue[s[i]]의 값은 1000이 된다.
            //roman[s[i + 1]]은 s가 "MCMXCIV"라면, s[0]은 "M", s[1]은 "C"이다.
            result = result - roman[s[i]]; //result에 roman[s[i]]를 빼준다.
          } else {
            result = result + roman[s[i]]; //result에 roman[s[i]]를 더해준다.
          }
        }
        return result;
      }
      let s = "VV";
      console.log(romanToInt(s));
      
      //출력값 10
 

1. 로마문자를 넣을 객체를 만들어 각 문자를 넣어준다. 

객체로 만들어준 이유는 배열을 사용할 경우, 숫자와 문자 간의 매핑을 검색하는데 알고리즘이 필요하므로, 최악의 경우 시간 복잡도가 O(n)이 될 수 있습니다. 따라서, 배열보다는 검색 성능이 뛰어난 객체(object)를 사용하는 것이 더 효율적,

객체를 사용하면, 숫자와 문자 간의 매핑을 검색하는 데 상수 시간(시간 복잡도 O(1))만큼 걸리므로, 배열보다 더 빠르고 효율적인 검색이 가능합니다.

또한, 객체는 중복된 키를 가질 수 없으므로, 로마 숫자의 각 문자가 유일한 키(key)가 됩니다. 이러한 이유로, 이 코드에서는 객체를 사용하여 로마 숫자와 아라비아 숫자 간의 매핑을 구현했습니다. 

 

2. result를 0으로 초기화 한다.

이 코드에서 result변수는 로마 숫자 문자열에서 아라비아 숫자로 변환한 값을 저장하는 변수입니다. result 변수를 0으로 초기화하는 이유는, 로마 숫자 문자열에서 아라비아 숫자로 변환한 값을 누적하여 더해나가기 위함입니다.

 

3. 반복문을 사용하여 s의 길이반큼 반복시킨다.

 

4. roman[s[i]] < roman[s[i + 1]] 조건문을 사용하여 현재 문자가 다음 문자보다 작은 경우를 판단해준다.

예를들어 s="MCDL"라고 할때,

roman[s[i]] === M

roman[s[i+1]] === C 이 된다. 

M은 1000, C는 100 으로 roman[s[i]] < roman[s[i+1]] 조건에 해당하지않아

result는 M(1000)이 된다. C(100)와 D(500)는 조건이 성립되고, 

500-100은 400으로 result = 1000 + 400 이 된다.

마지막으로 D(500)와 L(50)을 비교하면, 조건에 해당하지않아 

50을 반환하고, 최종적으로 result = 1000 + 400 + 50 으로 1450이 출력된다.

 

 

let sum = 0;

for (let i = 1; i <= 10; i++) {

sum += i;

}

console.log(sum); // 55

result에 for문 계산값이 누적 되는 이유?

 

for 루프는 1부터 10까지의 정수를 반복하면서 i 변수에 순차적으로 할당합니다. 루프의 코드 블록에서는 sum 변수에 현재 숫자 i를 더하여 sum 변수를 업데이트합니다. 즉, 각 루프 반복에서 sum 변수는 새로운 값으로 업데이트됩니다.

따라서 루프가 완료되면 sum 변수는 모든 숫자의 합인 55를 갖게 됩니다. 이와 같이, for 루프 내에서 변수를 업데이트하여 변수 값을 누적시키는 것이 가능합니다.

 

'알고리즘 > leetCode' 카테고리의 다른 글

[leetcode] Remove Duplicates from Sorted Array  (0) 2023.03.12
[leetCode] Valid Parentheses  (0) 2023.03.09
[leetCode] Longest Common Prefix  (0) 2023.03.07
[leetcode] palindrome Number  (0) 2023.02.27
[leetcode] Two Sum  (0) 2023.02.27
복사했습니다!