파이썬 강좌 – 반복문 코딩하기

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 – 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 – 왜 파이썬인가?
    4. 파이썬 설치 – Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 – 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 – 소통하기
    2. 변수와 대입 – 기억하기
    3. 연산자 – 계산하기
    4. 조건문 – 분기를 만들기
    5. 반복문 – 비슷한 작업을 반복하기
    6. 반복문 코딩하기
    7. 변수와 리스트 – 비슷한 변수들을 묶기
    8. for, range – 리스트의 항목을 다루기
    9. 함수와 메소드의 호출 – 편리한 기능 이용하기
    10. 모듈 설치와 사용 – 유용한 기능 끌어다 쓰기
    11. 문자열 – 텍스트 다루기
  4. 파이썬 중급
    1. 함수를 직접 만들기 – 자주 쓰는 기능을 묶기
    2. 딕셔너리, 튜플, 세트 – 변수를 다양한 방법으로 묶기
    3. 클래스와 객체 – 변수를 사람으로 진화시키기
    1. 상속 – 클래스를 확장하기
    2. 정체성과 동질성 – 객체의 성질
    3. 특별 메소드와 연산자 – 파이썬의 내부 작동방식 이해하기
    4. 다양한 함수 인수 – 유연한 함수 만들기
    5. 슬라이싱 – 리스트 간편하게 접근하기
    6. 지능형 리스트(List Comprehension) – 리스트 갖고 놀기
    7. namedtuple - 데이터 묶음 손쉽게 만들기
    8. 조건 표현식 (Conditional Expression) - 간단한 분기 나타내기
    9. 코드 스타일 - 코드의 일관성 유지하기
    10. 명령문, 표현식 – 문법을 이루는 것들
    11. 본격적인 검색 해보기
  5. 파이썬 고급
    1. 일급 함수 다루기
    2. NotImplementedError와 NotImplemented
    3. 어노테이션 – 수월하게 프로그래밍하기
    1. 내장 함수 톺아보기
    2. 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
    3. 변수의 범위 – 이름 검색의 범위
  6. 파이썬 심화
    1. 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
    2. 데코레이터 – 함수의 기능을 강화하기
    3. 프로퍼티
    4. 제너레이터
    5. async와 await
    6. 객체로서의 클래스 – 클래스를 동적으로 정의하기
  7. 파이썬 프로젝트 실습
    1. 원카드 게임 만들기 (1)
    2. 원카드 게임 만들기 (2)
    3. 원카드 게임 만들기 (3) (작성중)
    4. 턴제 자동 전투 게임 만들기 (작성중)
  8. 실전 (파이썬 외적인 것들)
    1. 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
    2. 유니코드 – 컴퓨터에서 문자를 표기하는 방법
    3. html, css, 인터넷 – 자동화 첫 걸음 내딛기
    4. 네트워크 – 인터넷으로 통신하는 방법
    5. 문서 – 문맥을 읽어보기

이제 본격적으로 반복문을 코딩해보는 작업을 할 것입니다. 반복문은 조건문과는 달리 조금의 코드만으로도 작업량이 굉장히 많아질 수 있습니다. 반복문에서는 한두 줄이라도 반복을 수천번 수백번 할 수 있기 때문에 다소 조심히 다루어야 합니다.

우선 이러한 반복을 유심히 살펴보게 해주는 도구를 먼저 알아볼 텐데요, 바로 우리가 지금까지 많이 써왔던 print 함수에 대한 중요성을 먼저 강조한 후 넘어가보겠습니다.


print 활용하기

다음은 앞선 시간break에 관한 예제에서 print에 좀 더 신경쓴 모습입니다. 실제 동작은 똑같습니다. 앞으로 print더 잘 쓰는 방법에 대해서 배우게 될 테지만 간략한 방법 하나를 바로 소개해드리겠습니다. print 함수를 쓸 때, 내부에 쉼표로 항목들을 구분지을 수가 있는데, 저렇게 하면 형을 str로 고치지 않고도 int와 같은 숫자형을 바로 볼 수 있다는 게 장점입니다. 항목간 구분은 공백 한 칸으로 대체됩니다.

