easy 난이도의 두 번째 문제에 도전해보자.

우선, 생각한 접근법은 분기해야 할 조건이 7개라 7개의 조건문일 일일히 사용하는 것은 비효율이라 생각했다. 그래서 switch-case 문을 사용해 매칭되는 값을 할당할 것이다. 제한 조건은 따로 방법이 생각나지 않아서 if 문으로 분기처리할 것이다.
class Solution {
public int romanToInt(String s) {
char[] charArr = s.toCharArray();
int sum = 0;
for (int i = 0; i < s.length(); i++) {
char n = charArr[i];
int temp = 0;
switch (n) {
case 'I':
temp = 1;
break;
case 'V':
temp = 5;
break;
case 'X':
temp = 10;
break;
case 'L':
temp = 50;
break;
case 'C':
temp = 100;
break;
case 'D':
temp = 500;
break;
case 'M':
temp = 1000;
break;
// 제한 조건에 모든 n의 값이 case문에 걸림. default는 없어도 됨.
default:
break;
}
if (i != 0 && (n == 'V' || n == 'X')) {
System.out.println("V or X");
if (charArr[i - 1] == 'I') {
System.out.println("before I");
if (n == 'V') {
temp = 4;
System.out.println(temp);
} else {
temp = 9;
}
}
} else if (i != 0 && (n == 'L' || n == 'C')) {
System.out.println("L or C");
if (charArr[i - 1] == 'X') {
System.out.println("before X");
if (n == 'L') {
temp = 40;
} else {
temp = 90;
System.out.println(temp);
}
}
} else if (i != 0 && (n == 'D' || n == 'M')) {
System.out.println("D or M");
if (charArr[i - 1] == 'C') {
System.out.println("before C");
if (n == 'D') {
temp = 400;
} else {
temp = 900;
System.out.println(temp);
}
}
}
System.out.println(temp);
sum += temp;
}
return sum;
}
}
결과 코드다. TC3이 통과하지 않는다..

이유를 찾아보자.

print를 통해 더해지는 temp 값들을 추적해 sum에 어떻게 더해지는지 정리했다.

노트로 과정을 적으면서 확인하니 추가적으로 더해지는 부분이 있었다. 머리로 생각할때는 복잡해서 그냥 생각나는 코드 아무데나 넣고 돌려서 허무하게 시간을 낭비했는데 확실히 노트에 정리하면서 하니 생각이 정리되어 논리적으로 접근을 할 수 있다. 디버깅 최고..
코드 보면서 어떻게 하지? 라는 생각으로 여러 번 시도하면서 30분 이상의 시간을 낭비했는데 이렇게 하니까 바로 통과가 되었다!
if (i != 0 && (n == 'V' || n == 'X')) {
System.out.println("V or X");
if (charArr[i - 1] == 'I') {
sum -= 1;
System.out.println("before I");
if (n == 'V') {
temp = 4;
System.out.println(temp);
} else {
temp = 9;
}
}
} else if (i != 0 && (n == 'L' || n == 'C')) {
System.out.println("L or C");
if (charArr[i - 1] == 'X') {
sum -= 10;
System.out.println("before X");
if (n == 'L') {
temp = 40;
} else {
temp = 90;
System.out.println(temp);
}
}
} else if (i != 0 && (n == 'D' || n == 'M')) {
System.out.println("D or M");
if (charArr[i - 1] == 'C') {
sum -= 100;
System.out.println("before C");
if (n == 'D') {
temp = 400;
} else {
temp = 900;
System.out.println(temp);
}
}
}
"CM"같은 로마 숫자가 나올 때 C가 추가적으로 더해진다. 그 조건일때 더해지는 값을 빼주는 코드를 추가했다.

0.58퍼의 사나이.. 😭
내 수준이다. 아직은 더 나은 방법은 생각나지 않는다. 더 나은 방법이 생각날 때까지 꾸준히 해보자.
개인적 커멘트
※ switch-case를 생각해 낸 것 < python을 사용해 웹 개발을 하는데 python에는 switch-case가 없다.
※ if (i != 0 && (n == 'V' || n == 'X')) < 첫 번째 원소일 때는 뒤 조건을 보지 않게 하기 위해 추가했다.
※ String.toCharArray()를 잊지 않고 쓴 것
조심해야 할 것
※ if (i != 0 && (n == 'V' || n == 'X')) > js와 python에 익숙하다보니 type 지정이 익숙하지 않다.