-Summary-
dictionary, if elif else 조건문, for while 반복문, break, continue, 중첩 for문을 이용한 계단식 별 출력
01-22 (Unit 12.1 ~ 13.7)
-딕셔너리-
딕셔너리는 영어단어 dictionary로 사전이라는 뜻이다. 튜플, 리스트와 비슷하게 여러 값들을 저장하지만, 마치 사전처럼 키와 값으로 저장할 수 있다.
위 사진처럼 name에 해당하는 값 pdy, age에 해당하는 값 19, 이런식으로 값에 이름(key)를 붙여서 값들을 저장할 수 있다. 물론 저 이름을 이용해 이름에 해당하는 값을 불러올 수도 있다. 또한 리스트, 튜플과 마찬가지로 다른 자료형들도 섞어서 사용할 수 있다. 단 키에는 리스트, 튜플의 사용이 불가하다.
딕셔너리를 만드는 방법은 (변수이름) = {<키> : <값>, <키2> : <값>} 이렇게 해주는 것이다. 키와 값 사이는 :로 구분해준다.
참고로 위 사진처럼 키 이름이 겹치는 경우에는 중복해서 저장하지 않고 해당 키에 들어간 값 중 나중에 입력한 값이 들어가게 된다. 사진을 보면 age 키의 값을 처음에는 19를 넣었고, 두번째 age에는 20을 넣었는데, 저장된 값을보면 20이 들어가 있다.
빈 딕셔너리는 위 사진처럼 {}만 써주거나, dict()를 입력해준다면 값이 빈 딕셔너리가 생성된다.
위에 적은것처럼 (변수이름) = {<키> : <값>, <키2> : <값>} 이렇게 딕셔너리를 생성하는 방법도 있지만 dict()로 생성할 수 있다.
딕셔너리를 dict로 생성하는 방법은 4가지가 있는데, 1번 방법은 =을 사용해서 딕셔너리를 생성하는 방법이다. 1번 방법 같은 경우 키에 " "이나 ' '을 쓰지 않아야한다. 딕셔너리가 생성되면 자동으로 문자열로 바뀌기 때문이다.
2번방법은 zip함수를 이용한 방법인데, 2번 방법을 사용한다면 키를 한번에 생성하고 값도 한번에 적을 수 있다.
3번 방법은 튜플을 사용한 방법인데, 그냥 딕션너리를 생성하는 것과 비슷하게 1번째는 키, 2번째는 값을 적어주면 된다.
4번 방법은 dict 안에서 {}로 생성하는 건데, 중괄호를 사용한다는 점만 빼면, 일반적인 딕셔너리 생성법과 똑같다.
-딕셔너리 값 할당
먼저 딕셔너리 값을 불러오는 방법은 리스트나 튜플이랑 어찌보면 비슷한 방법인데, 변수명[키]를 써준다면 키에 해당하는 값을 불러와준다.
특정 키의 값을 할당하는 방법 역시 리스트, 튜플과 비슷하다. 먼저 변수명[키]로 값을 불러오고 =연산기호 뒤에 넣을 값을 입력하면된다.
당연하지만 없는 키를 불러오려 시도하면 KeyError 오류가 뜬다.
존재하지 않는 키로 값을 할당하려 하면, 딕셔너리에 그 키를 추가하고 값을 할당해 준다.
-in
시퀀스 객체를 공부할 때 in 함수에 대해 배웠었다. in은 해당 시퀀스 객체에 특정 값이 있으면 True 없으면 False를 반환하는 함수인데, 이 함수를 딕셔너리에도 사용할 수 있다.
위 사진처럼 <키> in 딕셔너리 변수명 이렇게 사용하면 되는데, a에는 'name' 키가 있었기에 2행 명령이 True가 출력됐고, 3행 명령의 경우 존재하는 키가 아니기 때문에 False가 출력된다.
not in 또한 사용 가능하다.
-len
len 또한 사용이 가능하다. 딕셔너리에서 len을 사용한다면 키의 개수를 구할 수 있다.
사용방법은 다른 시퀀스 객체와 같다.
a : 키 값 문자열로 해줬고, 키에 해당하는 값도 잘 넣어줬다. O
b : =이 아니라 :로 해줘야한다. X
c : 빈 딕셔너리를 dict()로 잘 만들어 줬다. O
d : dict()로 딕셔너리를 잘 만들어 줬다. O
e : dict() list 형식으로 잘 만들어 줬다. O
딕셔너리에서 특정 키의 값을 불러오는 방법은 변수명[키]로 해주면 된다. 따라서 키 x[10]을 해준 e가 맞다.
1행은 딕셔너리를 만들어주는 코드. 2행은 orange라는 키가 존재하지 않으므로 orange 키를 추가하고 2000 값을 넣어준다. 3행은 apple, orange 키에 해당하는 값을 출력하는 명령이다. 따라서 apple과 orange에 해당하는 값이 1500, 2000이 출력된다.
딕셔너리에 쓰이는 len 함수는 해당 딕셔너리의 키의 개수를 구해준다. 따라서 키의 개수인 6이 출력될 것이다.
체력, 이동 속도를 출력되게 해야한다. 이 값들은 딕셔너리에 저장되어 있는데, 각각의 키는 'health', 'movement_speed'다. 그러면 딕셔너리 이름인 camille와 키값으로 값을 출력할 수 있다.
camille = {
'health': 575.6,
'health_regen': 1.7,
'mana': 338.8,
'mana_regen': 1.63,
'melee': 125,
'attack_damage': 60,
'attack_speed': 0.625,
'armor': 26,
'magic_resistance': 32.1,
'movement_speed': 340
}
print(camille['health'])
print(camille['movement_speed'])
입력된 첫번째 줄은 키, 두번째 줄은 값에 해당된다. 키는 키끼리, 값은 값끼리 한번에 저장되므로 dict()와 zip()로 딕셔너리를 생성하면 될 것 같다. 또한 값은 실수로 저장해야하므로 map을 이용해서 float로 형변환을 해줘야한다.
dic_key = input().split()
dic_val = list(map(float,input().split()))
an = dict(zip(dic_key,dic_val))
print(an)
-조건문-
프로그래밍에서 조건문이란 특정 조건을 만족할 때 특정 코드를 실행해주는 분기점 역할을한다.
파이썬에서는 if로 조건문을 만들 수 있다.
if <조건식> :
<조건에 만족할시 실행할 코드>
위 형태로 조건문을 사용할 수 있다.
조건식 부분에는 전에 사용했던 부등호, ==, !=, 시퀀스 객체의 경우 in, not in 등 참과 거짓을 구분하는 모든 식을 사용할 수 있다. 식 뒤에는 :를 붙여줘야한다. 중요한 것은 초기에 들여쓰기 파트에서 배웠던 것처럼, <조건에 만족할시 실행할 코드>는 반드시 들여쓰기를 해줘야 한다. 만약 들여쓰기를 안해준다면 오류가 뜬다. 또한 한 if 내의 코드들은 들여쓰기 공백 칸 수가 모두 동일해야하고 들여쓰기를 안해준다면 그 코드는 if 조건문 밖의 코드로 해석한다.
위 사진은 VSCODE를 통해 조건문을 구현해본 모습이다. 1행에서 a 변수에 1이 들어갔고, 2행에서 a == 1이라는 조건식이 있고, a == 1이 True라면 3행의 print('a==1')이 실행된다.
결과는 당연히 a==1이 출력됐다.
위 사진도 역시 조건문을 코딩해본 사진이다. 이번에는 이 사진 위의 사진과 달리 4행에 print('Hello')가 추가됐고, 1행의 변수 a에 2가 들어갔다. 실행해본다면 당연히 a는 1이 아니므로 3행의 줄은 건너띄고 4행을 실행하게 된다. 따라서 결과는 Hello.
조건식이 참일 시 실행할 코드를 적어주지 않는다면 위 사진처럼 오류가 뜬다.
조건식이 참일 시 실행할 코드를 적지 않는다면 위 사진처럼 pass를 적어준다면 이 사진 위의 사진처럼 오류 없이 실행이 가능하다.
-중첩 if
조건문을 만들어주는 if는 중첩해서 사용이 가능하다.
1,2행에서 a,b에 각각 2와 3을 넣어줬고, 3행에서 a == 2인지 조건 만족 여부를 확인한다. 만약 만족할시 4행의 print()가 실행되고 그 다음에 b == 3인지 조건 만족 여부를 확인하는 2번째 if문이 나온다. 이 if문 역시 일반 if문과 똑같이 조건에 만족한다면 if 안의 코드를 실행하는 역할을 한다. 다만 중요한점은 중첩 if를 써줬다면 중첩 if 조건이 맞을시 실행하는 코드는 한번 더 들여쓰기를 해줘야한다. 즉 2번 들여쓰기를 하는 것이다.
-input() & if
조건문 역시 사용자가 입력한 값을 토대로 조건분기를 나눌 수 있다.
위는 간단하게 금고 프로그램을 조건문 if를 이용해 구현해본 사진이다. 1,2행은 ###금고 프로그램###, 비밀번호를 입력하시오.를 출력하고 3행에서 input 함수로 사용자가 입력한 값을 str 형태로 받아온다. 그리고 5행에서 입력 값이 dypar인지 확인을하고 맞다면 6행 잠금해제에 성공했습니다!를 출력해준다.
a : 파이썬은 조건식을 괄호 없이 쓴다. X
b : 조건식 뒤에 ':'이 없다. X
c : 조건문 형식이 맞는것 같다. O
d : if문 안에 해당하는 코드가 없다.(들여쓰기가 안돼 있거나, pass를 안써줬다.) X
e : =은 값을 할당해주는 기호다. ==을 써줘야한다. X
c : 조건식 뒤에 ':'를 안써줬다.
j : i의 if문 조건식이 참일시 실행되는 코드가 없다.(j행 들여쓰기를 한번 더 해주거나, pass를 써줘야한다.)
더 볼 필요없이 a가 잘못됐다. =은 값을 할당해주는 기호이므로 조건식에 쓰기 적합하지 않으므로 대신 ==을 써줘야한다.
주어진 변수는 5가 들어있는 x가 있고, x의 값이 10이 아닐 때 ok가 출력되게 만들어야하므로 != 연산 기호를 이용해 조건식을 만들면 된다.
x = 5
if x != 10 :
print('ok')
가격과 쿠폰 이름이 입력되는데, 쿠폰 Cash3000은 3000원을 할인해 주고, 쿠폰 Cash5000은 5000원을 할인해준다. 이를 감안해서 할인이 적용된 각격을 출력하면 된다.
문제를 딱 보니 2가지 방법이 보였다. 첫째는 앞서 배운 if문을 이용해 Cash3000, Cash5000을 각각 조건식을 새워 할인을 처리해주는 방법, 둘째는 슬라이스 기능을 이용해 Cash부분만 자르고 나머지 부분을 int형으로 바꾼 후 입력된 가격에서 빼주는 것이다.
첫번째 방법.
price = int(input())
cupon = input()
if cupon == 'Cash3000':
price -= 3000
if cupon == 'Cash5000':
price -= 5000
print(price)
두번째 방법.
print(int(input())-int(input()[4:]))
01-23 (Unit 14.1 ~ Unit 17.6)
-else-
else는 if문과 같이 조건문에 사용된다. if문은 조건식에 맞을 시 코드를 실행하는 역할이지만, else는 if문의 조건이 맞지 않을 시 코드를 실행하는 기능을한다. 따라서 if문 없이 단독으로는 쓰일 수 없다.
else는 if의 조건이 맞지 않을 시 실행하기 때문에 조건식은 필요 없지만 else 뒤에 ':'은 붙여줘야한다. 또한 조건이 맞지 않을 시 실행할 코드는 반드시 들여쓰기를 해줘야한다.
-사용방법
if <조건식> :
<조건에 맞을 시 실행할 코드>
else :
<조건에 맞지 않을 시 실행할 코드>
위는 if문을 배울때 만들었던 금고프로그램에 else 문을 추가한 것이다.
1번째 실행했을 때는 비밀번호인 'dypar'을 잘 입력해서 "잠금해제에 성공했습니다!"라는 문구가 출력됐고, 2번째 실행했을 때는 비밀번호 입력란에 1을 입력했기 때문에 else문이 실행되서 "잠금해제에 실패했습니다!"라는 문구가 출력됐다.
a = 1
if a == 1:
b = a
else
b = 0
위 사진은 위 코드를 줄여서 쓴 모습이다. 사진처럼 if, else문을 줄여서 변수에 값을 할당할 수 있다.
-True, False, None, 0, 1 In if-
if문에서 조건식을 True, False, None, 0, 1로 써줄 수 있다.
True, 1 : 참을 뜻하며, if문의 코드를 실행한다.
False, None, 0 : 거짓을 뜻하면 if문의 코드를 실행하지 않는다.
-논리 연산자 조건식-
앞서 배운 and, or을 이용해 조건식을 여러개 작성해줄 수 있다.
위 사진처럼 2가지 이상의 조건식을 and, or를 사용해 작성할 수 있다.
또한 위 사진처럼 not을 사용하여 조건의 참, 거짓을 바꿔줄 수 있다.
a : if의 코드는 조건식이 만족할 때 실행된다. X
b : else 코드는 조건문이 거짓일 때 실행된다. X
c : else는 단독으로 사용할 수 없다. O
d : else에서 실행되는 코드는 들여쓰기를 해줘야한다. X
e : if는 else 없이 사용이 가능하다. X
b : 들여쓰기를 안해줬다.
d : ':'를 안넣어 줬다.
값이 아무것도 없다면 False지만 앞에 not이 붙었으므로 True로 변한다. 따라서 print(True)가 실행된다.
답 : True
a : & 대신 &&을 써줘야한다.
c : not으로 2개 이상의 조건 식을 이어줄 수 없다.
d : |가 아니라 ||를 써줘야한다.
x 변수에는 5가 들어가고, 3행에서 x % 2가 0인지 확인하는 조건식이 있다. %는 나머지를 구해주는 연산 기호인데, 5를 2로 나눴을 때 나머지가 1이 나오므로 else문 코드가 실행된다. 따라서 '홀수'가 출력된다.
필기 시험(written_test) 점수가 80점 이상이이고 코딩 시험(coding_test)을 통과한다면 합격이 출력된다. 그러면 필기시험 >= 80 and 코딩 시험 == True, 이 2식을 조건으로 작성하면 될 것 같다.
written_test = 75
coding_test = True
if written_test >= 80 && coding_test == True:
print('합격')
else:
print('불합격')
4 과목의 평균 점수가 80 이상이라면 합격을 출력하는게 목적이다. 또한 점수는 0~100까지만 입력 받을 수 있게 해야하고, 만약 범위를 벗어난다면 '잘못된 점수'만 출력해야한다.
먼저 범위를 벗어났는지 판단하는 식은 if문으로 0 <= 점수 <= 100 이런식의 조건식을 작성해주면 된다. 그다음 범위를 벗어난다면 합격, 불합격을 출력하면 안되므로 범위 판단 if문 안에 평균이 80점이 넘는지 여부를 판단하는 조건식을 작성해주면 될 것 같다. 평균은 (4과목 점수 + )/4로 구할 수 있다.
kor, eng, math, scien = map(int,input().split())
if 100 >= kor >= 0 && 100 >= eng >= 0 && 100 >= math >= 0 && 100 >= scien >= 0:
if ((kor+eng+math+scien)/4) >= 80:
print('합격')
else:
print('불합격')
else:
print('잘못된 점수')
-elif-
elif는 else if를 합친 것이다. elif는 if의 조건이 아니라면 elif의 조건식을 확인하고 참이면 elif의 코드를 실행한다. 따라서 elif 역시 단독으로 쓰일 수 없고, if와 같이 쓰여야한다. 당연히 ':'도 붙여줘야하고 elif의 코드는 들여쓰기를 해야한다.
if 조건 만족 확인 -> 조건에 만족하지 못할 경우 elif 조건 만족 확인 -> 조건에 만족하지 못할 경우 else 코드 실행
위 사진은 if와 else로 만들어진 금고 프로그램에 elif를 추가한 것이다.
앞서 말했듯 원래의 실행 과정은 비밀번호를 입력받고 입력받은 비밀번호가 'dypar이라면 잠금해제, 아니라면 잠금해제 실패인데, 여기에 isAdmin == True인지 확인하는 elif문을 넣었다.
만약 password가 다르다면 isAdmin == True를 확인하는데, 만약 만족한다면 관리자 권한으로 잠금해제를 했습니다!를 출력한다. 만족하지 못한다면 잠금해제 실패 문구를 출력한다.
위 사진은 코딩 도장의 예제
button = int(input())
if button == 1:
print('콜라')
elif button == 2:
print('사이다')
elif button == 3:
print('환타')
else:
print('제공하지 않는 메뉴')
를 문자열 조건으로 변형시켜 작성해본 음료수 자판기 예제다. 입력값이 콜라, 사이다일 경우 해당 음료를 제공하고, 만약 다른 문자열일 경우 "해당 음료는 존재하지 않습니다."라는 문구를 출력한다.
d : elif는 if 조건식에 만족하지 못할 경우 실행하므로 단독으로 사용 불가하다. X
e : elif는 else 없이 사용할 수 있다. X
x에는 0이 들어가 있다. 조건식을 보면 if을 만족하지 못하고, 1번째 elif, 2번째 elif 등 모든 elif의 조건식을 만족하지 못한다. 따라서 else가 실행되어 E가 출력된다.
11~20, 21~30 사이면 해당 문구를 출력하고, 그 이외라면 아무것도 해당하지 않음을 출력해야한다.
11~20은 if 조건식으로, 21~30은 elif 조건식으로, 그 이외는 else로 해주면 될 것 같다.
x = int(input())
if 20>=x>=11:
print('11~20')
elif 30>=x>=21:
print('21~30')
else:
print('아무것도 해당하지 않음')
각 나이에 맞게 요금을 차감한 뒤 잔액을 출력하면 된다. 교통카드에는 현재 9천원이 들어있다.
if, elif,else를 각각 어린이, 청소년, 어른 조건으로 조건식을 세우고 해당 금액만큼 balance에서 차감해주면 될 것 같다.
age = int(input())
balance = 9000
if 12>=age:
balance -= 650
elif 18>=age:
balance -= 1050
else:
balance -= 1250
print(balance)
첫째 if에 12>=age>=7 이렇게 써주지 않은 이유는 문제에 나이는 7 이상으로 입력됐다 적혀있었기 때문이고, elif에 18>=age>=13으로 써주지 않은 이유는 이미 첫째 if문을 통해 age가 12보다 크다는 것을 판별했기 때문이다.
-for문-
for는 반복문에 쓰이는 함수로, 횟수를 정해서 코드를 원하는 만큼 실행할 수 있도록 한다.
앞서 배운 range와 in을 이용해서 for문을 간단하게 작성할 수 있는데 방법은 아래와 같다.
for <변수> in range(<반복 횟수>) :
<반복할 코드>
in은 시퀀스 객체안의 특정 값이 있는지 확인하는 용도로 쓰였었지만 for문에서 in은 range로 만들어진 리스트를 하나 하나 꺼내서 i에 넣어주는 역할을 한다.
동작원리는 range 함수가 입력한 값만큼 연속된 숫자를 생성해주면, 생성된 값을 in이 하나하나 i에 넣어준다. 그리고 더이상 남은 값이 없을 때 반복을 종료한다.
if문과 똑같이 끝에 ':'를 입력해야하고 반복할 코드는 들여쓰기를 해줘야한다.
위는 'Hello'를 10번 출력해주는 코드다. 만약 for문을 쓰지 않는다면 print('Hello')를 10번 입력해줘야지 위 사진의 결과가 나오는데, for문을 사용하니 단 2줄로도 위의 결과를 도출할 수 있다.
i를 출력해보면 range로 생성된 값이 하나하나 들어가 있는 것을 알 수 있다.
또한 range는 앞서서 썻듯이 끝값, 증가폭을 사용해서 사용할 수 있다.
만약 i의 값을 for문 안에서 변경한다면 어떻게 될까?
직접 변경해 보았지만 1회씩 반복이 끝날 때 마다 i를 증가시켜주는게 아닌, i에 range로 생성된 값을 할당해 주는 것이므로 반복에 영향이 없다.
-시퀀스 객체 사용
range 뿐 아니라 for문에 list, 튜플, 문자열 등 시퀀스 객체를 넣어서 반복할 수 있다.
위 사진처럼 in 다음에 range 대신 시퀀스 자료형을 써준다면, 매 반복마다 시퀀스 객체의 값이 i에 들어오면서 반복된다.
예시로 리스트를 사용했지만 튜플, 문자열 등 시퀀스 객체라면 위 예시처럼 코드를 짠다면 반복 가능하다.
a : O
b : 11번 반복될 것 같다. X
c : 증가폭에 -옵션을 줘야지 작동한다. X
d : O
e : 1~10이면 9번 반복이다. X
a : 증가폭을 안써줬고 10까지 출력이 안된다. X
b : 증가폭이 양수고 10까지 출력이 안된다. X
c : O
d : O
e : 20까지 출력이 안된다.
a : int 형으로 형 변환을 시켜줘야지 c에서 반복횟수로 사용할 수 있다.
c : ':'를 안써줬고 a를 고치지 않는다면 range안의 count를 int형으로 형 변환을 시켜줘야한다.
1행에서 'Python' 문자열을 뒤집은 후 문자열 길이만큼 반복을 하고 2행에서 i에 들어온 값과 .을 출력한다.
따라서 답은 d
각 요소에 10을 곱한 값을 출력하면 되므로 for i in x로 x의 요소들을 i에 하나하나 갖고와 *10을 해서 출력하면 될 것 같다. 또한 한줄로 출력해야하므로 print에 end=' ' 옵션을 주면 된다.
x = [49, -17, 25, 102, 8, 62, 21]
for i in x:
print(i*10, end=' ')
입력된 값에 해당하는 구구단을 만드는게 목적이다. 출력 형식은 숫자 * 숫자 = 숫자 형식이다.
1행에서 정수를 입력 받고, 2행에 for문으로 1~9까지 반복되게 하는 range문을 작성한 후 3행에서 출력 형식에 맞게 print를 해주면 된다.
val = int(input())
for i in range(1,10):
print(val,"*",i,"=",val*i)
-while문-
while은 for와 마찬가지로 원하는 코드를 반복 실행시켜주는 반복문이다. for와 달리 while은 조건식에 만족한다면 계속해서 원하는 코드를 반복 시켜준다.
과정 : 조건 만족 판별 -> 만족 시 코드 실행(불만족 시 실행 X) -> 다시 조건 만족 판별 -> 만족 시 코드 실행(불만족 시 실행 X).....
while <조건식>:
<반복할 코드>
위의 형태로 while을 사용할 수 있다. 당연히 조건식 끝에 ':'를 써줘야 하고, 반복할 코드는 들여쓰기를 해줘야한다.
조건식은 원하는 방식으로 작성할 수 있지만, 보통 반복 횟수를 체크할 변수 하나, <변수> < <반복 횟수+1> 이런식으로 많이 사용한다. 또한 while 문 안에 반복 횟수를 체크하는 변수를 증가 시켜줘야한다. 만약 증가를 시켜주지 않는다면 영원히 while 코드가 실행되는 무한루프에 빠지게 될 것이다.
위 사진에서는 a에 0을 넣고 5보다 작은지 체크한 후 print(a)를 실행하고, 반복 코드 마지막에 a+=1로 a의 값을 증가 시켜준다. 위에서는 증가시키는 방법으로 반복문을 탈출했지만, 조건을 바꾼다면 감소를 시켜서 반복문을 탈출 시킬 수 있다.
-True, 1
조건식에 True나 참을 나타내는 수인 1은 써주면 코드가 계속 반복되는 무한루프 현상이 일어난다. True, 1 뿐만 아니라 참을 나타내는 값을 줘도 무한루프 현상이 발생한다.
위 사진은 조건식을 True로 적어서 무한루프에 빠진 모습이다. 이럴경우 ctrl+c를 누른다면 빠져나올 수 있다.
-random-
난수란 규칙 없이 무작위로 나열되는 숫자다.
파이썬에서는 random이라는 모듈을 통해 난수를 생성할 수 있는데, 이 모듈은 import로 불러올 수 있다. 참고로 모듈 내 함수를 사용하려면 <모듈명>.<함수명>으로 호출할 수 있다.
사용 : import <모듈명>
-random()
random 함수는 모듈 random의 함수로 무작위 난수를 생성해주는 함수다.
위 사진과 같이 random.random()을 3번 실행시켰는데, 실행시킬 때 마다 각기 다른 값을 생성해주는 것을 알 수 있다.
-randint()
randint는 난수 생성 범위를 지정해서 그 범위안의 난수를 생성해주는 함수다.
방법은 randint(<범위 시작값>,<범위 끝값>)로 사용하면된다.
위 사진은 1~6으로 범위를 지정해서 난수를 생성한 모습이다. 보면 범위 내로 난수가 생성되서 나온다.
위 사진은 while문에 randint를 응용해본 모습이다. a가 1이 아닐시 반복하도록 조건식을 짯고 반복 코드에서 a의 값을 randint(1,6)으로 범위를 지정해서 난수를 생성해 줬다.
-choice()
choice는 시퀀스 객체에서 요소를 무작위로 선택해주는 함수다.
사용은 위 사진처럼 choice(<시퀀스 자료형 변수명>)으로 사용하면 된다.
위 사진은 콜라,사이다,환타,레모네이드,에너지드링크가 들어있는 시퀀스 객체 a를 choice()로 요소를 랜덤으로 골라주는 모습이다.
b : False일 경우 반복을 끝낸다. X
c : 반복 횟수가 정해지지 않아도 사용 가능하다. X
i의 초기값이 10이고 while의 조건식은 i < 19다. i는 2씩 증가하므로 10, 12, 14, 16, 18이 출력될 것이다.
c : 조건이 잘못됐다. 20보다 i가 클 경우 반복인데 i의 초기값이 0이므로 반복 코드 자체에 진입을 못한다. 부등호 방향을 바꿔주면 해결된다.
무한루프 현상은 조건식에 참인 값이 들어갈 경우 발생한다.
답 : b, e
2 5, 4 4, 8 3, 16 2, 32 1이 각줄에 출력되게 만드는 것이 목적이다. i,j의 초기값은 2와 5로 주어진다.
조건식은 i < 33 or j > 0, 2번과 3번에는 i *= 2, j -=1이 들어가면 될 것 같다.
교통 카드 잔액이 입력되고 그 잔액이 부족하지 않을 때까지 요금인 1350을 빼서 과정마다 잔액을 출력하라는 것이 문제다. 1행에서 잔액을 int형으로 입력받고, 2행에서 while문과 조건 작성, 3행에서 요금 -, 4행에서 print를 해주면 될 것 같다.
hav = int(input())
while hav >= 1350:
hav-=1350
print(hav)
01-24 (Unit 18.1~ Unit 19.6)
-break-
break는 반복을 완전히 중단하는 기능을한다.
사용 방법은 특별한거 없이 그저 break를 써준다면 반복문에서 break가 실행되는 순간 반복이 중단된다.
위 코드는 무한루프, 즉 while 조건식에 1을 넣어 무한 반복이되도록 설정한 코드다. 원래대로라면 무한반복이 되지만 4행과 5행을 보면 i의 값을 1씩 증가시키고, i가 10이된 순간 break를 실행한다. 결과를보면 10이 되기전에 반복문을 탈출하게 된다.
break는 while 뿐만아니라 for문등 반복문에서 사용가능하다.
위 코드는 극단적인 예로 for문을 1000000번 반복하도록 만들었다. 하지만 3행에 i가 10일 경우 break를 실행하는 조건문을 만드니, 1000000번 실행하지 않고 딱 10번만 반복을하게 됐다.
-continue-
continue는 break와 비슷하게 반복문을 제어하는 역할이지만 break와 다르게 완전히 중단하는게 아니고 continue가 실행되는 순간 continue 아래 코드들을 실행하지 않고 반복문 맨 위로 올라가게 해서 다시 실행한다.
위 코드는 i가 홀수일때만 print해주는 코드다. i < 11이라는 조건식을 새워서 10번 반복되게 하고, if i % 2 == 0: 이 조건식은 i가 짝수인지 확인하는 역할이다. i가 짝수라면 2로 나눴을 때 나머지가 없으므로 continue로 반복문 시작지점으로 올리는 것이다. 따라서 실행결과는 i가 홀수인 경우만 출력되므로, 홀수만 출력된다.
for문도 마찬가지로 continue 사용이 가능하다.
위에서 배운 break와 continue, 그리고 입력받는 input함수를 이용해서 사용자가 원하는 만큼 반복문을 실행하도록 할 수 있다.
위 코드는 사용자에게 입력을 받고 그 횟수만큼 반복해주는 반복문이다. 조건식은 True로 두고 무한루프로 설정한 다음
입력값을 반복할 때마다 1씩 빼주면서 0보다 같거나 잡아지면 break 하는 식으로 구현했다.
위 코드는 마찬가지로 입력을 받고 그 숫자까지 짝수에 해당하는 수를 출력한다. while로도 가능하지만 for문으로 구현했고 a % 2 != 0일시 홀수이므로 continue를 써주었다.
a : break는 조건문이 아닌 반복문을 끝낸다. X
c : for도 반복문이므로 사용 가능하다. X
e : continue는 루프를 중단하지 않는다. X
3의 배수는 3으로 나눴을 때 나머지가 0이므로 if i % 3 == 0 : continue로 짜주면 된다.
30부터 10을 출력하고 조건식보다 print 함수가 위에 있으므로 i가 딱 10이 됐을 때 break해주면 되겠다.
i = 0
while True:
if (i % 10) != 3:
i+=1
continue
if i >= 74:
break
print(i, end=' ')
i += 1
if i == 10 : break
숫자가 3으로 끝나는 것만 출력해야하므로 10으로 나눴을 때 나머지가 3이 나오는 것만 출력하면 될 것 같다.
조건식은 두개를 써줘서 하나는 3으로 끝나는지 여부 확인용, 하나는 반복문 탈출용으로 하면된다.
i = 0
while True:
if (i % 3) != 3:
i += 1
continue
if i >= 74:
break
print(i, end=' ')
i += 1
첫번째 숫자와 두번째 숫자 사이중 3으로 끝나지 않는 숫자가 출력되게 하는 것이 목적이다.
먼저 i에 첫번째 정수를 넣어줬으니, i > stop으로 반복문을 탈출시켜주면 될 것 같다.
start, stop = map(int, input().split())
i = start
while True:
if (i % 10) == 3:
i+=1
continue
if i > stop:
break
print(i, end=' ')
i += 1
-중첩루프-
반복문안에 반복문이 들어가는 것을 중첩 루프라고 한다.
첫번째 반복문안에 반복문이 하나 더 들어가게 되면 두번째 반복문은 예를 들어 9번 반복해게 코딩해두면, 첫번째 반복문이 1번 돌때마다 9번 반복되는 것이다.
위는 for문 두개를 이용해서 구구단을 출력해보는 코드다. 맨 처음 for문은 i in range(1,10)으로 설정해 1~9의 값이 i에 들어가게 하고 2번째 for문은 i에 곱해줄 값인 1~9를 역시 range를 통해 j에 넣어준다. 첫번째 for문이 한번 반복될 때 두번째 for문은 9번 반복하는데, 이를 이용해서 i * j로 구구단을 출력해주는 것이다.
위 사진 대로 5X5 형태로 '*'를 출력하게 하는 것이 목적이다. 물론 print로 노가다한다면 출력이 가능하겠지만, 써야할 코드도 많아지고 무엇보다 중첩 반복문을 공부하고 있으므로 중첩 반복문으로 풀어보겠다.
일단 한줄에 5개의 '*'이 출력되야한다. 또한 이 별 사이사이에 공백이 없다는 점도 유의해야한다. 줄바꿈이 한번 일어 날때마다 '*'이 5번 출력되야하는데 초점을 두면 될 것같다. 위의 구구단과 비슷하게, 줄바꿈을 수행하는 기능을 첫번째 반복문으로 만들고, 2번째 반복문은 별을 1개 출력하는 코드를 5번 반복하게 만든다면, 첫번째 반복문이 1번 줄바꿈을 할때 *이 5번 출력되서 성공적인 결과를 얻 수 있을 것 같다.
먼저 줄바꿈은 5번 수행되야하므로 첫번째 for문이 5번 반복하게 만들었고, 그다음에 별을 5개 출력해야하므로 두번째 for문은 5번 반복하게 한다. 출력은 공백없이 되야하므로 end="" 옵션도 넣어준다. 마지막으로 줄바꿈을 위해 print()도 넣어주는데, 중요한점은 두번째 for문 밖에다가 줄바꿈을 넣어줘야한다. 왜냐하면 두번째 for문 안에 넣는다면 별이 한줄로 찍히는게 아니라
*
*
*
*
*
이런식으로 찍힐 수 있기 때문이다.
위 사진처럼 range 값을 바꿔주면 별 모양이 다르게 출력되는 것을 볼 수 있다.
2번째 목표는 위 사진처럼 계단식으로 별을 출력하는 것이다. 앞에서 별을 중첩 루프로 찍은 것처럼 위 결과도 중첩 루프를 사용한다면 풀 수 있을 것 같다.
일단 위의 별 찍기에서는 첫번째 for문을 한줄 바꿔주는 역할로 쓰였다. 이번에는 계단식 출력이므로 한 줄에 몇개의 별을 찍는지 판별해주는 역할로 쓸 것이다. 두번째 for문은 위와 똑같이 별을 찍어주는 용도로 쓸 것이다. 다만 코드를 더 추가해서 각줄에 맞는 개수의 별을 찍어줘야한다.
첫번째 for문은 5행에 걸쳐 별을 출력할 것이므로 5번 반복하게 설정한다. 두번째 for문도 어쨌든 최대로 찍히는 별의 개수가 5개이므로 5번 반복하게 설정해둔다.
두번째 for문에서 반복할 코드는 달라진다. 그냥 별을 print했다가는 5개씩 5줄로 출력하게 되므로 조건을 걸어서 줄당 출력되는 별의 개수를 제어해줘야한다. 위에서 첫번째 for문에 쓰이는 i를 몇개의 별을 찍는지 판별해주는 역할로 쓴다했는데, 이 i를 이용해서 별의 개수를 제어할 것이다.
i가 1일 때 1행이므로 별이 한개 출력되야한다. 그러므로 if j <= i : 로 조건을 걸어준다면 각행에 출력될 별의 개수보다 j가 작다면 *을 찍어주므로 위와 같이 결과가 나올 것이다.
디버깅표
i = 0, j = 0(* 출력),j = 1(i보다 크므로 skip),j = 2(i보다 크므로 skip) ,j = 3(i보다 크므로 skip) ,j = 4(i보다 크므로 skip)
i = 1, j = 0(* 출력),j = 1(* 출력),j = 2(i보다 크므로 skip) ,j = 3(i보다 크므로 skip) ,j = 4(i보다 크므로 skip)
i = 2, j = 0(* 출력),j = 1(* 출력),j = 2((* 출력) ,j = 3(i보다 크므로 skip) ,j = 4(i보다 크므로 skip)
i = 3 j = 0(* 출력),j = 1(* 출력),j = 2((* 출력) ,j = 3(* 출력) ,j = 4(i보다 크므로 skip)
i = 4 j = 0(* 출력),j = 1(* 출력),j = 2((* 출력) ,j = 3(* 출력) ,j = 4(* 출력)
이번에는 위 사진처럼 별이 대각선으로 출력되도록 코딩을할 것이다.
첫번째 for문이 행과, 별이 출력될 위치를 컨트롤하면 될 것같고, 두번째 for문이 별출력, 공백 출력을 담당하면 될 것 같다.
먼저 5행에 걸쳐 출력되므로 첫번째 for문은 5번 반복하도록, 공백과 별을 합쳐 5글자를 출력해야하므로 두번째 for문도 5번 반복. 별이 출력될 위치는 i가 담당하는데(예를들어 i가 0일 경우 0번째로 출력, 1이면 1번째, 2면 2번째) 이를 이용해서 j가 i일 경우 *을 출력한다면 *이 딱 하나만 찍힐 뿐더러 원하는 위치에 찍힐 것이다. 그리고 j가 i와 값이 같지 않을 경우는 else를 이용해 공백을 출력한다면 결과가 잘 나온다.
디버깅표
i = 0, j = 0(* 출력),j = 1(공백출력),j = 2(공백출력) ,j = 3(공백출력) ,j = 4(공백출력)
i = 1, j = 0(공백출력),j = 1(* 출력),j = 2(공백출력) ,j = 3(공백출력) ,j = 4(공백출력)
i = 2, j = 0(공백출력),j = 1(공백출력),j = 2((* 출력) ,j = 3(공백출력) ,j = 4(공백출력)
i = 3 j = 0(공백출력),j = 1(공백출력),j = 2((공백출력) ,j = 3(* 출력) ,j = 4(공백출력)
i = 4 j = 0(공백출력),j = 1(공백출력),j = 2(공백출력) ,j = 3(공백출력) ,j = 4(* 출력)
c : i는 세로 방향을 처리한다.
e : print는 기본적으로 줄바꿈을 해준다.
계단식으로 별이 출려되야 하므로 i가 j보다 크거나 같을 경우 별을 출력해주면 된다.
j <= i
실행 결과가 위처럼 나오려면 일단 별출력과 공백 출력을 2번째 for문에서 if문으로 분기해서 처리하면 될 것 같다.
if문의 조건식은 j가 i보다 작다면 공백을 출력하고 아니라면 *을 출력하면 될 것 같다.
for i in range(5):
for j in range(5):
if j < i:
print(' ', end='')
else:
print('*', end='')
print()
입력으로 높이를 받고 높이만큼 산 모양으로 별을 출력하는 것이 목적이다.
height = int(input())
for i in range(height):
for j in reversed(range(height)):
if i < j:
print(" ",end="")
else:
print("*",end="")
for j in range(height):
if i > j:
print("*",end="")
print()
이번 문제는 많이 어려워서 피라미드 별찍기 알고리즘, 코딩 도장 해설들을 참고해서 풀었다.
1행 : input을 받아온다.
2행 : input 받은 만큼 반복하게한다.
3행 : range로 만들어진 값들을 reversed해서 높은수부터 j에 들어가게 한다.
4행~7행 : i가 j보다 작다면 공백 출력, 아니라면 *을 출력한다.
8행 : 높이만큼 반복하는 for문을 하나 더 만든다.
9행~10행 : i가 j보다 크다면 *을 출력한다.
11행 : 줄 바꿈
이 코드는 2번째 for문에서 reversed를 사용해서 큰 값부터 j에 담기게 한다. height에 3을 입력했다 가정하겠다.
맨처음에는 두번째 for문 j에 2가 들어간다. i는 0 j는 2가 들어가므로 i < 2 조건을 적어준다면, 2개의 공백이 출력되고 별이 하나 출력된다. 3번째 for문에서는 i가 0, j도 0으로 시작하므로 아무동작도 하지 않는다.
두번째 반복에는 i = 1 두번째 j는 2가 들어가는데 그러면 공백이 한개가 출력되고 별이 2개 출력된다. 그리고 세번째 for문에서는 별이 한개 출력된다.
이런식으로 반복해서 산 모양 출력이 이뤄진다.
'Old (2021.01 ~ 2021.12) > Programming' 카테고리의 다른 글
파이썬 코딩도장 Unit 27 ~ 37 (0) | 2021.01.31 |
---|---|
파이썬 코딩도장 Unit 23 ~ 26 (0) | 2021.01.27 |
파이썬 코딩도장 Unit 20 ~ 22 (0) | 2021.01.26 |
파이썬 코딩도장 Unit 8 ~ 11 (0) | 2021.01.21 |
파이썬 코딩도장 Unit 1 ~ 7 (0) | 2021.01.19 |