안녕하세요. 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로 사용되도록 개선이 되었다고는 하긴 하더라구요.
'알고리즘 > LeetCode' 카테고리의 다른 글
LeetCode[Java] - Next Permutation 풀이 (0) | 2021.04.06 |
---|---|
LeetCode[Java] - Median of Two Sorted Arrays 풀이 (0) | 2021.04.02 |
LeetCode[Java] - Longest Palindromic Substring 풀이 (0) | 2021.04.01 |
LeetCode[Java] - Longest Substring Without Repeating Characters 풀이 (0) | 2021.04.01 |
LeetCode[Java] - Add Two Numbers 풀이 (0) | 2021.04.01 |