티스토리 뷰

문제

표준 입력으로 사칙연산 계산식이 여러 개 입력됩니다. 다음 소스 코드에서 각 계산식의 결과를 구하는 코루틴을 만드세요. 계산식은 문자열 형태이며 값과 연산자는 공백으로 구분됩니다. 그리고 값은 정수로 변환하여 사용하고, 나눗셈은 / 연산자를 사용하세요.

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(', ')
 
= 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(', ')
 
= calc()
next(c)
 
for e in expressions:
    print(c.send(e))
 
c.close()
 
cs

2019/11/10 - [Python/심사문제] - 파이썬 도장 심사문제(Unit 42) 풀이(judge_decorator.py)

 

파이썬 도장 심사문제(Unit 42) 풀이(judge_decorator.py)

2019/11/11 - [Python/심사문제] - 파이썬 도장 심사문제(Unit 41) 풀이(judge_coroutine.py) 파이썬 도장 심사문제(Unit 41) 풀이(judge_coroutine.py) 문제 표준 입력으로 사칙연산 계산식이 여러 개 입력됩니다..

editor752.tistory.com

 


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함
05-18 17:43