-
[파이썬/Python] 백준 2739번(구구단) 단계별로 풀어보기+ [범위 넘어갈 때 오류 만들기 + 구구단 그 너머를 위한 식]깜빡의 취미/파이썬을 합니다. 2021. 8. 29. 19:57728x90
문제는 다음과 같다.
문제를 푸는 데 꼭 필요한 for문 설명은 미리 작성해 두었다. 아래의 링크를 참고해 주시길.
빠르게 답안 예시부터 소개하고, 자세한 설명은 뒤에 첨부한다.
[답안 예시] N = int(input()) for i in range(1,10): print(f'{N} * {i} = {N*i}')
N = int(input())
우선 구구단의 앞부분 N을 입력하기 위해 input 함수를 이용한다. N은 무조건 정수이기 때문에 int 함수를 input 함수에 둘러 준다. 즉 int(input())은 정수형을 입력하라 정도가 되겠다. 이 식은 입력하는 사람이 양심적으로 1부터 9까지의 숫자를 입력해 줘야 문제의 의도를 충족할 수 있다(?)는 한계가 있다.
for i in range(1,10):
1 이상 10 미만의 숫자에 각각 i를 대입할 예정이라는 의미이다.
print(f'{N} * {i} = {N*i}')
수행문이다. f 포맷팅 기법을 이용하여, 입력에 따라 달라지는 N과 요소별로 달라질 i를 출력문이 반영할 수 있도록 해보았다. 유감스럽게도 문자열 포맷팅 기법을 이용하지 않으면, 문제에서 의도하는 출력값을 표현할 수 없다.
f 포맷팅 기법을 간단히 소개하면, 출력할 문장 앞에 f를 적고 변수를 {변수}와 같은 형태로 표현하면 된다.
범위 넘어갈 때 오류 만들기
이제 문제는 다 풀었는데... 조금 의문이 들었다. 명색이 구구단 문제인데, 구구단이 아니면 안 되게 할 수는 없을까? 그러니까, N값의 범위를 강제할 수는 없을까?
결론부터 말하면, 오류를 설정하는 방식으로 가능하다. 해당 기법을 적용한 예시는 아래와 같다.
해당 글에서 다루고 있지 않은 클래스, 그리고 함수에 대한 이해가 어느 정도 있어야 식을 이해할 수 있습니다. 양해 바랍니다.
def Yesi(): N = int(input()) if not 0 < N < 10: raise for i in range(1, 10): print(f'{N} * {i} = {N * i}') try: Yesi() except: print("구구단이거든요!")
def Yesi():
Yesi(예시 맞다) 함수를 정의해 보자.
N = int(input())
if not 0 < N < 10:
raise
앞서 보았던 [답안 예시]와 같이 N을 지정한다. 이때 if문을 추가하는데, N이 1~9까지의 수가 아니라면, 오류를 발생시킨다. 눈치챘겠지만, raise는 오류를 발생시킨다.이 때 N을 지정하고 바로 아래 if문을 추가한 이유는, 조건에 맞지 않는 경우 바로 오류가 발생해야 하기 때문이다(for문 아래에 if문을 삽입하는 경우, 출력할 건 다 출력하고 오류임을 알리는... 상당히 이상한 상황이 연출될 수 있다).
for i in range(1, 10):
print(f'{N} * {i} = {N * i}')앞의 [답안 예시1]과 동일한 식이므로 이 이상의 설명은 생략한다.
try:
Yesi()
except:
print("구구단이거든요!")try... except...를 이용한다. try 아래에는 실험해 볼(?) 문장이 들어간다. 이 경우 지정해 둔 Yesi 함수를 이용한다. except의 옆에 특별히 오류의 종류를 적지 않았기 때문에, 어떠한 종류의 오류가 발생하더라도 문제 없다. 만일 오류가 발생하였다면 구구단이거든요!라는 문장을 출력하게 된다.
실제 작동은 아래와 같다. 구구단의 범위를 벗어날 경우 이렇게 친절하게 알려 준다. 더 이상 진행되지도 않는다.
구구단 그 너머를 위한 식
여기서 다른 생각도 한 번 해보았다. 구구단뿐 아니라 12x12 / 25x25도 계산 가능하고 범위도 지정할 수 있는! 그런 식을 만들어 보면 어떨까? 아래는 결과물이다.
while 1: A = int(input('1: NN단 2: N 곱하기 N 3: 좀 더 자유로운 NN단 4: 나가기\n')) if A == 1: N = int(input('숫자 입력하세요: ')) for i in range(1,N+1): print(f'{N} * {i} = {N*i}') print('\n') continue elif A == 2: N = int(input('숫자 입력하세요: ')) print(f'{N} * {N} = {N*N}') print('\n') continue elif A == 3: X,Y = map(int, input("숫자 두 개 적으세요: ").split()) for i in range(1,Y+1): print(f'{X} * {i} = {X*i}') print('\n') continue else: print('프로그램을 종료합니다') break
조금 길지만 하나씩 차근차근 설명해 보고자 한다.
전체적인 구조
세부 사항을 모두 지운 모습부터 소개한다(이 상태로는 제대로 작동하지는 않는다).
while 1: A = int(input('1: NN단 2: N 곱하기 N 3: 좀 더 자유로운 NN단 4: 나가기\n')) if A == 1: continue elif A == 2: continue elif A == 3: continue else: break
우선 원하는 만큼 식을 굴려야(?) 하기 때문에 while문 무한루프를 이용했다. 직접 문자를 칠 경우 오류 발생 확률이 높아 숫자로 모드를 선택할 수 있도록 했다.
만일 1, 2, 3 중 하나를 선택했다면 내부의 식이 돌아가게 되고, 식이 끝나면 continue문을 통해 while문의 처음, 그러니까 모드를 선택하는 줄로 다시 돌아갈 수 있게 했다.
마지막으로 A가 4일 경우, 즉 위 식의 else문에 해당하는 경우 break문을 통해 while문을 빠져나올 수 있도록 설정했다.
참고로 1, 2, 3 모두 [답안 예시1]을 참고하여 식을 제작하였다. 즉 앞선 글을 이해했다면 식 자체는 쉽다.
NN단
별 생각 없이 구구단 이상이라고 해서 NN단이라 지었다. 숫자를 입력하면 N*1부터 N*N까지 출력될 수 있도록 했다. 실제 작동 화면은 아래와 같다.
N 곱하기 N
쉬어가는 코너이다. N을 입력하면, N * N (N의 제곱)을 출력해 준다. 실제 작동 화면은 아래와 같다.
좀 더 자유로운 NN단
숫자 두 개를 입력한다. 두 수를 X와 Y라고 했을 때, X * 1부터 X * Y까지 차례대로 출력해 보여준다. 실제 작동 화면은 아래와 같다.
하다 보니 이야기가 무척 길어졌습니다. 다양한 개념을 공부하다 보면, 앞으로 원하는 프로그램들을 뚝딱뚝딱 만들어 낼 수 있겠지요. 기회가 될 때 조금이나마 공부해두길 잘했습니다. 앞으로도 더 배워나가고 싶습니다. 방문 진심으로 감사합니다. 여기까지 혹시라도 읽어 주셨다면, 그리고 제 글이 괜찮으셨다면, 구독과 공감 한 번씩! 부탁드립니다...!
'깜빡의 취미 > 파이썬을 합니다.' 카테고리의 다른 글
[파이썬/Python] 백준 8393번(합) 단계별로 풀어보기 + ['+=' 에 관한 조금 더 자세한 설명] (2) 2021.09.12 [파이썬/Python] 백준 10950번(A+B - 3) 단계별로 풀어보기 + [for문 대신 while문 써보기, 더하는 값 잘못 입력했을 때 원점으로 돌리기] (0) 2021.09.05 [파이썬/Python] for문 기본, 그리고 range 함수 (3) 2021.08.29 [파이썬/Python] 백준 2884번(알람 시계) 단계별로 풀어보기 (0) 2021.08.22 [파이썬/Python] 백준 14681번(사분면 고르기) 단계별로 풀어보기+ [점점 짧아지는 답안 예시 3개] (0) 2021.08.15