https://github.com/PotatoMeme/ifp-2022-winter-vacation-study/tree/kimseonghwan/week02
Unit19
#표준 입력으로 삼각형의 높이가 입력됩니다.
# 입력된 높이만큼 산 모양으로 별을 출력하는 프로그램을 만드세요
# (input에서 안내 문자열은 출력하지 않아야 합니다).
# 이때 출력 결과는 예제와 정확히 일치해야 합니다.
# 모양이 같더라도 공백이나 빈 줄이 더 들어가면 틀린 것으로 처리됩니다.
#입력
#3
#결과
# *
# ***
#*****
이문제는 이중 반복문을 통해 특정 문양을 만드는 문제입니다. 여기서의 문제는 특정한 정수 값을 입력받아 그 정수 값만큼의 높이를 가진 산을 만들라는 문제입니다. 거기다가 결과를 보면 모양이 3*3을 넘어가는 모습을 하고 있습니다. 이러한 문제는 2가지 방법으로 풀 수 있습니다.
num=int(input())
for i in range(num):
for j in range(num+i):
if num-i-1<=j:
print('*',end='')
else:
print(' ',end='')
print()
첫 번째 방법은 그 문양을 보고 한 번에 만들 수 있는 규칙을 찾아내는 것입니다. 모양을 봤을 때는 모양이 3*3을 초과하고 내려갈수록 문양의 길이가 하나씩 늘어나는 것을 볼 수 있습니다. 그렇다면 j(2중 반복 문중 가장 안쪽의 반복문의 기준 인자)의 최댓값이 i(2중 반복 문중 가장 바깥쪽의 반복문의 기준 인자)가 늘어날수록 1씩 증가한다고 생각할 수 있습니다.
이제 그림판의 모양을 잡았으니 어떻게 그리는지 조건문으로 규칙을 잡아주면 됩니다 규칙을 보니 3*3을 넘치는 부분들은 전부 그려져 있는 것을 볼 수 있습니다. 그리고 3*3 안쪽의 문양을 보면 문양이 오른쪽 정열을 하고 있고 i가 늘어날수록 1개씩 많아지고 있습니다. 이제 각 줄의 문양의 시작을 i와 j의 좌표 로보면 (0,2), (1,1), (2,0)입니다. 이제 식으로 풀어봅시다
[2(num-1) <= 2(i+j)] => [num-1 <=i+j] => [num-1-i <=j] 이제 이걸소스로 만들어주면 됩니다.
사실 이런 방식으로 풀면 한 번에 규칙을 못 찾고 시간이 많이 걸릴 수 있기 때문에 빨리 풀 수 있는 두 번째 방법을 추천드립니다.
num=int(input())
for i in range(num):
for j in reversed(range(num)):
if j > i:
print(' ', end='')
else:
print('*', end='')
for j in range(num):
if j < i:
print('*', end='')
print()
두 번째 방법은 그리는 것을 나누는 것입니다 위와 같은 문제의 경우에는 안쪽의 반복문을 2개로 만들어서 외쪽 줄을 완성시키고 오른쪽 줄로 넘어가는 방식으로 만들어주면 됩니다. 이 방법 같은 경우는 순차적으로 진행 학기 때문에 첫 번째 풀이 방식보다 소스는 길수 있지만 내용은 똑같기 때문에 두 번째 방법으로 푸는 것을 추천드립니다.
Unit20
#표준 입력으로 정수 두 개가 입력됩니다
# (첫 번째 입력 값의 범위는 1~1000,
# 두 번째 입력 값의 범위는 10~1000이며
# 첫 번째 입력 값은 두 번째 입력 값보다 항상 작습니다).
# 첫 번째 정수부터 두 번째 정수까지 숫자를 출력하면서
# 5의 배수일 때는 'Fizz', 7의 배수일 때는 'Buzz'
# , 5와 7의 공배수일 때는 'FizzBuzz'를 출력하는 프로그램을 만드세요
# (input에서 안내 문자열은 출력하지 않아야 합니다).
#입력
#35 40
#결과
#FizzBuzz
#36
#37
#38
#39
#Fizz
이문제 두 개의 정수 값을 입력받아 그사이의 정수 값을 조건에 따라 출력하는 문제입니다.
이러한 문제 또한 두 개의 방법으로 풀 수 있습니다.
a,b=map(int,input().split())
for i in range(a,b+1):
if i%5==0 and i%7==0:
print('FizzBuzz')
elif i%5==0:
print('Fizz')
elif i%7==0:
print('Buzz')
else:
print(i)
첫 번째 방법은 if문을 통해 각각의 경우 별 행동을 지정하는 방법입니다. 이 방법을 하게되면 순차적으로 넘어가기때문에 풀기도 편하고 이상이 있을경우에도 유지보수하기 편한기때문에 이방법을 추천드립니다.
a,b=map(int,input().split())
for i in range(a,b+1):
print('Fizz'*(i%5==0)+'Buzz'*(i%7==0) or i)
두첫 번째 방법은 print안에서 연산을 통해 처리하는 방법입니다. 이 방법은 소스는 줄어들지만 틀리거나 오류들을 고칠 때 어려움을 겪을 수도 있기 때문에 첫 번째 방법을 추천드립니다.
'파이썬 > 코딩도장' 카테고리의 다른 글
코딩도장Unit 16 ~ Unit 18 심사문제 풀이 (0) | 2022.01.11 |
---|---|
코딩도장Unit 13 ~ Unit 15 심사문제 풀이 (0) | 2022.01.10 |
코딩도장Unit 03 ~ Unit 12 심사문제 풀이 (0) | 2022.01.04 |