알고리즘
[백준] BOJ2608 - 로마 숫자 (JAVA)
애용쓰
2023. 4. 13. 01:40
https://www.acmicpc.net/problem/2608
2608번: 로마 숫자
첫째 줄과 둘째 줄에 하나씩 로마 숫자로 표현된 수가 주어진다. 입력된 각 수는 2000 보다 작거나 같고, 두 수의 합은 4000보다 작다.
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Solution
{
static HashMap<String, Integer> hash;
static int getNum(String[] num){
int sum = 0;
for(int i=0;i<num.length;i++){
char tmp = num[i].charAt(0);
if((tmp=='I'||tmp=='X'||tmp=='C')&&i<num.length-1){
String s = num[i]+num[i+1];
if(hash.containsKey(s)){
sum+=hash.get(s);
i++;
continue;
}
}
sum+=hash.get(num[i]);
}
return sum;
}
static String getRoma(int num){
List<Map.Entry<String, Integer>> list = new ArrayList<>(hash.entrySet());
list.sort(Map.Entry.comparingByValue(Collections.reverseOrder()));
String ans = "";
while(num>0){
int tmp = 0;
for(Map.Entry<String, Integer> entry : list){
tmp = num / entry.getValue(); //내림차순 정렬해서 큰 수부터 하나씩 숫자 나눠보기
for(int i=0;i<tmp;i++){
ans+=entry.getKey(); // 몫 만큼 반복해서 문자열 생성
}
num = num % entry.getValue(); // 나머지 갱신
}
}
return ans;
}
public static void main(String args[]) throws Exception
{
hash = new HashMap<>();
hash.put("I",1);
hash.put("IV",4);
hash.put("V",5);
hash.put("IX",9);
hash.put("X",10);
hash.put("XL",40);
hash.put("L",50);
hash.put("XC",90);
hash.put("C",100);
hash.put("CD",400);
hash.put("D",500);
hash.put("CM",900);
hash.put("M",1000);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] a = br.readLine().split("");
String[] b = br.readLine().split("");
int sum = getNum(a) + getNum(b);
String ans = getRoma(sum);
System.out.println(sum);
System.out.println(ans);
}
}
주어진 기호를 hashMap 에 저장한다.
로마숫자를 아라비아 숫자로 바꾸는 getNum함수와 아라비아 숫자를 로마숫자로 바꾸는 getRoma함수를 구현했다.
<getNum함수>
조건에 따라 i번째 문자가 I또는 X또는 C이면서 마지막 글자가 아니면 그 다음 글자까지 붙여서 hashmap에 존재하는지 확인하고 존재한다면 sum에 더하고 i를 증가시키고 continue한다.
기본 조건은 sum에 hashmap에서 i번째 문자에 해당하는 value를 찾아 더하는 것이다.
<getRoma함수>
hashMap을 value 기준으로 내림차순 정렬을 시킨다. 그럼 큰 숫자 순으로 정렬이 될 것인데 이 때 hashmap의 value값을 하나씩 돌며 입력 값을 나눠 몫만큼 해당 key를 문자열에 더해준다.
입력값은 hashmap의 value로 나눈 나머지로 갱신해준다.
입력값이 0이 될 때까지 반복한다.
hashMap을 key기준, value 기준으로 정렬하는 방법을 꼭 기억하고 있어야겠다.