트랙
/
Python
Python
/
연습 문제
/
멜트다운 완화
멜트다운 완화

멜트다운 완화

학습 연습 문제

소개

Python에서는 if, elif('else and if'의 줄임말) 그리고 else 문을 사용해 프로그램의 실행 흐름을 제어하고 결정을 내려요. 다른 많은 프로그래밍 언어와 달리, Python 3.9 이하 버전에는 공식적인 case-switch 문이 없어요. 대신 여러 개의 elif 문으로 비슷한 역할을 해요.

Python 3.10에서는 structural pattern matching이라는 변형된 case-switch 문이 도입되었는데, 이는 다른 개념에서 따로 다뤄요.

조건문은 True 또는 False로 귀결되는 표현식을 사용해요. bool 타입을 직접 반환하거나, "truthy" 또는 "falsy"로 평가되는 방식이죠.

x = 10
y = 5

# The comparison '>' returns the bool 'True',
# so the statement is printed.
if x > y:
    print("x is greater than y")
...
>>> x is greater than y

if와 함께 쓰이면, 원래 if 조건이 False로 평가될 때 선택적인 else 코드 블록이 실행돼요:

x = 5
y = 10

# The comparison '>' here returns the bool 'False',
# so the 'else' block is executed instead of the 'if' block.
if x > y:
    print("x is greater than y")
else:
    print("y is greater than x")
...
>>> y is greater than x

elif를 쓰면 조건을 여러 개 평가하고 분기를 나눌 수 있어요.

x = 5
y = 10
z = 20

# The 'elif' statement allows for the checking of more conditions.
if x > y:
    print("x is greater than y and z")
elif y > z:
    print("y is greater than x and z")
else:
    print("z is greater than x and y")
...
>>> z is greater than x and y

불리언 연산과 비교는 조건문과 결합해서 더 복잡한 검사를 할 수 있어요:

>>> def classic_fizzbuzz(number):
        if number % 3 == 0 and number % 5 == 0:
            say = 'FizzBuzz!'
        elif number % 5 == 0:
            say = 'Buzz!'
        elif number % 3 == 0:
            say = 'Fizz!'
        else:
            say = str(number)
        
        return say

>>> classic_fizzbuzz(15)
'FizzBuzz!'

>>> classic_fizzbuzz(13)
'13'

지침

이번 연습 문제에서는 원자로를 위한 간단한 제어 시스템을 만들어 봐요.

원자로가 전력을 생산하려면 임계 상태에 있어야 해요. 원자로가 임계보다 낮은 상태에 있으면 손상될 수 있어요. 원자로 상태가 임계를 넘어서면 과부하가 걸려 멜트다운으로 이어질 수 있어요. 우리는 멜트다운의 가능성을 줄이고 원자로 상태를 올바르게 관리하는 것이 목표예요.

다음 세 가지 과제는 모두 이상적인 원자로 상태를 유지하기 위한 코드를 작성하는 것과 관련이 있어요.

1. 임계 여부 확인하기

제어 시스템이 가장 먼저 해야 할 일은 원자로가 임계 균형 상태에 있는지 확인하는 거예요. 원자로가 다음 조건을 만족하면 임계 균형 상태라고 해요.

  • 온도가 800 K 미만이에요.
  • 초당 방출되는 중성자의 수가 500보다 많아요.
  • 온도와 초당 방출되는 중성자의 곱이 500000보다 작아요.

켈빈 단위로 측정한 temperature와 neutrons_emitted를 매개변수로 받아, 임계 조건이 충족되면 True를, 그렇지 않으면 False를 반환하는 is_criticality_balanced() 함수를 구현해 봐요.

>>> is_criticality_balanced(750, 600)
True

2. 전력 출력 범위 판별하기

원자로가 전력을 생산하기 시작하면 그 효율을 판단해야 해요. 효율은 4개의 구간으로 나눌 수 있어요.

  1. green -> 효율이 80% 이상,
  2. orange -> 효율이 80% 미만이지만 최소 60% 이상,
  3. red -> 효율이 60% 미만이지만 여전히 30% 이상,
  4. black -> 효율이 30% 미만.

백분율 값은 (generated_power/theoretical_max_power)*100로 계산할 수 있는데, 여기서 generated_power = voltage * current예요. 백분율 값은 보통 정수가 아니니, <와 <= 비교를 적절히 사용해야 한다는 점을 꼭 기억해요.

voltage, current, theoretical_max_power 세 개의 매개변수를 받는 reactor_efficiency(<voltage>, <current>, <theoretical_max_power>) 함수를 구현해 봐요. 이 함수는 원자로의 효율 구간인 'green', 'orange', 'red', 'black' 중 하나를 반환해야 해요.

>>> reactor_efficiency(200,50,15000)
'orange'

3. 페일 세이프 메커니즘

마지막 과제는 과부하와 멜트다운을 피하기 위한 페일 세이프 메커니즘을 만드는 거예요. 이 메커니즘은 원자로가 이상적인 임계 기준보다 낮은지, 기준과 같은지, 높은지를 판단해요. 그런 다음 제어봉을 원자로에 삽입하거나 빼서 임계 상태를 높이거나 낮추거나 멈출 수 있어요.

세 가지 매개변수, 즉 켈빈 단위로 측정한 temperature, neutrons_produced_per_second, threshold를 받아 원자로의 상태 코드를 출력하는 fail_safe() 함수를 구현해 봐요.

  • temperature * neutrons_produced_per_second가 threshold의 90% 미만이면, 전력을 생산하기 위해 제어봉을 빼내야 한다는 의미로 'LOW' 상태 코드를 출력해요.

  • temperature * neutrons_produced_per_second 값이 threshold의 10% 이내라면(즉, 임계값보다 010% 작거나, 임계값과 같거나, 임계값보다 010% 큰 경우), 원자로는 임계 상태이며 'NORMAL' 상태 코드를 출력해야 해요. 이는 원자로가 최적의 상태이고 제어봉이 이상적인 위치에 있다는 것을 나타내요.

  • temperature * neutrons_produced_per_second가 위에 나온 범위에 들지 않으면, 원자로가 멜트다운으로 가고 있으므로 즉시 원자로를 정지시키라는 의미로 'DANGER' 상태 코드를 전달해야 해요.

>>> fail_safe(temperature=1000, neutrons_produced_per_second=30, threshold=5000)
'DANGER'
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Python Exercism

멜트다운 완화 문제를 시작해 볼 준비가 됐나요?

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