티스토리 뷰
문제
표준 입력으로 사칙연산 계산식이 여러 개 입력됩니다. 다음 소스 코드에서 각 계산식의 결과를 구하는 코루틴을 만드세요. 계산식은 문자열 형태이며 값과 연산자는 공백으로 구분됩니다. 그리고 값은 정수로 변환하여 사용하고, 나눗셈은 / 연산자를 사용하세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
________________
________________
________________
________________
________________
________________
________________
________________
________________
________________
________________
________________
________________
expressions = input().split(', ')
c = calc()
next(c)
for e in expressions:
print(c.send(e))
c.close()
|
cs |
입력-결과 예시
입력
1 + 2, 4 - 9
결과
3
-5
입력
3 * 4, 10 / 5, 20 + 39
결과
12
2.0
59
풀이
1. 코루틴(cooperative routine)이란?
서로 협력하는 루틴이라는 뜻으로 메인 루틴과 서브 루틴처럼 종속된 관계가 아니라 메인 루틴과 서로 대등한 관계이며 특정 시점에 상대방의 코드를 실행하는 루틴을 말한다.
2. 코루틴의 특징
- 코루틴은 서브 루틴과 같이 바로 종료되지 않았으므로 코루틴의 내용도 계속 유지된다.
- 코드를 한 번만 실행할 수 있는 일반 함수와 달리 코루틴은 코드를 여러 번 실행할 수 있다.
- 함수의 코드를 실행하는 지점인 진입점(entry point)이 여러 개인 함수다.
- 코루틴은 제너레이터의 특별한 형태로, 제너레이터는 yield로 값을 발생시켰지만 코루틴은 yield로 값을 받아올 수 있다.
3. 코루틴 작성 코드 예제
- 코루틴의 구체적인 동작은 무한 루프(
while True:
) 안에 작성되어야 한다. - 메인 루틴에서 코루틴으로 값을 가져오기 위해서는 yield(
x = (yield)
)를 사용한다.
예제 코드1
1
2
3
4
5
6
7
8
9
10
11
|
def number_coroutine():
while True: # 코루틴을 계속 유지하기 위해 무한 루프 사용
x = (yield) # 코루틴 바깥에서 값을 받아옴, yield를 괄호로 묶어야 함
print(x)
co = number_coroutine()
next(co) # 코루틴 안의 yield까지 코드 실행(최초 실행)
co.send(1) # 코루틴에 숫자 1을 보냄
co.send(2) # 코루틴에 숫자 2을 보냄
co.send(3) # 코루틴에 숫자 3을 보냄
|
cs |
예제 코드2
1
2
3
4
5
6
7
8
9
10
11
12
|
def sum_coroutine():
total = 0
while True:
x = (yield total) # 코루틴 바깥에서 값을 받아오면서 바깥으로 값을 전달
total += x
co = sum_coroutine()
print(next(co)) # 0: 코루틴 안의 yield까지 코드를 실행하고 코루틴에서 나온 값 출력
print(co.send(1)) # 1: 코루틴에 숫자 1을 보내고 코루틴에서 나온 값 출력
print(co.send(2)) # 3: 코루틴에 숫자 2를 보내고 코루틴에서 나온 값 출력
print(co.send(3)) # 6: 코루틴에 숫자 3을 보내고 코루틴에서 나온 값 출력
|
cs |
4. 문제의 포인트
- 메인 루틴에서 연산식 분리 및 코루틴 호출을 위한 코드가 작성되어 있다.
- 연산식 리스트 expressions에 담긴 개개의 연산을 수행할 코루틴만 작성하면 된다.
- yield를 사용하여 값(연산식)을 받아오면서 바깥으로 값(결괏값)을 전달하는 방식을 사용한다.
expression = (yield result)
와 같이 바깥에서 send가 보낸 계산식은 expression에 저장하고, result를 바깥으로 전달 - 사칙연산은 if … elif 구문으로 구현한다.
소스코드
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
|
def calc():
result = None
while True:
expression = (yield result)
a, oper, b = expression.split(' ')
if oper is '+':
result = int(a) + int(b)
elif oper is '-':
result = int(a) - int(b)
elif oper is '*':
result = int(a) * int(b)
elif oper is '/':
result = '{:.1f}'.format(float(a) / float(b))
else:
result = 'Input Error'
expressions = input().split(', ')
c = calc()
next(c)
for e in expressions:
print(c.send(e))
c.close()
|
cs |
2019/11/10 - [Python/심사문제] - 파이썬 도장 심사문제(Unit 42) 풀이(judge_decorator.py)
'Python > 심사문제' 카테고리의 다른 글
백준(BAEKJOON): 등록(7287번) (0) | 2019.12.11 |
---|---|
백준(BAEKJOON): 고양이(10171번) (0) | 2019.12.11 |
파이썬 도장 심사문제(Unit 44) 풀이(judge_import.py) (0) | 2019.11.10 |
파이썬 도장 심사문제(Unit 43) 풀이(judge_regular_expression.py) (0) | 2019.11.10 |
파이썬 도장 심사문제(Unit 45) 풀이(judge_package.py) (0) | 2019.11.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- python3
- 유래
- NK
- PyQt5
- 리규찬
- QtDesigner
- django
- Python
- QGridLayout
- judge
- MacOS
- Mac
- word
- baekjoon
- 어원
- setText()
- BOJ
- 백준
- 북한말
- locallibrary
- 소수
- 리찬규
- QLineEdit
- QComboBox
- words
- QLabel
- Tistory
- C
- books
- tips
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
11-26 00:00