코드카타 2주차 #1

김태현·2020년 11월 9일
0

코드카타

목록 보기
6/9
post-thumbnail

*문제
로마자에서 숫자로 바꾸기

1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요.
로마 숫자를 숫자로 표기하면 다음과 같습니다.

Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 됩니다.
III = 3
XII = 12
XXVII = 27
입니다.

그런데 4를 표현할 때는 IIII가 아니라 IV 입니다.
뒤의 숫자에서 앞의 숫자를 빼주면 됩니다.
9는 IX입니다.

I는 V와 X앞에 와서 4, 9
X는 L, C앞에 와서 40, 90
C는 D, M앞에 와서 400, 900

const romeTable = {
	"I": 1,
    "V": 5,
    "X": 10,
    "L": 50,
    "C": 100,
    "D": 500,
    "M": 1000,
}

function romanToNum(romestr) {
	let s = 0, sum = 0;
    while(s < romestr.length) {
    	if(s < romestr.length - 1 && romeTable[romestr[s]] < romeTable[romestr[s+1]]) { // 끝자리 보다 작고 && 
        sum += romeTable[romestr[s+1]] - romeTable[romestr[s]];
        s += 2; // 두 칸을 뜀
        } else sum += romeTable[romestr[s++]];
    }
    return sum;
}

romanToNum('CCIL');

let s = 0, sum = 0;

일단 반복문을 돌리기 위해서 s랑 sum 변수를 선언하고 초기화 한다,
s는 입력받은 문자열의 인덱스, sum은 우리가 return할 총합이다!

s < romestr.length - 1 && romeTable[romestr[s]] < romeTable[romestr[s+1]]
가장 끝자리 인덱스가 아니어야 하고 && 입력받은 문자열의 인접한 값을 비교해서 뒤에 값이 더 크면
sum += romeTable[rome[s+1]] - romeTable[romestr[s]];
뒤에서 앞에 값을 빼서 총합을 누적시킨다!
s += 2;
이 부분은 2칸을 건너뛴다는 소리인데
만약 들어온 문자열이 "CCIL" 이면
C와 C를 비교해서 합을 그냥 더하고, 그 다음에 C와 I를 비교해서 더하고, 그리고 I와 L을 비교하는데 뒤에값 L이 I보다 크므로 두 칸을 뛴다는 소리이다.

그것이 아니라면
else sum += romeTable[romestr[s++]] 인접한 값들끼리 차례대로 쭉 더한다

느낀점
알고리즘 너무 어렵다
쉬운 문제라는데 어렵다
나만 어렵다
나는 바보다

profile
프론트엔드 개발자

0개의 댓글