알고리즘/LeetCode

LeetCode[Java] - Integer to Roman 풀이

곤정이 2021. 4. 3. 22:11
반응형

안녕하세요. Ruk 입니다.

LeetCode medium난이도의 Integer to Roman 의 풀이과정을 한번 작성해보려고 해요.

 

해당 문제는 미디움이지만 이지난이도라고 생각하는데요.

이유는 알고리즘이 복잡하기보단 문제의 해석이 더 중요한 문제였다고 생각하기 때문이에요.

(사실 로마숫자에 대한 이해?)

조건은 간단합니다. Simbol 우리가 아는 그 로마문자 숫자값과 동일합니다.

숫자를 주워졌을 때 해당 로마문자를 반환하는 것이 문제의 핵심입니다.

 

여기서 숫자를 그냥 1, 5, 10, 50 등으로 나누면 쉽겠지만 이 문제는 로마문자라는 함정이 있죠?

네 IV, IX. XL, XC 등 4, 9, 40, 90 등 숫자에 대한 예외가 발생하는 것 입니다.

하지만 IV를 하나의 문자라고 생각하고 숫자 크기별로 큰수부터 %연산을 한다면 문제없이 처리가 가능하겠군요.

 

final String[] symbols = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};

final int[] values = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};

위 2 배열로 각 문자와 숫자를 순서에 맞춰 초기화 시켜둔 뒤

각 배열의 13번째(idx = 12)값 부터 하나씩 비교해나가면서 StringBuilder에 담아주면 되겠습니다.

 

위 문제를 풀 때 저 로마문자의 크기에 대한 고려와 초기화만 생각해낸다면 easy 난이도로 쉽게 풀리는 문제였다고 생각합니다.

가끔 StringBuffer를 쓰시거나 String 에 + 연산을 하는 코드를 종종 보았는데요.

StringBuilder에 append연산을 하는게 문자열 합치는데 좋습니다.

 

StringBuffer에는 스레드 세이프을 위한 synsynchronized가 append 함수에 불필요하게 추가되어 있거든요.

jdk 1.8부터는 +연산도 개선이되어서 java 메모리 구조에 계속 문자를 생성하지 않고

builder로 사용되도록 개선이 되었다고는 하긴 하더라구요.

 

반응형