durability = int(input("샌드백의 내구도를 입력하세요 >> "))
attack = 1
loop_number = 1 # 루프가 몇 번째 돌았는지 알게 해주는 변수
while True:
    before_attack = attack # 해당 루프에서 attack 값이 바뀌기 전에 저장
    before_durability = durability # 해당 루프에서 durability 값이 바뀌기 전에 저장

    # 실제 동작
    durability -= attack
    attack += 1

    # 출력. 실제 동작 전과 동작 후를 비교할 수 있음.
    print("------------" , loop_number , "번째 루프 ------------")
    print("이전 | attack:", before_attack, ", durability:", before_durability) 
    print("이후 | attack:", attack, ", durability:", durability) 

    if durability <= 0:
        break
    
    loop_number += 1 # 증감하기

print("샌드백이 부서졌습니다! 최종 공격력은 " + str(attack) + "입니다.")
샌드백의 내구도를 입력하세요 >> 21
------------ 1 번째 루프 ------------
이전 | attack: 1 , durability: 21
이후 | attack: 2 , durability: 20
------------ 2 번째 루프 ------------
이전 | attack: 2 , durability: 20
이후 | attack: 3 , durability: 18
------------ 3 번째 루프 ------------
이전 | attack: 3 , durability: 18
이후 | attack: 4 , durability: 15
------------ 4 번째 루프 ------------
이전 | attack: 4 , durability: 15
이후 | attack: 5 , durability: 11
------------ 5 번째 루프 ------------
이전 | attack: 5 , durability: 11
이후 | attack: 6 , durability: 6
------------ 6 번째 루프 ------------
이전 | attack: 6 , durability: 6
이후 | attack: 7 , durability: 0
샌드백이 부서졌습니다! 최종 공격력은 7입니다.

어때요, 보기가 좀 더 편해지지 않았나요? before_attack, before_durability, loop_number은 오로지 print를 보조하기 위한 변수라 낭비라고 생각하실 수도 있는데, 변수 몇 개 더 쓰는거는 프로그램에겐 아무런 일도 아니므로 쓰고 싶은 만큼 왕창왕창 쓰도록 합시다! 뭐가 어떻게 돌아가는지, 왜 의도한 대로 작동하지 않는지 궁금하다면 머리를 싸매고 고민하는 것보다 print를 많이 써서 어떻게 돌아가는지 직접 눈으로 보는 게 훨씬 현명한 판단입니다!


반복문의 설계

반복문은 아주 강력한 도구입니다. 한두 줄의 코드를 써도 그것이 몇 백번, 몇 천번 반복하게 만들 수 있으니까요. 같은 코드를 몇 천줄 쓴다고 상상해보세요. 복사 붙여넣기 하는데만 한 세월일 것입니다.

하지만 반복문을 처음 맞닥뜨렸을 때 반복문을 어떻게 활용해야 할지 막막합니다. 언제 어떻게 써야 할지 감이 잘 오지가 않죠. 왜냐하면 반복문은 실제로 코드가 어떻게 실행되는지 상상하기가 어렵기 때문입니다. if문 같은 경우에는 코드가 실행되거나, 실행되지 않거나 입니다. 눈으로 따라가며 코드의 흐름을 어느정도 파악할 수 있습니다. 반복문은 한 번 반복할지, 세 번 반복할지, 혹은 100번 반복할지 모르는 법입니다.

반복문을 설계할 때 고려할 세 가지 핵심 생각은 다음과 같습니다.

  • 초기화 : 반복문에 들어가기 전에, 준비 작업은 어떻게 할까?
  • 조건 : 조건을 어떻게 작성할까?
  • 증감 : 반복문 내부에서 조건 변수를 어떻게 조정할까?

반복문에 들어가기 전에 준비 작업은 어떻게 할까?

다음 코드는 위 예제에서 attack = 1을 while 블록 내부로 옮긴 코드입니다. 실행해볼까요? 아마도 우리의 의도대로 움직이지 않을겁니다.

durability = int(input("샌드백의 내구도를 입력하세요 >> "))
loop_number = 1 # 루프가 몇 번째 돌았는지 알게 해주는 변수
while True:
    attack = 1
    before_attack = attack # 해당 루프에서 attack 값이 바뀌기 전에 저장
    before_durability = durability # 해당 루프에서 durability 값이 바뀌기 전에 저장

    # 실제 동작
    durability -= attack
    attack += 1

    # 출력. 실제 동작 전과 동작 후를 비교할 수 있음.
    print("------------" , loop_number , "번째 루프 ------------")
    print("이전 | attack:", before_attack, ", durability:", before_durability) 
    print("이후 | attack:", attack, ", durability:", durability) 

    if durability <= 0:
        break
    
    loop_number += 1 # 증감하기

