본문 바로가기
제로베이스 데이터 스쿨/일일 스터디 노트

4일차 스터디노트 / 파이썬 연습 문제 풀이(조건문, 반복문) / 제로베이스 데이터 취업 스쿨

by 김뎀뎀 2023. 1. 7.

📗 4일차 공부 내용 요약

[ 파이썬 연습문제 풀이]

1. 조건문 : 단일 조건문, 양자택일 조건문 등 다양한 조건문을 작성해보는 연습문제를 풀었다.

2.반복문 : for문,  while문을 활용해 최소공배수 등을 구하는 연습문제를 풀었다.

 


📖  4일차 공부 내용 자세히

※ 기억에 남는 문제 위주로 기재해본다

1. 조건문 연습문제 풀이

Q.미세먼지 비상저감조치로 차량 운행 제한 프로그램을 만들어보자
- 미세먼지 츨정 수치가 150 이하면 차량 5부제 실시
- 미세먼지 측정 수치가 150을 초과하면 차량 2부제 실시
- 미세먼지 수치, 차량 종류, 차량번호를 입력하면 운행 가능 여부 출력
import datetime

today = datetime.datetime.today()
day = today.day

dust = int(input('미세먼지 수치 입력 : '))
car = int(input('차량 종류 선택. 1.승용차    2.영업용차 '))
carNumber = int(input('차량 번호 입력 : '))

carNumberE = int(carNumber % 1000)

limitDust = 150

print('-'*40)
print(today)
print('-'*40)

if dust > limitDust and car ==1  : # 150 초과, 승용차, 차량 2부제
    if (day %2) == (carNumber %2) : #나머지가 같으니까, 둘 다 짝수/홀수로 같게 된다
        print('차량 2부제 적용')
        print('차량 2부제로 금일 운행제한 대상 차량입니다')
    else:
        print('금일 운행 가능합니다')

if dust > limitDust and car == 2 : # 150 초과, 영업용, 차량 5부제
    if (day % 5) == (carNumber % 5):  # 5부제 = 5로 나눈 나머지
        print('차량 5부제 적용')
        print('차량 5부제로 금일 운행제한 대상 차량입니다')
    else:
        print('금일 운행 가능합니다')

if dust <= limitDust : # 150 이하
    if (day % 5) == (carNumber % 5):
        print('차량 5부제 적용')
        print('차량 5부제로 금일 운행제한 대상 차량입니다')
    else:
        print('금일 운행 가능합니다')

print('-'*40)

'''
<결과>

미세먼지 수치 입력 : 1
차량 종류 선택. 1.승용차    2.영업용차 2
차량 번호 입력 : 1277
----------------------------------------
2023-01-07 02:30:40.175076
----------------------------------------
차량 5부제 적용
차량 5부제로 금일 운행제한 대상 차량입니다
----------------------------------------
'''

 

Q. PC 에서 난수를 발생하면 사용자가 맞추는 게임을 만들어보자.
-  PC가 난수(1~1000)을 발생하면 사용자가 숫자(정수)를 입력한다.
- 사용자가 난수를 맞추면 게임이 종료된다.
- 만약, 못 맞추게 되면 난수와 사용자 숫자의 크고 작음을 출력한 후 사용자한테 다시 기회를 준다
- 최종적으로 사용자가 시도한 횟수를 출력한다
import random

comNum = random.randint(1,1000)
cnt = 0
gameFlag = True

while gameFlag : #while 에서 flag 활용
    cnt += 1
    userNum = int(input('1에서 1000까지의 정수 입력 : '))

    if comNum == userNum :
        print('빙고!')
        gameFlag = False
    else:
        if comNum > userNum :
            print('난수가 크다!')
        else:
            print('난수가 작다!')


print('난수 : {}, 시도 횟수 : {}'.format(comNum,cnt))

 

2. 반복문 연습문제 풀이

Q. 집 앞 버스 정류장에서 학교까지 가는 버스 
[ 버스 A, B 운행 정보 ]
-오전 6 시 첫차 : 오후 23 시 운행 종료
- 버스 A : 15 분 간격 운행
-버스 B : 13 분 간격 운영
[ 버스 C 운행 정보 ]
-6 시 20 분 첫차 : 오후 22 시 운행 종료
-버스 C : 8 분 간격 운행
busA = 15
busB = 13
busC = 8

