문제
신입 단기과제 연계 끝에 대전멤버십에서 새로운 숫자 체계 "MemNumber"를 완성시켰다. 이것은 4개의 소문자 m, c, x, i와 8개의 숫자 2, 3, 4, 5, 6, 7, 8, 9로 수를 표현한다. 즉, 0과 1은 사용하지 않는다.
몇가지 예를 들면
- "5m2c3x4i" 는 5234 (= 5*1000 + 2*100 + 3*10 + 4*1)
- "m2c4i" 는 1204 (= 1000 + 2*100 + 4*1)
- "5m2c3x" 는 5230 (= 5*1000 + 2*100 + 3*10)
위 예에서
- "5m" 는 5000 (= 5*1000)
- "2c" 는 200 (= 2*100)
- "3x" 는 30 (= 3*10)
- "4i" 는 4 (= 4*1)
즉, m, c, x, i 앞에 2부터 9까지 수가 올 수 있는데 이 수와 짝을 이루어 수의 곱을 의미한다.
m, c, x, i 는 많아야 한 번 나올수 있다. 접두 숫자와는 같이 움직인다. m , c ,x , i 는 이 순서로 나와야 한다.
다음은 가능하지 않는 "MemNumber"이다.
- "1m2c4i"
- "mcc4i"
- "m2c0x4i"
- "2cm4i"
"MemNumber" 문자열 두개를 입력으로 받아 "MemNumber" 수의 합을 구한 후 대응되는 "MemNumber" 문자열을 출력한다.
입력
"MemNumber" 문자열 2개가 입력된다.
두 수의 합은 9999를 넘지 않는다.
출력
입력된 "MemNumber" 문자열의 합을 "MemNumber"수로 출력한다.
예제 입력1
xi x9i
예제 출력1
3x
예제 입력2
i 9i
예제 출력2
x
예제 입력3
m2ci 4m7c9x8i
예제 출력3
5m9c9x9i
예제 입력4
9m8c7xi c2x8i
예제 출력4
9m9c9x9i
[문제 설명]
m = 1000
c = 100
x = 10
i = 1
1. 이 4개의 문자들은 2~9까지의 8개의 숫자와 짝을 이룹니다.
따라서 4m = 4 * 1000 = 4000이라고 볼 수 있고, mc = 1000 + 100 = 1100이라고 볼 수 있습니다.
2. mcxi는 각 한 번씩만 나올 수 있습니다.
3. m - c - x - i 꼭 이 순서대로 문자가 나와야 합니다.
이 세 가지 조건을 만족하면서 두 수의 합을 계산 한 후 다시 m, c, x, i 로 표현을 하는 것이 이번 문제였습니다.
[소스 코드 설명]
입력받은 문자의 길이를 구한 후, 그 길이 만큼 for문을 돌면서 각 문자별로 앞에 붙은 숫자와 짝을 이루어 입력받은 문자가 숫자로 환산하면 몇 인지를 파악합니다.
그리고 환산한 두 숫자를 더한 후에 다시 mcxi 문자로 바꿔주는 소스 코드 입니다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | #include <iostream> #include <string> using namespace std; int main() { string num1, num2, result; int tmp1=0, tmp2=0, tmp=0; int count=0, count2=0; int i, j; cin >> num1 >> num2; count = num1.length(); count2 = num2.length(); for(i=0; i<count; i++) { if(num1[i] == 'm') { if( (i-1 >= 0) && (num1[i-1] != 'm') && (num1[i-1] != 'c') && (num1[i-1] != 'x') &&(num1[i-1] != 'i') ){ tmp1 = tmp1 + (((int)num1[i-1]-48) * 1000); } else { tmp1 = tmp1 + 1000; } } else if(num1[i] == 'c') { if( (i-1 >= 0) && (num1[i-1] != 'm') && (num1[i-1] != 'c') && (num1[i-1] != 'x') &&(num1[i-1] != 'i') ) { tmp1 = tmp1 + (((int)num1[i-1]-48) * 100); } else { tmp1 = tmp1 + 100; } } else if(num1[i] == 'x') { if( (i-1 >= 0) && (num1[i-1] != 'm') && (num1[i-1] != 'c') && (num1[i-1] != 'x') &&(num1[i-1] != 'i') ) { tmp1 = tmp1 + (((int)num1[i-1]-48) * 10); } else { tmp1 = tmp1 + 10; } } else if(num1[i] == 'i') { if( (i-1 >= 0) && (num1[i-1] != 'm') && (num1[i-1] != 'c') && (num1[i-1] != 'x') &&(num1[i-1] != 'i') ) { tmp1 = tmp1 + (((int)num1[i-1]-48)); } else { tmp1 = tmp1 + 1; } } } for(j=0; j<count2; j++) { if(num2[j] == 'm') { if( (j-1 >= 0) && (num2[j-1] != 'm') && (num2[j-1] != 'c') && (num2[j-1] != 'x') &&(num2[j-1] != 'i') ){ tmp2 = tmp2 + (((int)num2[j-1]-48) * 1000); } else { tmp2 = tmp2 + 1000; } } else if(num2[j] == 'c') { if( (j-1 >= 0) && (num2[j-1] != 'm') && (num2[j-1] != 'c') && (num2[j-1] != 'x') &&(num2[j-1] != 'i') ) { tmp2 = tmp2 + (((int)num2[j-1]-48) * 100); } else { tmp2 = tmp2 + 100; } } else if(num2[j] == 'x') { if( (j-1 >= 0) && (num2[j-1] != 'm') && (num2[j-1] != 'c') && (num2[j-1] != 'x') &&(num2[j-1] != 'i') ) { tmp2 = tmp2 + (((int)num2[j-1]-48) * 10); } else { tmp2 = tmp2 + 10; } } else if(num2[j] == 'i') { if( (j-1 >= 0) && (num2[j-1] != 'm') && (num2[j-1] != 'c') && (num2[j-1] != 'x') &&(num2[j-1] != 'i') ) { tmp2 = tmp2 + (((int)num2[j-1]-48)); } else { tmp2 = tmp2 + 1; } } } //cout << tmp1 << " " <<tmp2<<endl; tmp = tmp1 + tmp2; //cout <<tmp <<endl; if((tmp/1000) !=0){ if((tmp/1000) == 1) { result += 'm'; } else { result += (tmp/1000) + 48; result += 'm'; } } if((tmp%1000)/100 != 0) { if((tmp%1000)/100 == 1) result += 'c'; else if((tmp%1000)/100 != 1) { result += (tmp%1000)/100 + 48; result += 'c'; } } if((tmp%1000%100)/10 != 0) { if((tmp%1000%100)/10 == 1) result += 'x'; else if((tmp%1000%100)/10 != 1) { result += (tmp%1000%100)/10 + 48; result += 'x'; } } if((tmp%10) == 1){ result += 'i'; } else if(tmp%10 != 0) { result += tmp%10 + 48; result += 'i'; } cout << result; return 0; } |
'알고리즘 > 멤고리즘' 카테고리의 다른 글
멤고리즘 2회 3번. 산삼 찾기(DP) (0) | 2014.04.22 |
---|---|
멤고리즘 2회 2번. 이진회귀수 (0) | 2014.04.22 |
멤고리즘 2회 1번. 거꾸로 말해요 (0) | 2014.04.22 |
멤고리즘 1회 3번. 복붙기능 키보드 (0) | 2014.04.22 |
멤고리즘 1회 1번. CAT 출력 (0) | 2014.04.22 |