트랙
/
C#
C#
/
연습 문제
/
하이페리아를 덮친 초인플레이션
하이페리아를 덮친 초인플레이션

하이페리아를 덮친 초인플레이션

학습 연습 문제

소개

오버플로

산술 오버플로는 산술 연산이나 타입 변환 같은 계산의 결과가 값을 받는 타입의 용량보다 큰 값이 될 때 발생해요.

이런 상황에서 int와 long, 그리고 이들에 대응하는 부호 없는 타입의 표현식은 아무런 오류 없이 값이 반대쪽 끝으로 넘어가요.

정수 연산의 동작은 checked 키워드를 사용해 바꿀 수 있어요. checked 블록 안에서 오버플로가 발생하면 OverflowException 인스턴스가 던져져요.

int one = 1;
checked
{
    int expr = int.MaxValue + one;   // OverflowException is thrown
}

// or

int expr2 = checked(int.MaxValue + one);     // OverflowException is thrown

float와 double 타입의 표현식은 무한대라는 특별한 값을 가져요.

decimal 타입의 표현식은 OverflowException 인스턴스를 던져요.

지침

Hyperia라는 나라는 여러 문제를 안고 있어요. 특히 인플레이션이 통제 불능 상태예요. 그래서 중앙은행에서 일할 계약을 맡기 위해 급히 파견됐어요.

1. 지폐 액면 출력하기

내부 행정을 간소화하기 위해 중앙은행은 각 액면을 두 부분으로 나눴어요. 비교적 잘 바뀌지 않는 _기준값_과, 모든 액면에 공통으로 적용되면서 매년, 매주, 심지어 매일 바뀔 수도 있는 _배수_예요.

실제로 인쇄될 때 지폐의 액면은 _기준값_과 _배수_의 곱이에요.

이 시스템이 도입될 당시 최소 지폐의 액면은 이미 10,000,000이었어요. 아래 표는 이 시스템이 처음 도입됐을 때의 상황(처음 세 개의 액면)을 보여줘요. 그 이후로 상황은 훨씬 더 나빠졌고, 이제는 _배수_뿐 아니라 _기준값_도 바뀌어요.

기준값 배수 액면
10,000 1,000 10,000,000
50,000 1,000 50,000,000
100,000 1,000 100,000,000
... 1,000 ...

정리하면 액면 = 기준값 * _배수_예요.

기준값과 배수를 받아 그 곱(기준값 * 배수)의 문자열을 반환하는 CentralBank.DisplayDenomination() 메서드를 구현해 주세요. 반환되는 숫자 문자열에는 서식이 적용되면 안 돼요.

곱셈 연산으로 오버플로가 발생하면 "*** Too Big ***" 문자열을 반환해야 해요.

CentralBank.DisplayDenomination(10000L, 1000L);
// => "10000000"
CentralBank.DisplayDenomination(long.MaxValue / 2, 10000L);
// => "*** Too Big ***"

2. Hyperia의 GDP 출력하기

중앙은행은 내부적으로 GDP(국내총생산)를 기록할 때도 같은 배수 방식을 사용해요. 통계는 기준 액면으로 기록한 다음 배수를 곱해 키워요.

기준 GDP와 현재 배수를 받아 GDP를 문자열로 반환하는 CentralBank.DisplayGDP() 메서드를 구현해 주세요.

GDP를 계산할 수 없으면 "*** Too Big ***" 문자열이 반환돼요.

CentralBank.DisplayGDP(555f, 10000f);
// => "5550000"
CentralBank.DisplayGDP(float.MaxValue / 2, 10000f);
// => "*** Too Big ***"

3. 수석 경제학자의 급여 출력하기

은행에 있는 상사는 급여를 지급할 때 문제가 생기지 않도록 확실히 해두고 싶어 해요.

기준 단위(위와 같은 방식)로 표현된 급여와 배수를 받아 그 곱을 담은 문자열을 반환하는 CentralBank.DisplayChiefEconomistSalary() 메서드를 구현해 주세요.

급여를 계산할 수 없으면 "*** Much Too Big ***" 문자열이 반환돼요.

CentralBank.DisplayChiefEconomistSalary(555000m, 10000m);
// => "5550000000"
CentralBank.DisplayChiefEconomistSalary(555000m, decimal.MaxValue / 2L);
// => "*** Much Too Big ***"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
C# Exercism

하이페리아를 덮친 초인플레이션 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 C# 트랙을 개념 62개연습 문제 178개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.