오늘은 7일, 8일 공부한 내용들 중 기억에 남는 문제들을 정리해보려 한다.
데이터 분석에서도 많이 쓰였던 난수 생성 함수들과, 매번 등장해서 풀어도 매번 헷갈리는 다양한 별찍기 문제들, 톱니바퀴 문제 이렇게 정리해보았다.
그럼 고고~!!
import random
num = random.randint(1,100)
user = int(input("홀/짝 선택 : 1. 홀 \t 2. 짝 "))
if num % 2 == 0: #짝수일때
if user == 1: #홀수라고 말한 경우
print("실패!! 짝수!!!")
else: #짝수라고 말한 경우
print("빙고!! 짝수!!!")
else: #홀수일때
if user == 1: #홀수라고 말한 경우
print("빙고!! 홀수!!!")
else: #짝수라고 말한 경우
print("실패!! 홀수!!!")
💡난수 생성 함수 import random
원래는 공식 홈페이지를 참고하는게 맞지만.. 워낙 잘 정리된 페이지를 발견해서 같이 첨부해요!
강의에서는 num = random.randint(1,2)
를 해서 1과 2 사이 중 랜덤으로 하나 선택된 숫자를 사용자가 홀/짝으로 맞출 수 있느냐의 관점으로 문제를 풀었었다.
1과 2 사이 중 고르면 되었기에 if ~ elif 문(난수는 1(2), 사용자가 홀/짝이라고 했을때의 경우로 나누어서)으로도 해결이 되었는데 조금(?) 심화하여 1과 100 사이의 수 중 랜덤하게 고르는 문제로 변경해보았다.
이렇게 변경된다면, 위와 같이는 문제를 풀지 못하고 ✨산술연산자✨를 사용해야한다!!
random 모듈을 보면 항상 범위가 정해져있어서 제한이 없는 숫자들 중 홀/짝 맞추는 프로그램은 못 만들어 아쉽지만, 범위를 사용자에게 입력받아 난수를 생성할 수 있게는 만들 수 있다 :)
난수 생성 문제를 하나 더 풀어보쟈!
import random
pc_num = random.randint(1,1000)
cnt = 0 #사용자가 시도한 횟수
while: #알아맞출 때까지 계속 시도
cnt += 1
user_num = int(input("1에서 1000까지의 정수 입력 : ")
if user_num == pc_num:
print("빙고")
else:
if user_num > pc_num:
print("난수가 크다!")
else:
print("난수가 작다!")
print("난수 : {} , 시도 횟수 : {}".format(user_num , cnt)
💡알아맞출 때까지 시도하는 것은 while문을 이용!
파이썬 반복문에서 별찍기 문제는 흔한 문제다. 흔하다고.. 쉽다고 생각하면 경기도 오산..😅 프로그램 관점으로 패턴 파악하는게 은근 어렵다;;
for i in range(1,6):
for j in range(i):
print('*' , end = '')
print()
for i in range(1,6):
#빈칸이 4,3,...,0 순서로 들어갈 수 있도록
for j in range(5 - i):
print(' ', end = '')
#'*' 채우기
for s in range(i):
print('*', end = '')
print()
💡1, 2번 문제와 반대
#왼쪽 별그림
for i in range(5,0,-1):
for j in range(i):
print('*', end = '')
print()
#오른쪽 별그림
for i in range(5,0,-1):
for j in range(5 - i):
print(' ', end = '')
for s in range(i):
print('*', end = '')
print()
💡4번째 줄까지는 1번 문제와, 5번째 줄부터는 3번 문제 참고
for i in range(1,10):
#4까지는 하나씩 늘려가고
if i < 5:
for j in range(i):
print('*', end = '')
#5부터 9까지는 하나씩 줄어들게
else:
for j in range(10 - i):
print('*', end = '')
print()
💡왼쪽 그림은 각 n번째 줄마다 n번째 행에 '*'이 있고 오른쪽 그림은 이를 반대로 출력
#왼쪽 별그림
for i in range(1, 6):
for j in range(1,6):
#i번째 자리에만 '*' 가 오게
if j == i:
print('*', end = '')
#나머지 자리는 빈칸
else:
print(' ', end = '')
print()
#오른쪽 별그림
for i in range(5,0,-1):
for j in range(1,6):
if j == i:
else:
print(' ', end = '')
print()
💡앞의 공백만 생각하고 '*'이 나온 뒤의 공백은 생각 안해도 됨
for i in range(1, 11): #1 ~ 10번째 줄
#5번째 줄을 기점으로 패턴이 바뀜
if i < 6: #1~5번째 줄
for j in range(5 - i): #5 - i 만큼 '*'이 나오기 전 공백이 생김
print(' ', end = '')
for s in range(2 * i -1):#'*'이 홀수개만큼 생김
print('*', end = '')
else: #6~10번째 줄
for j in range(i - 6): #i -6만큼 '*'이 나오기 전 공백이 생김
print(' ', end = '')
for s in range(2 * (11 - i) - 1):
print('*', end = '')
print()
💡최소공배수를 왜 이용해야 할까?
찾아보니.. 중학교 1학년(?) 문제에 이런게 나오더라..ㅎㅎ 참고했던 사이트를 첨부할테니 이 문제에 최소공배수를 왜 이용해야하는지 수학적 지식이 필요하신 분은 클릭하기!!
n1 = int(input("GearA 톱니수 입력 : "))
n2 = int(input("GearB 톱니수 입력 : "))
#"처음 맞물린 톱니가 최초로 다시 만나게 될 때까지의" 란 말은
#두 톱니바퀴가 돌아가면서 공통적으로 걸리게 되는 톱니의 총 개수가 있을 것이고
#그러한 개수를 거친 직후가 GearA가 몇 바퀴 회전한 후의 일인가? 하는 것이다.
#톱니 n1개 짜리가 있으면 1회전 시 n1개, 2회전 시 2*n1개 ... 이런식으로 알아보면 된다.
#두 톱니 수가 최초로 공통적으로 갖게 되는 배수를 구하면 쉽게 구할 수 있으므로
#최소 공배수를 이용하는 것이다.
#n2를 n1보다 크게 입력하지 않은 경우, 계속 다시 입력을 받게 함.
while n1 >= n2:
if n1 >= n2:
print("GearB의 톱니수는 GearA의 톱니수 보다 많아야합니다. 다시 입력해주세요.")
n1 = int(input("GearA 톱니수 입력 : "))
n2 = int(input("GearB 톱니수 입력 : "))
change1 = n1 #GearA가 회전할 때마다 돌아간 톱니 수는 n1개
change2 = n2 #GearB가 회전할 때마다 돌아간 톱니 수는 n2개
while True:
if change1 % change2 == 0:
break
#while문을 빠져나오게 된다면 change1은 n1과 n2의 최소공배수가 되어있을 것이다.
change1 += n1 #다시 만나지 못했다면(최소공배수가 아니라면) 다시 한 번 더 회전해야한다.
#GearA가 회전할 때마다 n1만큼의 톱니수가 증가한다.
print("최초 만나는 톱니수(최소공배수) : {}톱니" .format(change1))
print("gearA 회전수 : {}회전".format(change1 // n1))
print("gearB 회전수 : {}회전".format(change1 // n2))
문제가 의도하고자했던 점을 파악하고 그것만 푸는 것도 좋지만, 예외상황이 발생했을 때에도(톱니바퀴 문제의 경우, n2가 n1보다 작게 입력되었을때)프로그램이 동작할 수 있게 코딩하는 것도 중요함을 대학 시절 배웠었다. 그래서 요즘은 문제를 보았을 때 최대한 예외 상황의 경우도 코딩할 수 있도록 습관을 들이고 있다. (이것도 나의 장점 중 하나, 가르침 받은 내용을 계속 생각하고 습관화될 수 있도록 노력하는 거🥰)
또한, 어떤 수학적 또는 이론적 지식이 필요한 문제를 풀 때 그냥 '이걸 이용하면 된대~!'하고 이용해서 문제를 풀면 그만일 수도 있겠지만.. 나는 이해를 할 때까지 문제를 들여다보거나, 해당 자료를 찾아보거나, 이미 알고있는 사람에게 물어봐서라도 왜 그것을 이용하는지에 대해 알아가는 시간을 가진다는 것을 이번 강의를 들으며 다시 깨달았다.ㅋㅋㅋㅋ
그래서 남들보다 느릴 수 있겠지만 다음 비슷한 문제가 나왔을 때 또는 심화시켜 적용할 수 있는 문제를 직면했을 때 응용할 수 있는 힘을 가지게 된 게 아닐까란 생각을 하게 되었다:)
제로베이스 스쿨 1주차가 끝났다. 이미 파이썬에 대해 충분한 지식이 있으신 다른 분들은 강의 내용을 정리하는 것 외에 다른 심화 지식들도 올리시던데.. 나는 강의 내용을 정리하고 마지막에 쓰고 있는 ✨오늘의 주저리✨를 잘 활용해 볼 생각이다. 원래도 나란 사람은 어떤 사람인지에 대해 알아가보는 것을 좋아했는데(MBTI, 갤럽강점검사 등등 해봄!!👀👀) 깊이 생각해볼 시간이 없어서 항상 '나의 장점은 뭐지?', '나의 단점은 뭐지?' 했을 때 바로 대답이 나오질 못했었다. 오늘의 주저리에선 나도 모르게.. 나의 생각들이 쉽게 잘 써져서 벌써.. 여러 가지 에피소드가 나왔던 것 같닼ㅋㅋㅋㅋ 잘 활용해서 나중에 자기소개서도 써봐야겠다.
다음주도 화이팅👊🏻👊🏻