상세 컨텐츠

본문 제목

[Java]연습문제5 - 로마숫자 정수로 변환

Java/제로베이스

by Gopythor 2023. 1. 8. 05:51

본문

728x90
반응형

Practice1

문제 설명

로마 숫자 표기를 정수형으로 변환하는 프로그램을 작성하세요.

로마 숫자 표기법은 I, V, X, L, C, D, M 으로 이루어져있다.

로마 숫자

로마숫자 정수형
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

로마 숫자 표기 방식

  • 큰 기호에서 작은 기호 방향으로 작성 (XI, VI, II, ...)
  • 다음의 경우 작은 기호가 큰 기호 앞에 올 수 있다.
    • I 는 V 와 X 의 앞에 올 수 있다. (IV: 4, IX: 9)
    • X 는 L 과 C 의 앞에 올 수 있다. (XL: 40, XC: 90)
    • C 는 D 와 M 의 앞에 올 수 있다. (CD: 400, CM: 900)

입출력 예시

입력 출력
"III" 3
"IV" 4
"VI" 6
"XIII" 13
"XXVI" 26
"MCMXCIV" 1994

 

모범코드

public static void solution(String s) {
    HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
    hm.put('I',1);
    hm.put('V',5);
    hm.put('X',10);
    hm.put('L',50);
    hm.put('C', 100);
    hm.put('D', 500);
    hm.put('M', 1000);

    int sum = 0;
    char[] arr = s.toCharArray();
    for (int i = 0; i < arr.length-1; i++) {
        if (hm.get(arr[i])<hm.get(arr[i+1])){
            sum -= hm.get(arr[i]);
        } else {
            sum += hm.get(arr[i]);
        }
    }
    sum += hm.get(arr[arr.length-1]);
    System.out.println(sum);
}
  • 코드가 너무 간결해서 놀랐다.
  • 로마숫자를 계산하는 공식아닌 공식이 있는지 몰랐다.
  • 왼쪽이랑 오른쪽이랑 비교해서 오른쪽이 크면 왼쪽 숫자를 합에서 뺀다.
  • 오른쪽이 크면 오른쪽 숫자를 더한다.
  • 마지막에는 혼자 남으니 그냥 더해준다.

내 코드

public static void solution(String s) {
    HashMap<String, Integer> hm = new HashMap<String, Integer>();
    hm.put("I",1);
    hm.put("V",5);
    hm.put("X",10);
    hm.put("L",50);
    hm.put("C", 100);
    hm.put("D", 500);
    hm.put("M", 1000);

    char []roman = s.toCharArray();
    int suma = 0;
    for (int i = 0; i< roman.length; i++){
        //I 부분 구분
        if(roman[i]=='I'&& i < roman.length-1){
            if (roman[i+1]=='V'){
                suma += hm.get("V")-hm.get("I");
                i++;
            } else if (roman[i+1]=='X'){
                suma += hm.get("X")-hm.get("I");
                i++;
            } else{
                suma +=hm.get("I");
            }
        } else if (roman[i]=='I'){
            suma++;
        // X 구현
        } else if (roman[i]=='X'&& i < roman.length-1){
            if (roman[i+1]=='L'){
                suma += hm.get("L")-hm.get("X");
                i++;
            } else if (roman[i+1]=='C'){
                suma += hm.get("C")-hm.get("X");
                i++;
            } else {
                suma += hm.get("X");
            }
        // C 구현
        } else if (roman[i]=='C'&& i < roman.length-1) {
            if (roman[i + 1] == 'D') {
                suma += hm.get("D") - hm.get("C");
                i++;
            } else if (roman[i + 1] == 'M') {
                suma += hm.get("M") - hm.get("C");
                i++;
            } else {
                suma += hm.get("C");
            }
        // M 구현
        } else if (roman[i]=='M') {
            suma +=hm.get("M");
        // V 구현
        } else if(roman[i]=='V'){
            suma +=hm.get("V");
        // L구현
         }else if (roman[i]=='L'){
            suma +=hm.get("L");
        // D 구현
        } else if (roman[i]=='D') {
            suma += hm.get("D");
        }
    }
    System.out.println(suma);
}
728x90
반응형

관련글 더보기

댓글 영역