print("샌드백이 부서졌습니다! 최종 공격력은 " + str(attack) + "입니다.")
샌드백의 내구도를 입력하세요 >> 6
------------ 1 번째 루프 ------------
이전 | attack: 1 , durability: 6
이후 | attack: 2 , durability: 5
------------ 2 번째 루프 ------------
이전 | attack: 1 , durability: 5
이후 | attack: 2 , durability: 4
------------ 3 번째 루프 ------------
이전 | attack: 1 , durability: 4
이후 | attack: 2 , durability: 3
------------ 4 번째 루프 ------------
이전 | attack: 1 , durability: 3
이후 | attack: 2 , durability: 2
------------ 5 번째 루프 ------------
이전 | attack: 1 , durability: 2
이후 | attack: 2 , durability: 1
------------ 6 번째 루프 ------------
이전 | attack: 1 , durability: 1
이후 | attack: 2 , durability: 0
샌드백이 부서졌습니다! 최종 공격력은 2입니다.

매 루프마다 attack += 1을 해주었음에도 불구하고 계속 현재 공격력이 1이라 출력하고 있습니다. 원인은 매 루프마다 실행되는 attack = 1 대입문입니다. 이전 루프에서 attack += 1 이 실행되어 attack이 2가 되었음에도 불구하고 다시 attack = 1로 대입해주고 있습니다. 결국 매 루프마다 공격력은 변하지 않은 채 내구도는 1씩 닳게 되겠죠.

attack에 대한 초기화는 while 내부에 존재하면 안 됩니다. 반복문 이전에 설정해야 할 초깃값이 되어야 논리가 맞아 떨어집니다.


조건을 어떻게 작성할까?

while에서 조건은 True일 경우에만 계속해서 동작합니다. 한 번이라도 False가 되면 while 문을 빠져나오게 되며, 다시는 돌아갈 수 없게 됩니다. 가장 처음으로 while에 맞닥뜨렸을 때 False 라면, 한 번도 실행되지 않은 채 다음으로 넘어갑니다. 즉, 반복문이 반복될 동안은 조건이 True로 유지되었다가, 종료하고 싶을 때 조건이 False로 바뀌기만 하면 된다는 것입니다.

반면 break는 어느 정도 반대의 논리를 따릅니다. break는 대개 if문 내부에 쓰이는 식으로 함께 쓰이는데, 이 때 if 조건은 False여야 내부의 break를 건들지 않아 종료되지 않고 계속해서 실행될 수 있으며, 한 번이라도 True가 된다면 break가 실행되는 결과를 낳아서 반복문이 종료됩니다.

while에서의 조건이나, if와 break 에서의 조건이나 마찬가지로, 대개 조건에서는 변수를 활용해야 합니다. 왜냐하면 바뀌지 않는 조건은 결과 또한 True 또는 False로 고정되기 때문에, 노트북의 배터리가 방전될 때까지 무한히 반복하는 프로그램이 되거나 단 한번도 실행될 수 없는 무용지물이 되겠지요. 예를 들어, 다음 while은 쓸모가 없습니다.

# 무한히 반복합니다.
while 3 < 8:
    코드

# 절대 실행될 수 없습니다.
while 3 > 8:
    코드

# 영원히 종료되지 않습니다.
while True:
    코드
    if 3 > 8:
        break

# 마찬가지로 단 한번만 실행됩니다.
while True:
    코드
    if 3 < 8:
        break

# a < b 조건이 충족한다 하더라도 단 한번만 실행됩니다.
while a < b:
    코드
    break

조건에 어떤 변수를 넣느냐가 관건입니다.


반복문 내부에서 조건 변수를 어떻게 조정할까?

조건 변수를 조정한다는 게 어떤 의미일까요? 우리가 만든 while 문에서 조건은 durability > 0 입니다. 우리는 값을 직접 입력하여 durability의 초기값을 설정했습니다. 우리가 위에서 8000300이라고 입력한 것처럼요. 하지만 만약에 이 durability가 영원히 변하지 않는다면 어떻게 될까요? 지금은 while 문 내부에서 durability -= attack으로 지속적인 변화를 주고 있습니다만, 이 명령이 없다면 어떻게 될까요? 계속해서 while 문의 조건은 8000 > 0으로 고정되어 버릴테고, 우리의 루프는 영영 끝나지 않게 되어 버릴 겁니다.

