whatisthis?

Phython. 파이썬 코딩 기초편-05 본문

WEB STUDY/PHYTHON | BACK-END

Phython. 파이썬 코딩 기초편-05

thisisyjin 2021. 9. 14. 21:12

조건문(if) / 반복문 (for, while) / continue와 break

 

<Day 4 Quiz>

당신의 학교에서는 파이썬 코딩 대회를 주최한다.

댓글 이벤트를 진행하기로 했는데, 댓글 작성자중에서 1명은 치킨, 3명은 커피 쿠폰을 받게 된다.

추첨 프로그램을 작성하시오.

 

조건1) 편의상 댓글은 20명이 작성했고, 아이디는 1~20 이라 가정

조건2) 댓글 내용과 관련 없이 무작위로 추첨. 중복은 불가

조건3) random 모듈의 shuffle과 sample을 이용

 

<random 모듈의 함수>

shuffle(변수명) = 순서 랜덤으로 섞어주는 함수
sample(변수명, 갯수) = 갯수만큼 랜덤으로 뽑는 함수

(1:51:04)

 

추가로 강의에선 나오지 않았지만,
왠지 1부터 20까지를 직접 컴마로 나열하는 것은 비효율적이라 생각되었다.
따라서 난 구글링을 통해
range()함수에 대해 알게 되어
코드에 적용시켰다.

range(시작, 끝)
이 또한 끝범위는 '미만'으로 적용하여
만약 1부터 20까지를 출력한다면
print( range(1,21) ) 로 작성해야한다.

 

range 함수

range(5) = 0부터 4까지 출력 (5미만)
range(1,5) = 1부터 4까지 출력 (1이상 5미만)
range(1, 100, 3) = 1부터 99까지 3간격씩 출력 (1이상 100미만. 3씩)
>> 예 = 1, 4, 7, 10, 13, ...

+) reversed()함수를 이용하면 range값의 반대 역순으로 출력해준다.reversed(range(1,5)) 는 4 3 2 1 과 같이 나온다.

 

 

from random import *

id = list(range(1,21))
shuffle(id)


select = sample(id, 4)
print(select)

chicken = sample(select, 1)
print("치킨 당첨 id는 " + str(chicken) + "입니다.")

print("커피 당첨 id는 " + str(set(select) - set(chicken)) + "입니다.")

 

 

id 변수를 set으로 하고싶었는데
shuffle()함수는 리스트만 가능한 것 같다.

그래서 일단 list 자료구조로 설정한다음
shuffle을 해서 순서를 랜덤으로 섞고

select 변수를 설정하여 우선적으로 4명을 뽑았다.

그중에서 chicken을 받을 한명을
sample(select,1)로 한명만 뽑게 하고

select (4명) 중에 chicken(1명)을 제외한 세명은 커피를 받으므로
집합의 차집합 성질을 이용하고자
일시적으로 select와 chicken 변수를 set(집합) 으로 처리한 후 - 연산자로 차집합을 얻어내었다.


** 내가 생각하는 문제점 **
str()함수로 감쌌는데 [] 와 {}가 그대로 나온다.
내 생각에는 .. 보기 좋게 둘다 [] 로 나오도록 하거나
아예 없앨 수 있는지 알아봐야겠다.

 

 

 

 

 


from random import *

id = list(range(1,21))
shuffle(id)

winners = sample(id, 4)

print("치킨 당첨자 : {}".format(winners[0]))
print("커피 당첨자 : {}".format(winners[1:]))

강의에서 알려준 정답.

어차피 shuffle로 순서를 섞었으니

4명을 뽑고나서 winners 변수에 저장하고,

winners 변수의 첫번째값(index값은 0번지)을 치킨당첨자로,

나머지 1번지부터 끝까지를 커피당첨자로 format을 이용하여 출력했다.

 

내가 작성했던 코드처럼 굳이 차집합을 이용하려고 set로 자료구조를 변경하는 번거로움이 없어진다.

 

print("치킨 당첨자 : {0}".format(winners[0]))

이처럼 format을 이용하여 리스트 변수의 값 하나만 출력하면 자동으로 대괄호 없이 숫자만 나옴.

 

내 코드의 잘한 점 내 코드의 고칠 점
range() 함수를 이용한 점.

1명을 뽑고나서 3명을 뽑으면 중복가능성이 있으므로
한꺼번에 4명을 sample()함수로 뽑아낸 점.

