다희의 코딩 성장일기

[백준] 2608. 로마 숫자 (자바 JAVA) 본문

Algorithm/백준 BOJ

[백준] 2608. 로마 숫자 (자바 JAVA)

ilmiodiario 2021. 9. 29. 23:27

[ 문제 ]  [백준] 2608. 로마 숫자 (자바 JAVA)

 

문제 링크 : https://www.acmicpc.net/problem/2608

 

2608번: 로마 숫자

첫째 줄과 둘째 줄에 하나씩 로마 숫자로 표현된 수가 주어진다. 입력된 각 수는 2000 보다 작거나 같고, 두 수의 합은 4000보다 작다.

www.acmicpc.net


# 접근 방법 및 풀이 

 

  • 문자열+구현+자료구조 문제다. 
  • 문제 제대로 안 읽고 규칙 대충 넘기고 풀었더니 완전 잘못 접근해서 다시 꼼꼼히 읽고 풀었다.
  • 문제는 주어진 두개의 로마숫자를 더해 숫자로 표현하고, 해당 숫자를 다시 로마숫자로 표현해야한다.
  • 따라서 makeNum(), makeString() 함수를 두개로 나눠 풀었다.
  • 로마숫자 기호에 따라 숫자값이 있으므로 HashMap에 key = 기호, value = 숫자 값 형태로 담았다.
  • 이때 규칙을 보면 "IV = 4, IX = 9, XL = 40, XC = 90, CD = 400, CM = 900"도 있으므로 기존 표와 함께 HashMap에 담았다.
  • 먼저, 두 로마숫자를 더해 숫자로 만드는 방법은 다음과 같다.
  • String A[], B[]로 두 문자열을 문자열 배열로 입력받는다. 주어진 문자열 배열을 한글자씩 뽑아 key값으로 value를 더해준다.
  • 이때 주의할 점은 "IV, IX, XL, XC, CD, CM" 일 경우다. 한글자씩 탐색할때 "I, X, C"가 들어있을 경우, 그 다음글자까지 확인해서 "IV, IX, XL, XC, CD, CM" 경우인지 확인하고, 맞다면 해당 문자열을 key값으로 value를 더해주면 된다.
  • 다음 구한 더한 값을 로마숫자로 만드는 방법은 다음과 같다.
  • HashMap을 value기준 내림차순으로 정렬한다. 그럼 1000 > 500 > 400 > 100 등등 순으로 정렬이 된다
  • 가장 큰 1000부터 구한숫자를 나눠 을 구하고, 그 몫의 크기만큼 key값 즉, 문자열을 더해주면 된다. 그리고 나머지를 다시 숫자에 대입해 반복해서 해당 숫자가 0이 될때까지 계산한다.
  • 예시대로 2493을 1000으로 나누면, 몫은 2고 나머지는 493이다. 이때 1000의 key값인 M을 몫의 크기인 2만큼 더해주면 "MM"이된다.
  • 나머지를 다시 숫자에 대입해 493에서, 400으로 나누면 몫은 1, 나머지는 93이된다. 이때 400의 key값인 CD를 몫의 크기인 1만큼 더해 "MMCD"가 된다.
  • 이런 방식으로 숫자가 0이 될때 까지 반복하면 된다.
  • 자세한건 코드참조

# 주의할 점 

 

  • 문제 꼼꼼히 읽기

 

JAVA 코드
package Silver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

public class bj2608_로마숫자 {
	static HashMap<String, Integer> map;
	static int ans1 = 0;
	static String ans2 = "";
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String A[] = in.readLine().split("");
		String B[] = in.readLine().split("");
		map = new HashMap<String, Integer>();
		map.put("I", 1);
		map.put("IV", 4);
		map.put("V", 5);
		map.put("IX", 9);
		map.put("X", 10);
		map.put("XL", 40);
		map.put("L", 50);
		map.put("XC", 90);
		map.put("C", 100);
		map.put("CD", 400);
		map.put("D", 500);
		map.put("CM", 900);
		map.put("M", 1000);
		makeNum(A);
		makeNum(B);
		makeString(ans1);
		System.out.println(ans1);
		System.out.println(ans2);
	}
	
	private static void makeString(int num) {
		List<Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
		list.sort(Entry.comparingByValue(Collections.reverseOrder()));
		while(num != 0) {
			int quo = 0;
			for (Entry<String, Integer> entry : list) {
				quo = num/entry.getValue();
				if(quo != 0) {
					for (int i = 0; i < quo; i++) {
						ans2 += entry.getKey();
					}
					num = num%entry.getValue();
					break;
				}
			}
		}
	}

	private static void makeNum(String[] arr) {
		for (int i = 0; i < arr.length; i++) {
			char c = arr[i].charAt(0);
			if ((c == 'I' || c == 'X' || c == 'C') && i < arr.length - 1) {
				String s = arr[i] + arr[i + 1];
				if (map.containsKey(s)) {
					ans1 += map.get(s);
					i++;
					continue;
				}
			}
			ans1 += map.get(arr[i]);
		}		
	}
}

 

 

 

REVIEW

Comments