조건을 아무리 잘 설정했다 하더라도, 실제 조건에 관여하는 변수들을 지속적으로 관리하고 조정해나가지 않는다면 조건은 무용지물입니다. 그러므로 변수들을 어떻게 변화시켜나갈 것인가 또한 중요한 화두입니다.

훌륭한 방법이 있습니다. 앞서 print("공격력: " + str(attack) + ", 내구도: " + str(durability)) 이 줄을 추가한 것처럼 변화하는 변수를 실시간으로 확인할 수 있도록 변수의 내용을 매 루프마다 출력시키는 것입니다. print 함수는 아무리 많이 써도 닳지 않습니다. 어떤 식으로 변수가 변화하는지 파악하기에 가장 좋은 방법입니다.


실전 예제

처음에는 감이 오지 않습니다. 다음 문제를 풀어보도록 합시다.

수를 입력받고 이 수의 모든 약수를 출력하는 프로그램을 작성하여라.

처음에는 이것을 반복문을 써야 하는지 아닌지도 감이 오시지 않을 겁니다.


컴퓨터가 이해할 수 있는 식을 생각하기

우리는 약수가 무엇인지는 대충 압니다. a를 b로 나눴을 때 딱 나누어 떨어진다면 b는 a의 약수입니다. 하지만 나누어 떨어진다는 것은 무엇일까요? 우리는 저 문장으로도 뜻이 바로 통해버리기에 쉽게 생각하지만 컴퓨터는 딱 나누어 떨어진다라는 말을 이해할 수 없습니다. 컴퓨터는 01, 아니 조금 더 확장시켜서 우리가 작성한 코드로만 이해할 수 있기 때문에 컴퓨터가 이해할 수 있도록 컴퓨터의 언어로 번역해줘야 합니다.

우리는 처음에 입력을 받는다고 했습니다. 그러므로 a는 이미 정해진 상황입니다. b는 임의로 우리가 4라고 정해봅시다. 그렇다면 딱 나누어 떨어진다라는 것을 어떻게 코드로 적어줄 수 있을까요? 다음과 같이 하면 될 것 같습니다.

a = int(input())
b = 4 # 임시로 적었습니다.
if a % b == 0:
    print(str(b) + '는 ' + str(a) + '의 약수입니다!')
else:
    print(str(b) + '는 ' + str(a) + '의 약수가 아닙니다!')
12
4는 12의 약수입니다!

이 단계에서의 핵심은 a % b == 0 이라고 적은 것입니다.


후보군을 파악하기

계속해서 상상력을 발휘해봅시다.

  1. a는 입력으로 들어옵니다. (앞서 수를 하나 입력받는다고 했습니다.)
  2. 컴퓨터는 어떤 숫자가 약수일지 미리 판단할 수 없습니다. 컴퓨터는 a % b == 0라는 식을 돌려야 비로소 ba의 약수임을 확인할 수 있습니다.

실제로 컴퓨터가 어떻게 돌아가는지 상상하기 위해 a12라고 가정해보겠습니다.

  • … 음수의 모든 결과는 False
  • 12 % -1 == 0 의 결과는 False
  • 12 % 0 == 0 의 결과는 False
  • 12 % 1 == 0 의 결과는 True
  • 12 % 2 == 0 의 결과는 True
  • 12 % 3 == 0 의 결과는 True
  • 12 % 4 == 0 의 결과는 True
  • 12 % 5 == 0 의 결과는 False
  • 12 % 6 == 0 의 결과는 True
  • 12 % 7 == 0 의 결과는 False
  • 12 % 8 == 0 의 결과는 False
  • 12 % 9 == 0 의 결과는 False
  • 12 % 10 == 0 의 결과는 False
  • 12 % 11 == 0 의 결과는 False
  • 12 % 12 == 0 의 결과는 True
  • 12 % 13 == 0 의 결과는 False
  • 12 % 14 == 0 의 결과는 False
  • … 이하 결과는 모두 False

