LeetCode | 13. Roman to Integer (Java)

usuyn·2021년 9월 24일

알고리즘

목록 보기
12/12

문제에 대한 자세한 정보는 LeetCode | 13. Roman to Integer에서 확인할 수 있다.


풀이

처음에는 문제를 엉뚱하게 해석해서 복잡하게 풀다가 다시 읽어보고 푼 문제다.
로마 숫자는 보통 왼쪽에서 오른쪽으로 가장 큰 숫자부터 쓰는데 이 경우에는 symbol에 따른 value를 각각 더해주면 된다.
하지만 4는 IIII가 아닌 I(1)V(5)이다. V는 5이고 1인 I를 빼서 IV(4)가 되는 것이다. 왼쪽에서 가장 큰 숫자부터 쓴 경우가 아니다. symbol에 따른 value를 더해주는 것이 아닌 빼줘야 한다.

  1. HashMap<character, Integer> map을 생성하고 각 symbol과 value를 저장한다.
  2. 답으로 return될 output 변수에 입력되는 문자열 맨 오른쪽(s.length() - 1) symbol의 value를 대입한다.
  3. 입력되는 문자열의 (s.length() - 2) symbol부터 아래 과정을 for문을 통해 반복한다.
    3-1. 현재(i) symbol의 value >= 오른쪽(i+1) symbol의 value이면 output에 현재 symbol의 value를 더해준다.
    3-2. 현재(i) symbol의 value < 오른쪽(i+1) symbol의 value이면 output에 현재 symbol의 value를 빼준다.

소스코드

class Solution {
    public int romanToInt(String s) {
	int output = 0;
	HashMap<Character, Integer> map = new HashMap<>();

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

	output = map.get(s.charAt(s.length() - 1));      
        
        for(int i = s.length() - 2; i >= 0; i--) {
            if(map.get(s.charAt(i)) >= map.get(s.charAt(i + 1)))
                output += map.get(s.charAt(i));
            else
                output -= map.get(s.charAt(i));
        }

        return output;
    }
}

메모리, 시간

Memory Usage : 39.5 MB, less than 57.51% of Java online submissions for Roman to Integer.

Runtime : 5 ms, faster than 69.39% of Java online submissions for Roman to Integer.


풀이 후

백준과는 달리 문제가 전부 영어로 되어있기 때문에 문제 읽는 시간이 조금 더 걸린다. 난이도는 Easy라고 되어있는데 나한테 Easy하지 않은 문제도 있다... 문제를 풀고 Discuss에서 다른 사람의 풀이를 보거나 여러 의견을 읽는 것도 중요한 것 같다.

profile
https://select-dev-from.tistory.com 로 이사 중

0개의 댓글