totalMin = 60 * 17 #A와 B는 6시부터 23시까지 총 17시간 운행한다
for i in range(totalMin+1): #★★★ for문을 통해 1분씩 시간이 흐름을 표현했다
    if i < 20 or i > (totalMin - 60): #C가 운행하기 전, C 운행 종료 후
        if i % busA == 0 and i % busB == 0 : #공배수?
            print('busA와 busB 동시 정차!!',end='')
            hour = 6 + i//60
            min = i % 60
            print('\t{}:{}'.format(hour,min))
    else:
        if i % busA == 0 and i % busB == 0:  # 공배수?
            print('busA와 busB 동시 정차!!', end='')
            hour = 6 + i // 60
            min = i % 60
            print('\t{}:{}'.format(hour, min))
        elif i % busA == 0 and i % busC == 0:
            print('busA와 busC 동시 정차!!', end='')
            hour = 6 + i // 60
            min = i % 60
            print('\t{}:{}'.format(hour, min))
        elif i % busB == 0 and i % busC == 0:
            print('busB와 busC 동시 정차!!', end='')
            hour = 6 + i // 60
            min = i % 60
            print('\t{}:{}'.format(hour, min))
            
            
'''
 < 결과 >
 busA와 busB 동시 정차!!	6:0
busB와 busC 동시 정차!!	7:44
busA와 busC 동시 정차!!	8:0
busA와 busB 동시 정차!!	9:15
busB와 busC 동시 정차!!	9:28
busA와 busC 동시 정차!!	10:0
busB와 busC 동시 정차!!	11:12
busA와 busC 동시 정차!!	12:0
busA와 busB 동시 정차!!	12:30
busB와 busC 동시 정차!!	12:56
busA와 busC 동시 정차!!	14:0
busB와 busC 동시 정차!!	14:40
busA와 busB 동시 정차!!	15:45
busA와 busC 동시 정차!!	16:0
busB와 busC 동시 정차!!	16:24
busA와 busC 동시 정차!!	18:0
busB와 busC 동시 정차!!	18:8
busA와 busB 동시 정차!!	19:0
busB와 busC 동시 정차!!	19:52
busA와 busC 동시 정차!!	20:0
busB와 busC 동시 정차!!	21:36
busA와 busC 동시 정차!!	22:0
busA와 busB 동시 정차!!	22:15
'''

 

Q. 톱니가 각각 n1 개와 n2 개의 톱니바퀴가 서로 맞물려 회전할 때 ,
회전을 시작한 후 처음 맞물린 톱니가 최초로 다시 만나게 될 때까지의
톱니의 수와 각각의 바퀴 회전수를 출력해보자

단 , n2 는 n1 보다 크다
gearAcnt = int(input('GearA 톱니수 입력 : '))
gearBcnt = int(input('GearB 톱니수 입력 : '))

gearA = 0
gearB = 0 #회전하면서 누적되는 톱니수
leastNum = 0 #최소공배수

flag = True
while flag :

    if gearA != 0 : #기어가 회전을 시작하면
        if gearA != leastNum : #최소공배수가 아직 안됬다면
            gearA += gearAcnt #계속 회전
        else:
            flag = False
    else:
        gearA += gearAcnt #기어 회전 시작

    if gearB !=0 and gearB % gearAcnt == 0: # 기어B가 회전하는 동안 A와 맞닿았다면
        leastNum = gearB
    else:
        gearB += gearBcnt #기어 회전 시작, 계속 회전

print('최초 만나는 톱니수(최소공배수) : {}톱니'.format(leastNum))
print('gearA 회전 수 : {}회전'.format(int(leastNum/gearAcnt)))
print('gearB 회전 수 : {}회전'.format(int(leastNum/gearBcnt)))

'''
<결과>

GearA 톱니수 입력 : 4
GearB 톱니수 입력 : 18
최초 만나는 톱니수(최소공배수) : 36톱니
gearA 회전 수 : 9회전
gearB 회전 수 : 2회전

'''

➰ 4일차 후기

반복문에서 for과 while문을 사용하는 경우를 효율적으로 구분해 활용할 것.

반복문을 통해 최소공배수, 공배수를 알아내는 예제의 코드들을 한 번 더 살펴보면서 반복문의 구조에 익숙해져야 겠다.

반복문의 무한굴레다 ~


※본 내용은 제로베이스 데이터 취업 스쿨에서 제공하는 학습 내용에 기반합니다.