좋습니다. 이제서야 1, 2, 3, 4, 6, 1212의 약수임을 컴퓨터는 확신할 수 있습니다. 가능한 모든 수를 검사해봤기 때문이죠. 우리는 앞으로 더 큰 숫자가 들어와도 이를 무리없이 행해야 합니다. 일일히 우리가 손으로 모든 상황을 검사해줄 수 없으니 검사의 범위를 지정해주어야 합니다.

그러한 검사의 범위를 후보군이라고 이야기하겠습니다. 우리가 입력을 받는 순간 우리는 검사해야 할 범위를 명시해줄 수 있습니다. 그러니까 12의 약수를 구할 때 -1000 같은 건 검사할 필요도 없이 우리가 아니라고 말할 수 있습니다. 왜냐하면 음수는 약수를 논하는 자리에서는 아예 논리적으로 맞지 않는 불청객이기 때문입니다. 1000같이 아주 큰 숫자도 전혀 필요 없습니다. 10000도 마찬가지지요. 왜냐구요? 약수는 무조건 해당 숫자보다 작거나 같은 범위에 있기 때문이지요.

그렇다면, 1928371의 약수가 될까요? 사람이 대답한다면 “모릅니다”라고 대답할 수 밖에 없을 겁니다. 암산으로도 하기가 힘들지요. 컴퓨터가 계산하면 정답을 알 수 있습니다. 어찌 되었든 1928371이라는 숫자의 약수를 구할 때 후보군이 될 자격이 충분합니다. 정말 누가 봐도 불가능한 영역과, 직접 검사를 해보지 않고서는 모르는 영역을 나누어야 합니다. 그 후, 검사를 해야 하는 영역을 검사해보면 됩니다.

약수를 구하는 문제에서 검사해야 할 후보군은 명확합니다. 1 이상 a 이하의 수를 검사해보면 됩니다. a보다 큰 숫자나, 1보다 작은 숫자는 약수가 될 가능성이 제로입니다.

이 단계에서의 핵심은 1 이상 a 이하의 수가 a의 약수가 될 가능성이 있다 고 이야기할 수 있다는 것입니다.


반복문의 설계를 떠올리며 변동하는 부분 파악하기

지금껏 정리한 내용은 다음과 같습니다.

  • 컴퓨터가 어떤 수가 약수인지 판단하는 근거는 a % b == 0 입니다.
  • a는 입력으로 정해집니다. 이 때 검사해야 할 b의 범위는 1 이상 a 이하입니다.

좋습니다. 이제 반복문을 이용해 b를 제어할 차례입니다. b는 우리가 언제든지 새로 대입(=)해서 값을 만들어낼 수도 있고, += 또는 -=를 통해 값을 증가시키거나 감소시킬 수도 있습니다. 우선 반복하면서 변화하는 b를 제어하기 위해 초기값을 설정해줍시다. 여기서는 b를 후보군의 시작인 1부터 차례대로 증가시키겠다고 가정하겠습니다. 왜 차례대로 1씩 증가하냐면, 후보군 내의 모든 수를 검사해야 하기 때문입니다. 1만 하고 2를 건너뛰고 3을 검사하면 안될 노릇이지요.

그렇다면 초기의 b의 값은 1로 정해지는 것이며, 매번 반복문을 돌 때마다 1씩 증가하는 것은 정해졌습니다. 이제 조건을 설정해야 합니다. 조건을 설정하지 않으면 ba를 넘어 1000, 10000, 100000 등등 컴퓨터가 동작하는 그 날까지 무한대로 1씩 증가할 것입니다. b가 증가하면서 검사해야 할 조건은 b가 a 이하인지만 검사하면 됩니다. b는 처음에 1에서 부터 출발하여 증가하므로, 0 이하인지 아닌지 생각할 필요도 없습니다.

이 모든 내용을 표로 정리하면 다음과 같습니다.

간단한 이름 항목 조치 코드
초기화 반복문에 들어가기 전에, 준비 작업은 어떻게 할까? b1로 초기화시킨다. b = 1
조건 조건을 어떻게 작성할까? ba 이하일 때까지만 b <= a
증감 반복문에서 조건 변수를 어떻게 조정할까? b1씩 증가시킨다. b += 1

이 단계에서의 핵심은 초기화, 조건, 증감에 해당하는 코드를 직접 적어보는 것입니다.