sample한 변수를 다시한번 sample(,1)하여 한명을 골라낸것.
아이디어는 좋았으나 ..

변수가 너무 많다.
장점이 될수도 있으나 좀더 깔끔하게 적자.

4개 뽑은 것 중에 하나를 뽑고 그걸 제외한 3개를 얻기 위해서 굳이 set으로 자료구조를 변경하여 차집합을 사용했다.

이는 { } 로 출력되기 때문에 옳지 않음.

 

 

shuffle(변수명) = 순서 랜덤으로 섞어주는 함수
sample(변수명, 갯수) = 갯수만큼 랜덤으로 뽑는 함수

 

 


 

1. 조건문 if

 

 

분기. 조건문. 조건에 따라 실행할 명령문이 달라짐.

 

 

예제1.

weather = "미세먼지"
# if 조건:
#     실행 명령문

if  weather == "비":
    print("우산을 챙기세요")

elif weather == "미세먼지":
    print("마스크를 쓰세요")

else:
    print("오늘은 준비물이 필요없습니다")

 

IF - ELIF - ELSE 구조.

기본 문법은

 

if 조건 :

      실행 명령문 이다.

 

 

if if 조건 :
     실행 명령문
elif = else if. if가 아닌 경우에 해당하는 else if.
이건 여러개 작성이 가능하다.
else else if도 아닌 경우. 이건 여집합 개념(아무것도 속하지 않은 나머지)라고 생각하면 된다.

 

weather = input("오늘 날씨는? :")

if  weather == "비":
    print("우산을 챙기세요")

elif weather == "미세먼지":
    print("마스크를 쓰세요")

else:
    print("오늘은 준비물이 필요없습니다")

input()함수로 사용자에게 값을 입력받도록 하여 실행할 수 있다.

'미세먼지'라고 작성한 결과

** input함수

input("출력될문구") 

= C언어의 scanf와 비슷하다고 생각하면 된다.

 

** 만약 조건을 두개를 하고싶다면?

if  weather == "비" or weather == "눈":
    print("우산을 챙기세요")

if 조건1 or 조건2 :

    실행될 명령문

 

*and도 가능하다.

 

 

___

 

 

예제 2. 

 

 

temp = int(input("기온 입력 : "))

if 30 <= temp:
    print("지금 매우 덥습니다.")
elif 10 <= temp and temp < 30:
    print("날씨가 괜찮아요.")
elif 0 <= temp < 10:
    print("외투를 챙기세요")
else:
    print("너무 추워요.")

부등호로 표현시 and를 이용하거나 한꺼번에 작성해도 된다.

0 <= temp and temp < 10

0 <= temp < 10

 

예제2 실행 결과

 


**참고) 조건에서 in이란?

 

예 -

 

absent = [ 김씨, 최씨 ] 

student = [ 김씨,  최씨 , 강씨, 이씨 , 박씨, 정씨, 한씨 , 권씨 ]

student in absent 조건 = student 변수 중에서 absent 변수에 속하는 원소.

즉, 김씨, 최씨 2개의 원소에 해당한다.

 

 

예 2 -

random_num = [ 1, 3, 7 ]

새로운 변수 지어서 (예-  number)

number in random_num 조건 = random_num 변수가 차례로 number에 입력됨.

print number하면 

1

3

7

과 같이 출력된다.

 

 

예 3 - range나 배열 이용

 

새로운 변수인 number이용한다 했을때,

 

number in [1, 2, 3, 4, 5]

이면 number 변수에 차례로 배열의 원소값들이 들어가게됨.

프린트 해서 반복문으로 해보면

1

2

3

4

5

와 같이 출력됨.

 

range도 마찬가지로 

number is range(1,6)으로 작성하면 1이상 6미만이므로 1,2,3,4,5가 차례로 number 변수에 들어감.

1

2

3

4

5

와 같이 출력됨.

 


 


 

2. 반복문 for

예제1.

print("대기번호 : 1")
print("대기번호 : 2")
print("대기번호 : 3")
print("대기번호 : 4")
print("대기번호 : 5")

예를 들면, 대기번호를 출력해주는 프로그램의 경우,

대기자가 100명이라면 100번의 코드를 입력해야하는 불편함이 있다.

이때, 반복문인 for을 이용해주면 편리하게 쓸 수 있다.

 

 

 

for wating_num in [1, 2, 3, 4, 5]:
    print("대기번호: {0}".format(wating_num))

