반응형
https://www.acmicpc.net/problem/2608
- 문제
해설
규칙만 이해하면 골드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;
}
반응형
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[BOJ/백준] 2743번 단어 길이 재기 - [c/c++] 풀이 (0) | 2023.05.12 |
---|---|
[BOJ/백준] 27866번 문자와 문자열 - [c/c++] 풀이 (0) | 2023.05.12 |
[BOJ/백준] 10811번 바구니 뒤집기 - [c/c++] 풀이 (0) | 2023.04.26 |
[BOJ/백준] 1021번 회전하는 큐 - c++ 풀이 (0) | 2023.04.26 |
[BOJ/백준] 2164번 카드2 - c++ 풀이 (0) | 2023.04.10 |
댓글