CodingTest/LeetCode(with Java)
Roman to Integer
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();
}
}
[내가 풀어본 코드]
- SymbolData라는 클래스를 만들어 객체를 생성해서 문자와 정수를 같이 저장하려고 했음
- SymbolData[] 클래스를 이용한 배열을 만들어 값들을 알맞게 저장
- Scanner input = new Scanner(System.in)을 이용해서 사용자의 문자열을 받음
- String word로 문자열을 받고 toUpperCase()를 이용해 대문자로 변경해줌
- word로 받은 문자열을 문자로 변경해서 배열에 넣기 위해 char[] charArray = word.toCharArray()에서 toCharArray()이용
- 반복문을 통해서 현재 비교하고 있는 문자를 currentChar에 집어넣기 위해 Stirng.valueOf(charArray[i])를 이용
- array에 접근하기 위해 SymbolData 객체인 symbolData를 하나 생성해줌
- array순회하면서 값 비교후 알맞은 value값 curValue에 넣어줌
- 만약 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
문제 풀이
- 기본 로마 숫자 7가지와 빼기가 사용되는 6가지 경우에 대해서 HashMap을 사용하여 저장합니다.
- 문자열을 순회하며 로마숫자의 값을 찾습니다.
- 빼기가 사용되는 경우를 찾기위해서 두 글자와, 한 글자로 나눠 탐색을 합니다.
- 두 글자를 먼저 검사해서 빼기가 사용되는 경우를 먼저 확인할 수 있습니다.
소스코드
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에 대해 공부하고 글 쓸 예정이다.