ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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을 활용해 작성가능하다.
    • 마지막으로 나에 대한 것으로, 문제의 구조에 좀 더 집중하도록 할 필요가 있다.

     

     

    댓글

Designed by Tistory.