[알고리즘] 13. Roman to Integer

Fekim·2022년 1월 17일
0

ps

목록 보기
3/48

문제 정의

  • 문자열 하나를 입력받아, 정수 하나를 반환하는 함수를 구현한다.

  • 문자열은 I,V,X,L,C,D,M 중 알파벳의 조합으로 이루어져 있다.

  • 정수의 값은 아래의 표에 따라, 문자열에 존재하는 알파벳의 값을 각각 모두 더한 값이다.

    Symbol Value
    I 1
    V 5
    X 10
    L 50
    C 100
    D 500
    M 1000
  • 단, 예외적으로 아래의 규칙이 존재한다.

    • I는 V와 결합하여 4가 되고, X와 결합하여 9가 된다. ex) IV = 4, IX = 9
    • X는 L과 결합하여 40이 되고, C와 결합하여 90이 된다. ex) XL = 40, XC = 90
    • C는 D와 결합하여 400이 되고, M과 결합하여 900이 된다. ex) CD = 400, CM = 900

풀이

package _13RomanToInteger;
import java.util.HashMap;
import java.util.Map;

public class RomanToInteger
{
    public int romanToInt(String s)
    {
        HashMap<Character, Integer> map_c = new HashMap<Character, Integer>();
        HashMap<String, Integer> map_s = new HashMap<String, Integer>();

        int sum = 0;
        char temp[] = new char[2];

        map_c.put('I', 1);
        map_c.put('V', 5);
        map_c.put('X', 10);
        map_c.put('L', 50);
        map_c.put('C', 100);
        map_c.put('D', 500);
        map_c.put('M', 1000);

        map_s.put("IV", 4);
        map_s.put("IX", 9);
        map_s.put("XL", 40);
        map_s.put("XC", 90);
        map_s.put("CD", 400);
        map_s.put("CM", 900);

        if(s.length() == 1)
            sum += map_c.get(s.charAt(0));
        else
        {
            for(int i= 0; i < s.length(); ++i)
            {
                if(i < s.length()-1)	// (1) 예외처리
                {
                    temp[0] = s.charAt(i);
                    temp[1] = s.charAt(i+1);
                }

                String temp_new = new String(temp);

                if(map_s.containsKey(temp_new))
                {
                    sum+= map_s.get(temp_new);
                    i++;
                    temp[0] = ' ';
                    temp[1] = ' ';
                }
                else
                    sum += map_c.get((s.charAt(i)));

            }
        }


        return sum;
    }
}
  • 단일문자의 <Key,Value>가 저장될 해쉬맵과 이중문자의 <Key,Value>가 저장될 해쉬맵을 각각 만든다.
  • for loop에서 현재의 i값과 i+1을 동시에 사용하기 때문에, (1) 에서 index Out of bound 예외처리를 하였다.
  • 문자열이 이중문자(IV, IX ....)를 가지고 있다면, for loop에서 index를 두칸 점프하는 알고리즘으로 문제를 풀었다.
profile
★Bugless 2024★

0개의 댓글