본문 바로가기
프로그래밍/CodeUp

CodeUp[Q_2020] : 아로마 수

by 조원일 2020. 3. 16.
728x90

1. 문제

https://codeup.kr/problem.php?id=2020

 

아로마 수

문제요약) 아로마 수는 ARA'R'...꼴로 구성되어 있다. 여기서 A는 가중치이고, R은 심볼을 의미한다. 심볼R의 각각의 값은 아래 표와 같다. Symbol I V X L C D M Base value 1 5 10 50 100 500 1000 보통 R >= R' 이면, 가중치를 곱해서 더한다. 하지만 R < R' 이면, 앞의 AR을 뺀다. 예제 1)  3M1D2C = 3*1000 + 1*500 + 2*100 = 3700 예제 2) 3X2I4X = 3*

codeup.kr

[출처 : 코드업(https://codeup.kr/)]

이번 문제는 (숫자+문자)가 여러개 이어져있는 입력을 해석하는 문제입니다.

다만 현재 심볼이 이전 심볼보다 크면 더하고 작으면 빼주는 규칙이 있습니다.

 

 

2. 해답

#include <stdio.h>
#include <math.h>

char symbol[7] = { 'I', 'V', 'X' , 'L' , 'C' , 'D' , 'M' };
int value[7] = { 1, 5, 10, 50, 100, 500, 1000 };

int my_atoi(char c) {
	for (int i = 0; i < 7; i++) {
		if (symbol[i] == c) return value[i];
	}
	return 0;
}

int my_strlen(char* s) {
	int c = 0;
	int i = 0;
	while (s[i++] != NULL) {
		c++;
	}
	return c;
}

int main() {
	char Arr[41];

	int state, before_state = 0;
	int num = 0;

	scanf("%s", Arr);

	for (int i = my_strlen(Arr) - 1; i > 0; i -= 2) {
		state = my_atoi(Arr[i]);
		if (state >= before_state) {
			// 현재 심볼이 이전 심볼보다 뒤에 있으면
			num += (((int)Arr[i - 1] - 48) * state);
		}
		else {
			// 현재 심볼이 이전 심볼보다 앞에 있으면
			num -= (((int)Arr[i - 1] - 48) * state);
		}
		before_state = state;
	}

	printf("%d\n", num);

	return 0;
}