dongok218 2024. 9. 14. 18:21
package LeetCode;

import java.util.Scanner;

class SymbolData {
    String symbol;
    int num;

    public SymbolData(String symbol, int num) {
        this.symbol = symbol;
        this.num = num;
    }
}

public class Solution {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String word;

        SymbolData[] array = new SymbolData[7];

        array[0] = new SymbolData("I", 1);
        array[1] = new SymbolData("V", 5);
        array[2] = new SymbolData("X", 10);
        array[3] = new SymbolData("L", 50);
        array[4] = new SymbolData("C", 100);
        array[5] = new SymbolData("D", 500);
        array[6] = new SymbolData("M", 1000);

        System.out.println("단어를 입력해주세요: ");

        word = input.nextLine().toUpperCase(); // 입력 문자열을 대문자로 변환

        char[] charArray = word.toCharArray();

        int result = 0;
        int preValue = 0;
        int curValue = 0;

        // 각 문자에 대해 SymbolData 배열을 순회하면서 값을 찾음
        for (int i = 0; i < charArray.length; i++) {
            String currentChar = String.valueOf(charArray[i]);

            // SymbolData 배열을 순회하면서 비교
            for (SymbolData symbolData : array) {

                if (symbolData.symbol.equals(currentChar)) {
                    curValue = symbolData.num;
                }
            }

            if (preValue < curValue && preValue != 0) {
                result += curValue - 2 * preValue; // 이전 값을 빼고 현재 값 더하기
            } else {
                result += curValue;
            }
            preValue = curValue;
        }

        System.out.println("로마 숫자의 정수 값: " + result);

        // Scanner 객체 닫기
        input.close();
    }
}

[내가 풀어본 코드]

 

  1. SymbolData라는 클래스를 만들어 객체를 생성해서 문자와 정수를 같이 저장하려고 했음
  2. SymbolData[] 클래스를 이용한 배열을 만들어 값들을 알맞게 저장
  3. Scanner input = new Scanner(System.in)을 이용해서 사용자의 문자열을 받음
  4. String word로 문자열을 받고 toUpperCase()를 이용해 대문자로 변경해줌
  5. word로 받은 문자열을 문자로 변경해서 배열에 넣기 위해 char[] charArray = word.toCharArray()에서 toCharArray()이용
  6. 반복문을 통해서 현재 비교하고 있는 문자를 currentChar에 집어넣기 위해 Stirng.valueOf(charArray[i])를 이용
  7. array에 접근하기 위해 SymbolData 객체인 symbolData를 하나 생성해줌
  8. array순회하면서 값 비교후 알맞은 value값 curValue에 넣어줌
  9. 만약 preValue가 curValue보다 작다면 result += curValue - 2*preValue를 해주는데 2를 곱해주는 이유는 만약 IV(4)가 입력되었다고 가정해보자. 처음에 I(1)가 더해지면 preValue에 1이 저장되고 result도 1이 된다. 이후에 V(5)가 등장하면서 5에서 1을 뺀 4가 result에 저장되어야 한다. 만약 2를 곱하지 않을경우 원래 1이 저장되어 있었으므로 result값은 1+4인 5가 될 것이다. 따라서 기존에 있던 값도 없애주기 위해 2를 곱해주는 것이다.

 

내 이클립스 환경에선 잘 돌아가는데 LeetCode를 제출해보면 CompileError인 

Line 7: error: cannot find symbol [in __Driver__.java] int ret = new Solution().romanToInt(param_1); ^ symbol: method romanToInt(String) location: class Solution

이런 에러가 뜬다... 아마도 클래스 이름을 Solution이라고 하고 그 안에 method 이름을 romanToint(String)으로 해서 문자열을 받아야 하는거 같다.

 


[다른사람 코드]

출처 : dlee0129.tistory.com

 

문제 풀이

  1. 기본 로마 숫자 7가지와 빼기가 사용되는 6가지 경우에 대해서 HashMap을 사용하여 저장합니다.
  2. 문자열을 순회하며 로마숫자의 값을 찾습니다.
  • 빼기가 사용되는 경우를 찾기위해서 두 글자와, 한 글자로 나눠 탐색을 합니다.
    • 두 글자를 먼저 검사해서 빼기가 사용되는 경우를 먼저 확인할 수 있습니다.

소스코드

private static final Map<String, Integer> romanSymbolMap = new HashMap<>() {
        {
            put("M", 1000);
            put("CM", 900);
            put("D", 500);
            put("CD", 400);
            put("C", 100);
            put("XC", 90);
            put("L", 50);
            put("XL", 40);
            put("X", 10);
            put("IX", 9);
            put("V", 5);
            put("IV", 4);
            put("I", 1);
        }
    };

    public static int romanToInt(String s) {
        int answer = 0;

        for (int idx = 0; idx < s.length(); ) {
            String twoChSubStr = s.substring(idx, Math.min(s.length(), idx + 2));
            String oneChSubStr = s.substring(idx, idx + 1);

            if (romanSymbolMap.containsKey(twoChSubStr)) {
                answer += romanSymbolMap.get(twoChSubStr);
                idx += 2;
            } else {
                answer += romanSymbolMap.get(oneChSubStr);
                idx++;
            }
        }

        return answer;
    }

 

java의 map을 이용해서 한 풀이인데 map에 대한 지식이 부족해서 이런 방식을 생각하지 못했었다. java map에 대해 공부하고 글 쓸 예정이다.