티스토리 뷰
문제 링크
문제 요약
- 첫째 줄과 둘째 줄에 하나씩 로마 숫자로 표현된 수가 주어진다.
- 입력된 각 수는 2000 보다 작거나 같다.
- 입력으로 주어진 두 수를 더한 값을 첫째 줄에 아라비아숫자로 출력하고 둘째 줄에는 로마 숫자로 출력한다.
함수 설명
- strNum : 로마 숫자를 아라비아 숫자로 바꿔주는 함수
- numStr : 아라비아 숫자를 로마 숫자로 바꿔주는 함수
문제 해답
#include <iostream>
#include <string>
using namespace std;
#define I 1
#define V 5
#define X 10
#define L 50
#define C 100
#define D 500
#define M 1000
int strNum(string str1);
void numStr(int res);
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string str1, str2, resStr;
int res, st1=0, st2 = 0;
cin >> str1 >> str2;
st1 = strNum(str1);
st2 = strNum(str2);
res = st1 + st2;
cout << res << endl;
numStr(res);
return 0;
}
void numStr(int res) {
for (int i = 0;i < res / M;i++) {
cout << 'M';
}
res %= M;
if (res / C == 9)
cout << "CM";
else if (res / C == 4)
cout << "CD";
else if (res / C >= 5) {
cout << 'D';
res -= D;
for (int i = 0;i < res / C;i++)
cout << 'C';
}
else {
for (int i = 0;i < res / C;i++)
cout << 'C';
}
res %= C;
if (res / X == 9)
cout << "XC";
else if (res / X == 4)
cout << "XL";
else if (res / X >= 5) {
cout << 'L';
res -= L;
for (int i = 0;i < res / X;i++)
cout << 'X';
}
else {
for (int i = 0;i < res / X;i++)
cout << 'X';
}
res %= X;
if (res == 9)
cout << "IX";
else if (res == 4)
cout << "IV";
else if (res >= 5) {
cout << 'V';
res -= V;
for (int i = 0;i < res;i++)
cout << 'I';
}
else {
for (int i = 0;i < res;i++)
cout << 'I';
}
}
int strNum(string str1) {
int st1 = 0;
for (int i = 0;i < str1.size();i++) {
if (str1[i] == 'M') {
st1 += M;
}
else if (str1[i] == 'D') {
st1 += D;
}
else if (str1[i] == 'C') {
if (i < str1.size() - 1) {
if (str1[i + 1] == 'D') {
st1 += (D - C);
i += 1;
}
else if (str1[i + 1] == 'M') {
st1 += (M - C);
i += 1;
}
else {
st1 += C;
}
}
else
st1 += C;
}
else if (str1[i] == 'L') {
st1 += L;
}
else if (str1[i] == 'X') {
if (i < str1.size() - 1) {
if (str1[i + 1] == 'C') {
st1 += (C - X);
i += 1;
}
else if (str1[i + 1] == 'L') {
st1 += (L - X);
i += 1;
}
else {
st1 += X;
}
}
else
st1 += X;
}
else if (str1[i] == 'V') {
st1 += V;
}
else if(str1[i] == 'I'){
if (i < str1.size() - 1) {
if (str1[i + 1] == 'X') {
st1 += (X - I);
i += 1;
}
else if (str1[i + 1] == 'V') {
st1 += (V - I);
i += 1;
}
else {
st1 += I;
}
}
else
st1 += I;
}
}
return st1;
}
'알고리즘 > Olympiad' 카테고리의 다른 글
[Olympiad] 지역본선 2005 초등부 : 곱셈 #2588 (0) | 2019.09.25 |
---|---|
[Olympiad] 지역본선 2005 초등부 : 대표값2 #2587 (0) | 2019.09.25 |
[Olympiad] 지역본선 2004 초등부 : 비슷한 단어 #2607 (0) | 2019.09.24 |
[Olympiad] 지역본선 2004 초등부 : 바이러스 #2606 (0) | 2019.09.24 |
[Olympiad] 지역본선 2004 초등부 : 줄 세우기 #2605 (0) | 2019.09.24 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- BAEKJOON
- Kotlin
- BOJ
- 코테
- 클린 코드
- 클린 아키텍처
- programmers
- 알고리즘
- 이팩티브 자바
- kotest
- 이펙티브 자바
- 디자인 패턴
- 정규표현식
- 백준
- 객체지향
- C++
- Spring
- 디자인패턴
- Effective Java
- 프로그래머스
- JPA
- Java
- node.js
- 테라폼
- kkoon9
- Olympiad
- Algorithm
- AWS
- Spring Boot
- MSA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함