<문법>

for 변수명 in [ 배열 ]:

   시행될 명령문

 

정확하게 같은 결과가 나옴을 알 수 있다.

in [ ] 의 경우엔 지정된 값을 하나하나 입력해야 할 경우에 사용하고,

그 외에 범위가 필요하다면 range(시작값, 끝값+1)을 해주면 된다. (= 끝값은 미만으로 치기 떄문에.)

 

 

실행 결과는 in[]과 in range(1,6)이 같다.

 

 

___

 

예제2. 

 

starbucks = ["김씨", "이씨", "최씨"]

for customer in starbucks:
    print("{0}, 커피가 준비되었습니다.".format(customer))

 

배열 변수인 starbuck 속의 값을 customer라는 변수로 지정하여  

for 실행시키면 다음과 같이 한꺼번에 프린트된다.

예제 2 실행결과

 

 

 


 

3. 반복문 while

 

예제 1.

customer = "김씨"
index = 5

while index >= 1:
    print("{0}, 커피가 준비되었습니다. {1}번 남았어요.".format(customer, index))
    index -= 1
    if index == 0:
        print("커피가 폐기되었습니다.")

index 변수가 1보다 크거나 같을때까지 반복. 

즉, index가 1일때까지만 반복되고, index가 1이면 print후에 index-=1 에 의해 0이 된다. 

(이떄 while문을 빠져나온 것)

if문의 조건인 index==0 을 통해 "커피가 폐기되었습니다." 문구가 출력됨. 

 

 

 

 

cf > 무한 루프

 

while True: 입력시 계속해서 해당 명령문이 실행되는 무한루프가 걸린다. (Ctrl + C 로 빠져나올 수 있다.)

customer = "김씨"
index = 1

while True:
    print("{0}, 커피가 준비되었습니다. {1}회째 호출입니다.".format(customer, index))
    index += 1

 

계속 멈추지 않고 실행됨. (Ctrl+C로 빠져나오기)

 

___

 

예제 2. 

 

customer = "김씨"
person = "Unknown"

while person != customer :
    print("{0}, 커피가 준비되었습니다.".format(customer))
    person = input("성함이 어떻게 되세요? : ")

!=는 not의 의미로, 일치하지 않는 경우를 말한다.

 

input함수로 person 변수값을 입력받고, customer 변수와 일치하지 않는다면

계속해서 while문속 print함수가 반복된다. (또한 input()함수로 인해 값 입력을 한번 더 요구한다.)

 

 

마지막에 김씨라고 입력했을때 while문을 빠져나왔다.

 

 


 

4. Continue 와 break

 

예제 1.

absent = [2, 5] # 결석한 학생들

for student in range(1, 11):
    if student in absent:
        continue
    print("{0}, 책을 읽어봐.".format(student))

 

=

continue = 반복문에서 얘네 빼고 진행시켜. (쭉 이어나가)

 

if 조건 :

    continue 와 같이 사용하거나

 

for 조건 :

   continue와 같이 사용할 수 있다.

 

 

예제 2. break 사용

 

absent = [2, 5] # 결석한 학생들
no_book = [7]

for student in range(1, 11):
    if student in absent:
        continue

    elif student in no_book:
        print("오늘 수업 여기까지. {0}는 교무실로 와라.".format(student))
        break

    print("{0}, 책을 읽어봐.".format(student))
elif student in no_book:                                                              
        print("오늘 수업 여기까지. {0}는 교무실로 와라.".format(student))
        break                                                                               

다음과 같이 no_book 변수에 속한다면 break 해버림 (반복문 종료)

 

 

 


5. 한줄 for문

예제 1.

# 출석번호가 1 2 3 4 앞에 100을 붙임 -> 101. 102, 103, 104

students = [1, 2, 3, 4, 5]
print(students)

students = [i+100 for i in students]
print(students)

다음과 같이 한줄 for문을 작성할 수 있다.

 

예제1 실행 결과

 

___

 

예제 2.

 

# 학생 이름을 길이로 변환

students = ["James", "Mina", "Thisisyjin"]
print(students)
students = [len(i) for i in students]
print(students)

len()함수로 반환하도록 한줄 for문 작성함.

 

예제 2 실행결과

___

 

예제 3.

 

# 학생 이름을 대문자로 변환 

students = ["James", "Mina", "Thisisyjin"]
print(students)
students = [i.upper() for i in students]
print(students)