반복문 작성하기

좋습니다. 이제 작성해봅시다.

a = int(input())
b = 1
while b <= a:
    if a % b == 0:
        print(str(b) + '는 ' + str(a) + '의 약수입니다!')
    b += 1
12
1는 12의 약수입니다!
2는 12의 약수입니다!
3는 12의 약수입니다!
4는 12의 약수입니다!
6는 12의 약수입니다!
12는 12의 약수입니다!

a12를 입력했을 때, 위와 같은 결과가 나옵니다. 이를 루프 횟수에 따라 표로 정리하면 다음과 같습니다. 우선 b의 초깃값은 1 입니다.

루프 횟수 a % b == 0 b의 변화
1 12 % 1 == 0 : True 1 증가
2 12 % 2 == 0 : True 1 증가
3 12 % 3 == 0 : True 1 증가
11 12 % 11 == 0 : False 1 증가
12 12 % 12 == 0 : True 1 증가
13

마지막에 b13이 되었을 때에, while의 조건을 그대로 대입해보면, 13 <= 12를 체크해 보았을 때 False 이므로 while을 빠져나가게 됩니다.

성공했습니다! 훨씬 큰 숫자를 써도 잘 작동하는 것을 확인하실 수 있을 겁니다.

코드 전체에서 조건식은 2개가 등장했습니다. 하나는 while문에 들어간 b <= a이고 하나는 if문에 들어간 a % b == 0입니다. 이 두 개의 구분은 유념해주시기 바랍니다. 후보군을 순회하는 것과 실제 조건이 들어맞는지 아닌지 체크하는 것은 별도의 작업이기 때문입니다.


프로그래밍 문제

  1. 다음과 같이 출력하는 프로그램을 만들어라.


    하하
    하하하
    하하하하

    하하하하하하하하
  2. 작은 수 하나와 큰 수 하나를 입력받고, 그 사이에 있는 모든 짝수를 출력하는 프로그램을 만들어라.
  3. 5개의 양의 정수를 입력받고, 이들 중 가장 큰 수를 출력하여라.
  4. 학생 10명의 점수를 각각 입력받고, 그 합계를 출력하라.
  5. 수를 계속 입력받아라. 입력받은 수는 계속해서 곱한다. 그 값이 1000이 넘어간다면, 그 값을 출력하고 프로그램을 종료하라.
  6. 수를 계속해서 입력받는다. 5 이상의 수가 3번째로 입력되는 순간 입력을 멈추고, 지금까지 입력받았던 모든 수를 합하여 출력하라.
  7. 다음 수식을 계산하고 그 결과를 출력하는 프로그램을 작성하여라.
    S = 1 + 2 + 4 + 7 + 11 + 16 + 22 + ... + 191
  8. 먼 미래, 인류는 치명적 바이러스 때문에 멸종 위기에 처했다. 인구는 50,000명 밖에 남지 않았으며, 이마저도 매년 10%씩 감소하는 추세이다. 이윽고 20,000명 이하가 될 때까지 몇 년이 걸리는지 계산하여라.
  9. 고대 그리스의 어떤 국가의 인구는 100,000명이다. 이 국가는 한창 성장세라서 인구가 매년 10% 증가한다. 하지만 호전적인 국가이기 때문에 매년 5,000명이 전쟁으로 사망한다. 200,000명이 넘을 때까지 몇 년이 걸리는지 계산하라. (단, 인구가 먼저 증가한 다음에 전쟁으로 사망한다고 가정한다.)
  10. 피보나치 수열은 앞 두개의 숫자는 1이며 다음 숫자는 바로 이전 숫자 두 개의 합이다. (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...) 사용자로부터 양수 N을 입력받고, 피보나치 수열의 N 번째 수를 출력하여라.

프로그래밍 문제 정답

  1. 코드입니다.
msg = ''
i = 0
while i < 8:
    msg += '하'
    print(msg)
    i += 1
  1. 코드입니다.
low = int(input('작은 수를 입력하세요 >> '))
high = int(input('큰 수를 입력하세요 >> '))

i = low
while i <= high:
    if i % 2 == 0:
        print(i)
    i += 1
  1. 코드입니다.
i = 0
max_num = 0
while i < 5:
    num = int(input("숫자를 입력하세요 >> "))
    if max_num < num:
        max_num = num
    i += 1
