-
[APAS] Roman to Integer알고리즘 문제풀이 2020. 3. 29. 17:24
로마 숫자에는 I, V, X, L, C, D, M 등이 존재한다.
각자 1, 5, 10, 50, 100, 500, 1000을 의미하는데, 로마 숫자가 입력으로 제공된 경우, 이를 정수로 변환하는 코드를 작성해보자.
import java.util.HashMap; import java.util.Scanner; public class RomanToInteger { public static void main(String[] args){ HashMap<Character, Integer> romanChar = new HashMap<>(); romanChar.put('I', 1); romanChar.put('V', 5); romanChar.put('X', 10); romanChar.put('L', 50); romanChar.put('C', 100); romanChar.put('D', 500); romanChar.put('M', 1000); System.out.println("로마 숫자를 입력하시오:"); Scanner sc = new Scanner(System.in); String roman = sc.next(); char[] c = new char[roman.length()]; int sum = 0; for(int i = 0; i < roman.length(); i++){ c[i] = roman.charAt(i); } for(int i = 0 ; i < c.length; i++){ switch (c[i]) { case 'I': if((i + 1 <c.length) && (c[i + 1] == 'V' || c[i + 1] == 'X')){ sum += romanChar.get(c[i + 1]) - romanChar.get(c[i]); i++; } else { sum += romanChar.get(c[i]); } break; case 'X': if((i + 1 <c.length) && c[i + 1] == 'L' || c[i + 1] == 'C'){ sum += romanChar.get(c[i + 1]) - romanChar.get(c[i]); i++; } else { sum += romanChar.get(c[i]); } break; case 'C': if((i + 1 <c.length) && c[i + 1] == 'D' || c[i + 1] == 'M'){ sum += romanChar.get(c[i + 1]) - romanChar.get(c[i]); i++; } else { sum += romanChar.get(c[i]); } break; default: sum += romanChar.get(c[i]); break; } } System.out.println(sum); } }
답지의 경우, 로마 숫자가 큰 숫자가 작은 숫자보다 먼저 표현되지만, 빼기의 경우 이례적으로 작은 숫자 다음에 큰 숫자가 나온다는 것을 이용하였다.
public int romanToInt(String s) { int res = 0; for (int i = s.length() - 1; i >= 0; i--) { switch (s.charAt(i)) { case 'M': res += 1000; break; case 'D': res += 500; break; case 'C': res += 100 * (res >= 500 ? -1 : 1); // For CD or CM. break; case 'L': res += 50; break; case 'X': res += 10 * (res >= 50 ? -1 : 1); // For XL or XC. break; case 'V': res += 5; break; case 'I': res += (res >= 5 ? -1 : 1); // For IV or IX. break; default: break; } } return res; }
구조를 잘 파악한 답안이다.
문제에서 얻어가는 점
- 자바스크립트와 달리 String 타입의 경우 반복문을 활용해 직접 탐색하는 방법은 존재하지 않는다. str.charAt(i)와 같은 메소드를 활용하자.
- 자바스크립트의 객체, 파이썬의 딕셔너리는 HashMap을 활용해 작성가능하다.
- 마지막으로 나에 대한 것으로, 문제의 구조에 좀 더 집중하도록 할 필요가 있다.
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스 Level 1] 약수의 합 (0) 2020.01.07 [프로그래머스 Level 1] 소수찾기 (0) 2020.01.07