[Python] Chater02. 파이썬 기초 문제 풀이(난수 홀/짝 판별, 별찍기, 톱니바퀴)

황성미·2023년 7월 8일
0
post-thumbnail
post-custom-banner

오늘은 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 모듈을 보면 항상 범위가 정해져있어서 제한이 없는 숫자들 중 홀/짝 맞추는 프로그램은 못 만들어 아쉽지만, 범위를 사용자에게 입력받아 난수를 생성할 수 있게는 만들 수 있다 :)





난수 생성 문제를 하나 더 풀어보쟈!

사용자가 숫자(정수)를 입력하여 PC에서 발생한 난수(1~1000)를 알아맞추는 프로그램을 완성해라. 단, 못 맞출 시 난수와 사용자 숫자의 크고 작음을 출력하고 사용자에게 다시 기회를 주고, 최종적으로 사용자가 시도한 횟수를 출력해라.

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문을 이용!




⭐파이썬 별찍기

파이썬 반복문에서 별찍기 문제는 흔한 문제다. 흔하다고.. 쉽다고 생각하면 경기도 오산..😅 프로그램 관점으로 패턴 파악하는게 은근 어렵다;;

‘*’를 이용해 아래 그림과 같이 출력되도록 프로그램을 완성해라.

1
for i in range(1,6):
	for j in range(i):
		print('*' , end = '')
	print()

2
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()

3,4

💡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()

5

💡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()

6,7

💡왼쪽 그림은 각 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()

8

💡앞의 공백만 생각하고 '*'이 나온 뒤의 공백은 생각 안해도 됨

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()





⚙️톱니바퀴

톱니가 각각 n1개와 n2개 있는 톱니바퀴가 서로 맞물려 회전할 때, 회전을 시작한 후 처음 맞물린 톱니가 최초로 다시 만나게 될 때까지의 톱니의 수와 각각의 바퀴 회전 수를 출력하는 프로그램을 완성해라. (단 n2 > n1)

💡최소공배수를 왜 이용해야 할까?
찾아보니.. 중학교 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, 갤럽강점검사 등등 해봄!!👀👀) 깊이 생각해볼 시간이 없어서 항상 '나의 장점은 뭐지?', '나의 단점은 뭐지?' 했을 때 바로 대답이 나오질 못했었다. 오늘의 주저리에선 나도 모르게.. 나의 생각들이 쉽게 잘 써져서 벌써.. 여러 가지 에피소드가 나왔던 것 같닼ㅋㅋㅋㅋ 잘 활용해서 나중에 자기소개서도 써봐야겠다.

다음주도 화이팅👊🏻👊🏻

profile
데이터 분석가(가 되고픈) 황성미입니다!
post-custom-banner

0개의 댓글