티스토리 뷰

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

 

파이썬 도장 심사문제(Unit 41) 풀이(judge_coroutine.py)

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

editor752.tistory.com

문제

표준 입력으로 HTML 태그 이름 두 개가 입력됩니다. 다음 소스 코드에서 함수의 반환값을 HTML 태그로 감싸는 데코레이터를 만드세요. HTML 태그는 웹 페이지에 사용하는 문법이며 <span>문자열</span>, <p>문자열</p>처럼 <태그이름>으로 시작하며 </태그이름>으로 끝납니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
________________
________________
________________
________________
________________
________________
 
a, b = input().split()
 
@html_tag(a)
@html_tag(b)
def hello():
    return 'Hello, world!'
 
print(hello())
cs

입출력 예시

  • 예1

입력

p span

결과

<p><span>Hello, world!</span></p>
  • 예2

입력

b i

결과

<b><i>Hello, world!</i></b>

해설

문제 분석

  1. 데코레이트의 사용 이유를 상기해 본다.
  2. 문제의 소스를 보면 표준입력에서 2개의 태그명을 받아서 각각을 변수 a, b에 저장하였다.
  3. 일정한 문자열("Hello, world!")를 출력하는 함수가 Hello()가 작성되었다.
  4. 함수 hello()를 그대로 둔 채 그 반환 문자열을 지정한 태그명(a, b)로 각각 둘러싸는 동작을 두 개의 데코레이션(@html_tag(a), @html_tag(b))를 정의하여 해결한다.

포인트

  1. 매개변수(a, b)가 있는 데코레이션을 작성해야 한다.

  2. 매개변수가 있는 데코레이션의 내부 구조는 아래와 같다. 아래의 코드와 달리 이 문제에서는 지정된 함수 Hello()에 인자가 없으므로 def wrapper()가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 데코레이터가 사용할 매개변수를 지정
def is_multiple(x):              
    def real_decorator(func):        # 호출할 함수를 매개변수로 받음
        def wrapper(a, b):         # 호출할 함수의 매개변수와 똑같이 지정
            r = func(a, b)        # func를 호출하고 반환값을 변수에 저장
            if r % x == 0:        # func의 반환값이 x의 배수인지 확인
                print('{0}의 반환값은 {1}의 배수입니다.'.format(func.__name__, x))
            else:
                print('{0}의 반환값은 {1}의 배수가 아닙니다.'.format(func.__name__, x))
            return r            # func의 반환값을 반환
        return wrapper            # wrapper 함수 반환
    return real_decorator        # real_decorator 함수 반환
 
@is_multiple(3)                # @데코레이터(인수)
def add(a, b):
    return a + b
cs
  1. wrapper() 함수에서는 지정된 문자열을 태그명으로 감싸는 문자열을 만들어 이 문자열을 반환하도록 한다. 태그가 붙어 있는 새로운 문자일을 만들기 위해서는 .format()을 이용한다. 새로운 문자열(result)을 반환하는 것을 잊지 말자.

    1
    2
    3
    4
                result = '<{0}>{1}</{2}>'.format(tag, func(), tag)
                return result
     
     
    cs
  2. 정답 해설에 아래와 같은 추가 설명이 있다. 클래스를 이용하여 데코레이션을 만드는 방식인 것 같은데 강좌를 대충 읽었던 까닭인지 기억나는 게 없다. 해당 방식은 추후에 보충하도록 하겠다.

    또는, 클로저 형태가 아닌 클래스로 만들어도 됩니다. 클래스로 만들 때는 def __init__(self, tag_name):과 같이 __init__메서드에서 데코레이터가 사용할 매개변수를 초깃값으로 받고 속성에 저장합니다. 그다음에 def __call__(self, func):와 같이 __call__ 메서드에서 호출할 함수를 매개변수로 받습니다. 그리고 __call__ 메서드 안에서 wrapper 함수를 만든 뒤 문자열을 조합해서 반환하고, wrapper 함수를 다 만들었으면 wrapper 함수도 반환해주면 됩니다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def html_tag(tag):
    def real_decorator(func):
        def wrapper():
            result = '<{0}>{1}</{2}>'.format(tag, func(), tag)
            return result
        return wrapper
    return real_decorator
 
a, b = input().split()
 
@html_tag(a)
@html_tag(b)
def hello():
    return 'Hello, world!'
cs

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

 

파이썬 도장 심사문제(Unit 43) 풀이(judge_regular_expression.py)

문제 표준 입력으로 URL 문자열이 입력 입력됩니다. 입력된 URL이 올바르면 True, 잘못되었으면 False를 출력하는 프로그램을 만드세요. 이 심사문제에서 판단해야 할 URL의 규칙은 다음과 같습니다. http:// 또는..

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