print('최댓값은', max_num, '입니다')
  1. 코드입니다.
result = 0
i = 1
while i <= 10:
    result += int(input(str(i) + '번째 학생의 점수를 입력하세요 >> '))
    i += 1
print('합계는', result, '점 입니다.')
  1. 코드입니다.
result = 1
while True:
    result *= int(input())
    if result > 1000:
        print(result)
        break
  1. 코드입니다.
count = 0
result = 0
while True:
    num = int(input())
    result += num
    if num >= 5:
        count += 1
    if count >= 3:
        break
print(result)
  1. 코드입니다.
num = 1
ac = 1
result = 0
while num <= 191:
    result += num
    num += ac
    ac += 1
print(result)
  1. 코드입니다.
people = 50000
year = 0
while True:
    people *= 0.9
    year += 1
    if people <= 20000:
        break
print(year, "년이 지났습니다.")
  1. 코드입니다.
pop = 100000
year = 0
while pop < 200000:
    pop *= 1.1
    pop -= 5000
    year += 1
print(year)
  1. 코드입니다.
i = int(input("숫자를 입력하세요 >> "))
if i == 1 or i == 2 :
    print(1)
else:
    s1 = 1
    s2 = 1
    j = 3
    while j <= i:
        s3 = s1 + s2
        s1 = s2
        s2 = s3
        j += 1
    print(s3)

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 – 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 – 왜 파이썬인가?
    4. 파이썬 설치 – Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 – 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 – 소통하기
    2. 변수와 대입 – 기억하기
    3. 연산자 – 계산하기
    4. 조건문 – 분기를 만들기
    5. 반복문 – 비슷한 작업을 반복하기
    6. 반복문 코딩하기
    7. 변수와 리스트 – 비슷한 변수들을 묶기
    8. for, range – 리스트의 항목을 다루기
    9. 함수와 메소드의 호출 – 편리한 기능 이용하기
    10. 모듈 설치와 사용 – 유용한 기능 끌어다 쓰기
    11. 문자열 – 텍스트 다루기
  4. 파이썬 중급
    1. 함수를 직접 만들기 – 자주 쓰는 기능을 묶기
    2. 딕셔너리, 튜플, 세트 – 변수를 다양한 방법으로 묶기
    3. 클래스와 객체 – 변수를 사람으로 진화시키기
    1. 상속 – 클래스를 확장하기
    2. 정체성과 동질성 – 객체의 성질
    3. 특별 메소드와 연산자 – 파이썬의 내부 작동방식 이해하기
    4. 다양한 함수 인수 – 유연한 함수 만들기
    5. 슬라이싱 – 리스트 간편하게 접근하기
    6. 지능형 리스트(List Comprehension) – 리스트 갖고 놀기
    7. namedtuple - 데이터 묶음 손쉽게 만들기
    8. 조건 표현식 (Conditional Expression) - 간단한 분기 나타내기
    9. 코드 스타일 - 코드의 일관성 유지하기
    10. 명령문, 표현식 – 문법을 이루는 것들
    11. 본격적인 검색 해보기
  5. 파이썬 고급
    1. 일급 함수 다루기
    2. NotImplementedError와 NotImplemented
    3. 어노테이션 – 수월하게 프로그래밍하기
    1. 내장 함수 톺아보기
    2. 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
    3. 변수의 범위 – 이름 검색의 범위
  6. 파이썬 심화
    1. 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
    2. 데코레이터 – 함수의 기능을 강화하기
    3. 프로퍼티
    4. 제너레이터
    5. async와 await
    6. 객체로서의 클래스 – 클래스를 동적으로 정의하기
  7. 파이썬 프로젝트 실습
    1. 원카드 게임 만들기 (1)
    2. 원카드 게임 만들기 (2)
    3. 원카드 게임 만들기 (3) (작성중)
    4. 턴제 자동 전투 게임 만들기 (작성중)
  8. 실전 (파이썬 외적인 것들)
    1. 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
    2. 유니코드 – 컴퓨터에서 문자를 표기하는 방법
    3. html, css, 인터넷 – 자동화 첫 걸음 내딛기
    4. 네트워크 – 인터넷으로 통신하는 방법
    5. 문서 – 문맥을 읽어보기

One thought on “파이썬 강좌 – 반복문 코딩하기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

Scroll to top