다희의 코딩 성장일기
[백준] 2608. 로마 숫자 (자바 JAVA) 본문
[ 문제 ] [백준] 2608. 로마 숫자 (자바 JAVA)
문제 링크 : https://www.acmicpc.net/problem/2608
# 접근 방법 및 풀이
- 문자열+구현+자료구조 문제다.
- 문제 제대로 안 읽고 규칙 대충 넘기고 풀었더니 완전 잘못 접근해서 다시 꼼꼼히 읽고 풀었다.
- 문제는 주어진 두개의 로마숫자를 더해 숫자로 표현하고, 해당 숫자를 다시 로마숫자로 표현해야한다.
- 따라서 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
'Algorithm > 백준 BOJ' 카테고리의 다른 글
[백준] 9177. 단어 섞기 (자바 JAVA) (0) | 2021.12.16 |
---|---|
[백준] 2578. 빙고 (자바 JAVA) (0) | 2021.10.06 |
[백준] 1967. 트리의 지름 (자바 JAVA) (0) | 2021.09.27 |
[백준] 2800. 괄호 제거 (자바 JAVA) (0) | 2021.09.26 |
[백준] 10451. 순열 사이클 (자바 JAVA) (0) | 2021.09.25 |
Comments