본문 바로가기
알고리즘/백준 문제 풀이

[BOJ/백준] 2608번 로마 숫자 - c++ 풀이

by 미니상미니 2023. 5. 12.
반응형

https://www.acmicpc.net/problem/2608

 

2608번: 로마 숫자

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

www.acmicpc.net

 

 

 

 


  • 문제


해설

규칙만 이해하면 골드5치고는 쉽게 풀 수 있는 구현 문제이다.
많은 조건 검사 외에는 풀 수 있는 방법이 떠오르지 않아 코드가 조금 더럽다.

 

다음 4개의 규칙만 지킨다면 쉽게 풀 수 있다.
1. 큰 숫자를 왼쪽에 작은 숫자를 오른쪽 쓰며, 그 값은 모든 숫자의 값을 더한 값이 된다.

2. V, L, D는 한 번만 사용할 수 있고(10=X, 10≠VV) I, X, C, M은 연속해서 세 번까지만 사용할 수 있다(4=IV, 4≠III)

3. 작은 숫자가 큰 숫자의 왼쪽에 오는 경우는 다음과 같다. IV = 4, IX = 9, XL = 40, XC = 90, CD = 400, CM = 900

    하지만  IV 와 IX 는 같이 쓸 수 없으며 XL 과 XC, CD 와 CM 또한 같이 쓸 수 없다

4. 모든 수는 가능한 적은 개수의 로마 숫자들로 표현해야 한다

 

 

코드

c++

#include <iostream>
#include <map>
#include <cmath>

using namespace std;

map<char, int> roms = {
	{'I', 1},
	{'V', 5},
	{'X', 10},
	{'L', 50},
	{'C', 100},
	{'D', 500},
	{'M', 1000}
};


int romToNumber(string rom) {
	int len = rom.length();
	int ans = 0;
	string temp;
	for(int i = 0; i < len; i++) {
		if(i + 1 != len && roms[rom[i]] < roms[rom[i + 1]]) {
			ans -= roms[rom[i]];
		} else {
			ans += roms[rom[i]];
		}
	}
	
	return ans;
}

int main() {

	string a, b;
	cin >> a >> b;

	int number = romToNumber(a) + romToNumber(b);
	int temp;

	cout << number << '\n';

	string ansRoma = "";
	
	while(number != 0) {
		if(number / 1000 != 0) {
			temp = number / 1000;
			while(temp--) {
				ansRoma += 'M';
			}
			number %= 1000;
		} 
		else if(number / 100 != 0) {
			temp = number/100;
			if(temp == 9) ansRoma += "CM";
			else if(temp == 5) ansRoma += 'D';
			else if(temp == 4) ansRoma += "CD";
			else if(temp > 5) {
				ansRoma += 'D';
				temp -= 5;
				while(temp--) ansRoma += 'C';
			}
			else if(temp < 5) 
				while(temp--) ansRoma += 'C';

			number %= 100;
		} 
		else if(number / 10 != 0) {
			temp = number/10;
			if(temp == 9) ansRoma += "XC";
			else if(temp == 5) ansRoma += 'L';
			else if(temp == 4) ansRoma += "XL";
			else if(temp > 5) {
				ansRoma += 'L';
				temp -= 5;
				while(temp--) ansRoma += 'X';
			}
			else if(temp < 5) 
				while(temp--) ansRoma += 'X';

			number %= 10;
		} else {
			temp = number;
			if(temp == 9) ansRoma += "IX";
			else if(temp == 5) ansRoma += 'V';
			else if(temp == 4) ansRoma += "IV";
			else if(temp > 5) {
				ansRoma += 'V';
				temp -= 5;
				while(temp--) ansRoma += 'I';
			}
			else if(temp < 5) 
				while(temp--) ansRoma += 'I';

			break;
		}
	}

	cout << ansRoma << '\n';

	return 0;
}

 

 

 

 

 

반응형

댓글