-
[파이썬/Python] 백준 10998번(AxB) - 단계별로 풀어보기 + [오류 발생으로 조건 명시하기]깜빡의 취미/파이썬을 합니다. 2021. 6. 21. 15:00728x90
문제는 아래와 같다.
1000번(A+B), 1001번(A-B)과 동일한 문제이다. 일반적인 방법의 풀이는 아래의 링크를 확인하면 된다. 아마 이 문제를 검색할 분도 거의 없으리라 생각한다. 혹시 흘러 흘러 들어오셨다면, 환영한다.
+를 *로 바꿔주시면 됩니다. 혹시나 싶어 코딩 과정에서의 곱하기는 'x'가 아니라 '*(shift+8)'라는 것을 적어 봅니다...!!
들어가기엔 귀찮고 빨리 답을 얻고 넘어가고 싶은 분들을 위해 예시 답안 두 개를 가져왔다.
[답안 예시1] A, B = input().split() x = int(A) y = int(B) print(x*y)
[답안 예시2] A,B = map(int, input().split()) print(A*B)
사실 이제는 문제 자체를 푸는 데 어려움이 없으니, 하나를 더 해보고 싶어졌다. 바로 조건을 명확하게 하는 일이다. 문제의 입력란을 보면 다음과 같은 조건이 달려 있는 것을 확인할 수 있다.
(0 < A, B < 10)
사실 입력 과정에서 누군가 악의적으로 굴지 않는 이상, 해당 범위 내에서 식이 정상적으로 작동하면 문제는 해결이다. 그렇지만 생각을 달리 해보자. 해당 조건을 꼭 지켜야 한다는 가정 하에, 과연 어떻게 해야 그 가정을 충족할 수 있을까? 아래는 해당 호기심을 해결한 제출 현황의 모습이다.
일단 방법을 먼저 설명하자면 오류를 발생시키는 방법이다. 아래의 책에서 방법을 배웠다.
우선 원리를 설명하기 전에 실제 제출한 답안 예시를 올려 본다.
[답안 예시3] class Oryu(Exception): pass def e(): a, b = map(int, input().split()) if not 0 < a < 10 or not 0 < b < 10: raise Oryu() print(a*b) try: e() except Oryu: print("잘못된 식이지롱.")
우선 Exception 클래스를 상속한 Oryu 클래스를 만든다(이름은 아무렇게나 해도 된다). Exception 클래스는 오류의 기능을 한다...라고 이해하면 쉽다. 이를 상속한 Oryu 클래스 또한 따라서 인위적으로 만든 오류가 된다.
다음으로 e()라는 함수를 만들어 주었다. 오류를 어떤 상황에 발생시켜야 하는지를 지정해 주는 함수이다. 앞선 [답안 예시 2]와 그 형태가 같고, 추가된 두 문장에 대해서는 아래의 설명을 참고.
if not 0 < a < 10 or not 0 < b < 10: -> 0 < a,b < 10이라는 조건을 충족하지 않으면 raise Oryu() -> Oryu 클래스를 작동해라(raise)!
마지막으로 try... except... 구문을 이용해 e() 함수를 실제로 시행해보고, 우리가 요구하는 조건을 충족하지 않는 경우 "잘못된 식이지롱."이라는 문구를 출력하도록 해주었다. 결과적으로 앞의 답안 예시 두 개와 동일한 수행 능력을 보이면서 아래와 같은 상황을 만들어낼 수 있게 되는 것이다.
2 -1 잘못된 식이지롱.
__str__(self)를 이용해 Oryu 클래스 안에 오류 메시지를 내장하는 것보다 위의 방식이 더 바이트 수가 적었습니다. 아무래도 짧은 식이 읽기에도 좋고... 편하고... 좋다고 생각합니다. 더 줄여나갈 방법이 있는지도 살펴보고 싶습니다. 조금 더 긴 버전은 바로 앞 1001번 문제 내 식을 참고해 주시기 바랍니다!
'깜빡의 취미 > 파이썬을 합니다.' 카테고리의 다른 글
[파이썬/Python] 백준 10869번(사칙연산) - 단계별로 풀어보기 + [간단한 오류 잡기(feat. 나눗셈)] (0) 2021.07.04 [파이썬/Python] 백준 1008번(A/B) - 단계별로 풀어보기 + [오류 발생시키기에 대한 간단한 언급] (2) 2021.06.27 [파이썬/Python] 백준 1001번(A-B) - 단계별로 풀어보기 + [0 < A, B < 10 조건 명시하기] (0) 2021.06.20 [파이썬/Python] 백준 1000번(A+B) - 단계별로 풀어보기 (0) 2021.06.18 [파이썬 / Python] map(int, input().split())에 대해 (1) 2021.06.18