upper()  함수 : 변수 내 모든 글자를 대문자로.

>> 변수명.upper()

 

 

 

 

 

<Quiz>

 

당신은 카카오 서비스를 이용하는 택시기사이다.

50명의 승객과 매칭 기회가 있을때, 총 탑승 승객 수를 구하는 프로그램을 작성하시오.

 

 

<조건>

1. 승객별 운행 소요 시간은 5분 ~ 50분 사이 난수로 정해진다.

2. 당신은 소요시간 5분 ~ 15분 사이 승객만 매칭해야 한다.

 

<출력 예시>

[O] 1번째 손님 (소요시간 : 15분)
[  ] 2번쨰 손님 (소요시간 : 50분)
[O] 3번째 손님 (소요시간 : 5분)
...
[  ] 50번째 손님 (소요시간 : 16분)

총 탑승 승객 : 2 분

 


 

내가 작성한 코드. 

 

# 50명의 손님 중 탑승 승객 수 구하는 프로그램

from random import *

count = 0;

for matching in range(1, 51):
    time = randint(5, 51)
    if(5 <= time <= 15):
        print("[O] {0}번째 손님 (소요시간 : {1}분)".format(matching, time))
        count += 1
    else:
        print("[ ] {0}번째 손님 (소요시간 : {1}분)".format(matching, time))
print("총 탑승 승객 : " + str(count) + "분")

 

 

 

[ ] 1번째 손님 (소요시간 : 45분)
[ ] 2번째 손님 (소요시간 : 42분)
[O] 3번째 손님 (소요시간 : 13분)
[O] 4번째 손님 (소요시간 : 13분)
[ ] 5번째 손님 (소요시간 : 29분)
[O] 6번째 손님 (소요시간 : 12분)
[O] 7번째 손님 (소요시간 : 9분)
[O] 8번째 손님 (소요시간 : 5분)
[ ] 9번째 손님 (소요시간 : 27분)
[ ] 10번째 손님 (소요시간 : 27분)
[ ] 11번째 손님 (소요시간 : 31분)
[O] 12번째 손님 (소요시간 : 5분)
[O] 13번째 손님 (소요시간 : 11분)
[ ] 14번째 손님 (소요시간 : 44분)
[ ] 15번째 손님 (소요시간 : 37분)
[O] 16번째 손님 (소요시간 : 10분)
[O] 17번째 손님 (소요시간 : 5분)
[ ] 18번째 손님 (소요시간 : 50분)
[ ] 19번째 손님 (소요시간 : 38분)
[ ] 20번째 손님 (소요시간 : 49분)
[ ] 21번째 손님 (소요시간 : 20분)
[O] 22번째 손님 (소요시간 : 12분)
[ ] 23번째 손님 (소요시간 : 43분)
[ ] 24번째 손님 (소요시간 : 34분)
[O] 25번째 손님 (소요시간 : 10분)
[ ] 26번째 손님 (소요시간 : 49분)
[ ] 27번째 손님 (소요시간 : 22분)
[ ] 28번째 손님 (소요시간 : 35분)
[ ] 29번째 손님 (소요시간 : 51분)
[ ] 30번째 손님 (소요시간 : 23분)
[ ] 31번째 손님 (소요시간 : 49분)
[ ] 32번째 손님 (소요시간 : 17분)
[ ] 33번째 손님 (소요시간 : 26분)
[ ] 34번째 손님 (소요시간 : 31분)
[ ] 35번째 손님 (소요시간 : 23분)
[ ] 36번째 손님 (소요시간 : 19분)
[ ] 37번째 손님 (소요시간 : 38분)
[ ] 38번째 손님 (소요시간 : 37분)
[ ] 39번째 손님 (소요시간 : 21분)
[O] 40번째 손님 (소요시간 : 7분)
[ ] 41번째 손님 (소요시간 : 40분)
[ ] 42번째 손님 (소요시간 : 45분)
[O] 43번째 손님 (소요시간 : 7분)
[ ] 44번째 손님 (소요시간 : 33분)
[ ] 45번째 손님 (소요시간 : 26분)
[O] 46번째 손님 (소요시간 : 10분)
[ ] 47번째 손님 (소요시간 : 50분)
[ ] 48번째 손님 (소요시간 : 47분)
[ ] 49번째 손님 (소요시간 : 31분)
[ ] 50번째 손님 (소요시간 : 45분)
총 탑승 승객 : 14분