━━━━ ◇ ━━━━
따라하며 배우는 파이썬과 데이터 과학/PART 1. 파이썬 기초체력 다지기

Chapter 04. 조건을 따져 실행해보자

이번 시간의 목차

1. 프로그램의 기본 제어 구조

2. 조건을 걸고 싶으면 if 를 써 보자

3. 배타적 조건, if - else문

4. 조건이 거짓일 때 또 검사하기, elif문

5. 마무리

 

 

 

자, 가자! 파이썬의 세계로!


 

프로그램의 기본 제어 구조

 

 하나의 프로그램 중의 제어 흐름을 논리식의 값에 따라 분기시키는 선택 구조를 제어 구조(Control Structure)라고 한다. 기본적인 제어 구조로는 세 가지가 있다.

  • 순차 구조(sequence) : 여러 명령이 순차적으로 실행되는 구조이다.
  • 선택 구조(selection) : 여러 개 중 하나의 명령문을 선택하여 실행하는 구조이다.
  • 반복 구조(iteration) : 동일한 명령이 반복되면서 실행되는 구조이다.

 위는 순차 구조, 선택 구조, 반복 구조를 순서도(Flowchart)로 나타낸 것이다. 

 

 

 

 이번에는 제어 구조 중에서도 선택 구조에 대해 알아보려 한다. 

선택 구조는 질문을 한 후에 결정하는 것이다. 우리의 삶에서도 수많은 선택을 해야 하고, 이는 프로그램에서도 마찬가지이다. 프로그램의 어떤 단계에서는 진행할 수 있는 경로가 하나 이상인 경우가 있는데, 이때 우리는 어떤 경로를 선택할 것인지 결정해야 한다. 그래야 상황에 따라 반응하는 유연한 프로그램이 될 것이다. 

 

 프로그램에서 선택 구조가 필요한 경우의 예로 '성적이 60점 이상이면 합격인 시험'을 들어서 if 조건식을 살펴보자.

 


 

조건을 걸고 싶으면 if 를 써 보자

 

 60점 이상이면 합격, 이라고 한다면 성적의 데이터가 60 이상인지 아닌지 판단해야 한다. 이렇게 어떤 조건(Condition)을 만족하는지 그렇지 않은지 판단할 때 쓰는 식을 조건식(Condition Expression) 이라고 한다. 이 조건식은 참 또는 거짓의 값을 갖는 부울형으로 평가된다.

 

 조건식에는 어떤 수식을 쓸 수 있을까? 이전에 배운 관계 연산자나 논리 연산자 등 최종적으로 참 또는 거짓의 값을 갖는 수식이라면 조건식이 될 수 있다. 논리 연산이나 관계 연산자를 사용하면 여러 조건이 걸린 복합 조건식을 만들 수도 있을 것이다.

 

 if문은 다음과 같이 사용하면 된다.

 

if 조건식 : 
    실행할 내용
    실행할 내용 
cs

 

 위의 방식대로 코딩하면 조건식을 평가한 결과가 True 라면 실행할 내용이 실제로 실행이 되고, 그렇지 않으면 실행할 내용을 선택하지 않고 건너 뛰어 버린다. 

 

 그럼 실제로 성적 데이터를 받아서 60 이상인지 아닌지 판단하여 합격 여부를 따져보자. 

 

score = int(input('점수를 입력하시오 : '))
if score >= 60 :
    print('합격입니다.')
cs

 

이렇게 짜고 나서 실행을 시켜 보면 

 

점수를 입력하시오 : 65
합격입니다. 
>>>
점수를 입력하시오 : 30
>>>
cs

 

 score 변수에 저장된 데이터에 따라 '합격입니다.' 문자열이 출력되거나 출력되지 않는 것을 볼 수 있다. 첫 번째 실행에서 score 변수에 저장된 데이터가 65로 score >= 60이 True를 반환하므로 print('합격입니다.') 가 실행되었고, 두 번째 실행에서는 score 변수에 저장된 데이터가 30이므로 score >= 60이 False를 반환하고 조건식 아래의 실행할 내용이 생략된다. 

 

 if로 조건문을 만들 때에 주의해야 할 점이 있다. 

if 뒤에 조건식이 이어진 다음 : (콜론) 이 보인다. 콜론 아래의 줄은 반드시 들여쓰기를 해 줘야 한다. 또 실행할 내용이 2개 이상일 경우 그 내용들은 모두 동일한 개수의 공백만큼 들여쓰기 해야 한다. 동일한 블록(Block)에 속해 있기 때문이다. 하나의 블록에 속하는 문장들은 모두 같이 실행된다. 보통 블록에 있는 문장들은 그 위에 있는 문장과 비교해봤을 때 문장의 맨 앞에 4칸의 들여쓰기 공백을 두고 시작한다. 동일한 블록에 있는데도 공백 수에 약간이라도 차이가 나면 오류가 발생한다. 

 

score = int(input('점수를 입력하시오 : '))
if score >= 60 :
    print('합격입니다.')
      print('장학금 대상자입니다.')
 
cs

 

 만약 이렇게 들여쓰기 공백 수가 차이 나면 

 

>>> score = int(input('점수를 입력하시오 : '))
점수를 입력하시오 : 89
>>> if score >= 60 :
    print('합격입니다.')
     print('장학금 대상자입니다.')
     
SyntaxError: unexpected indent
cs

 

 위와 같이 오류가 나게 된다. 

 


 

배타적 조건, if - else문 

 

 60점 이상이라면 합격이라는 문구를 출력하는 것은 좋은데, 60 미만일 때 불합격도 알려줘야 하지 않을까? 

이럴 때는 if 조건식 블록 다음으로 else 블록을 달아주면 된다. if - else문은 if의 조건이 참이면 if 블록을 실행하고, 아니면 else 블록을 실행하라는 뜻이다. 

 

score = int(input('점수를 입력하시오 : '))
if score >= 60 :            #60점 이상일 경우 실행되는 블록
    print('합격입니다.')
 
else :                      #60점 미만일 경우 실행되는 블록
    print('불합격입니다.')
cs

 

 이렇게 60점을 기준으로 이상이면 합격, 미만이면 불합격이 될 때 0에서 100까지의 점수가 입력될 경우 합격점이면서 동시에 불합격점이 될 수 없으므로 이 조건은 배타적 조건(Exclusive Condition)이 된다. 

 

 이제 본격적으로 if-else문을 활용해 보자.

우리는 지난 시간에 입력 받은 어떤 정수를 나머지 연산자를 통해 짝수인지 홀수인지 구분해내는 법을 배웠다. 이제는 조건에 맞추어 홀수인지 짝수인지 출력할 수도 있을 것이다.

 

number = int(input('양의 정수를 입력하세요 : '))
if number % 2 == 0 :
    print('짝수입니다.')
else : 
    print('홀수입니다.')
cs

 

 만약 임의의 정수를 받고 나서 이 검사를 0 이상인 수에 대해서만 하고, 이 정수가 음수인 경우에는 '음수입니다'를 출력하는 좀 더 복잡한 조건을 설정하려면 어떻게 해야 할까? 간단하다. if-else문 속에 또 if-else문을 붙여주면 된다. 이런 조건문 내의 조건문을 내부 조건문이라고도 한다. 

 

number = int(input('양의 정수를 입력하세요 : '))
if number < 0 :
    print('음수입니다.')
 
else :
    print('양수입니다.')
    if number % 2 == 0 :
        print('짝수입니다.')
    else :
        print('홀수입니다.')
cs

 

 특히 위의 예시처럼 else 블록이 아닌 if 블록에 또다른 if문이 들어가면 중첩 if문이라고 한다. 

number = int(input('양의 정수를 입력하세요 : '))
if number >= 0 :
    if number == 0 : 
        print('0입니다.')
    else :
        print('양수입니다.')
 
else :
    print('음수입니다.')
cs

 

 

하지만 조건을 덧붙이고 싶을 때마다 이렇게 중첩 if문만을 쓰다 보면 가독성에 문제가 생길 때도 있다. 이럴 때엔 elif라는 키워드를 쓰면 된다.


 

조건이 거짓일 때 또 검사하기, elif문

 

  elif는 'else if'를 줄인 말로, if-else문에서 if 조건이 거짓일 때 elif로 넘어가 다른 조건을 검사하게 된다. 

좀 전에 봤던 양수/음수 구분 코드를 조금 고쳐 보자. 

 

number = int(input('양의 정수를 입력하세요 : '))
if number >= 0 :
    if number == 0 : 
        print('0입니다.')
    else :
        print('양수입니다.')
 
else :
    print('음수입니다.')
cs

 

 if문에 걸려있는 number >= 0을 number > 0 과 number == 0 으로 구분해서 if-elif-else 문으로 구현할 수 있을 것이다.

 

number = int(input('양의 정수를 입력하세요 : '))
if number > 0 :
    print('양수입니다.')
 
elif number == 0 :
    pirnt('0입니다.')
 
else :
    print('음수입니다.')
cs

 


 

마무리

 

 이번 시간에는 조건에 따라 코드를 실행하는 조건식과 if-elif-else문에 대해 알아보았다. 

마지막으로 4장의 도전문제 4.4, 4.9, 4.12, 심화문제 4.5, 4.8을 풀어보고 마치도록 하자. 접은글 속의 해답 코드는 참고만 하도록 하자. 

 

도전문제 

 

4.4: 사용자로부터 2개의 정수를 연속하여 입력받도록 아래의 코드를 수정하여라. 이때 두 정수는 모두 0이 아니라고 가정하자. 두 정수를 각각 x, y라 할 때 두 정수의 부호가 모두 양수이면 1사분면(100, 100) 좌표로, x가 음수이고 y가 양수이면 2사분면 (-100, 100) 좌표로, 두 수 모두 음수이면 3사분면 (-100, -100) 좌표로, x가 양수이고 y가 음수이면 4사분면 (100, -100) 좌표로 거북이를 이동시키는 프로그램을 작성해 보자. (Tip: 터틀 그래픽의 다양한 함수는 이쪽에서 더 자세히 볼 수 있다. → https://docs.python.org/3/library/turtle.html)

import turtle
= turtle.Turtle()
t.shape('turtle')
 
t.penup()        #펜을 올려 그림이 그려지지 않게 한다.
t.goto(100100#거북이를 (x, y)로 이동시키는 함수.
t.write('거북이가 여기로 오면 양수입니다.')
t.goto(1000)
t.write('거북이가 여기로 오면 0입니다.')
t.goto(100-100)
t.write('거북이가 여기로 오면 음수입니다.')
t.goto(00)     #거북이를 원위치로 놓고
t.pendown()      #펜을 내려 그림이 그려지게 한다. 
 
= turtle.textinput('''숫자를 입력하시오: ')
= int(s)
 
if n > 0 :
    t.goto(100100)
 
elif n == 0 :
    t.goto(1000)
 
else :
    t.goto(100-100)
 
turtle.done()
cs
더보기
import turtle
= turtle.Turtle()
t.shape('turtle')
 
t.penup()
t.goto(100100)
t.write('두 수 모두 양수.')
t.goto(100-100)
t.write('첫 번째 수만 양수.')
t.goto(-100-100)
t.write('두 수 모두 음수.')
t.goto(-100100)
t.write('첫 번째 수만 음수.')
t.goto(00)
t.pendown()
 
= turtle.textinput('''x를 입력하시오: ')
= int(x)
= turtle.textinput('''y를 입력하시오: ')
= int(y)
 
if x > 0 :
    if y > 0 :
        t.goto(100100)
 
    else :
        t.goto(100-100)
 
else :
    if y > 0 :
        t.goto(-100100)
 
    else :
        t.goto(-100-100)
 
cs

 

4.9 : 주사위 던지기 게임을 만들어보자. random.randint(1, 6)을 사용하면 1에서 6까지의 정수를 랜덤하게 생성할 수 있다. 입력으로 '홍길동', '홍길순'과 같은 사용자의 이름을 받아서 홍길동의 주사위 번호, 홍길순의 주사위 번호를 출력한 후 이들을 비교하여 다음과 같이 출력하여라. 결과는 '홍길동이 이겼습니다.', '홍길순이 이겼습니다.', '비겼습니다.' 가운데 하나가 나타나도록 하여라. 

Player1의 이름 : 홍길동
Player2의 이름 : 홍길순
......주사위를 굴립니다......
홍길동의 주사위 번호는 3
홍길순의 주사위번호는 4
홍길순이 이겼습니다.
cs
더보기
import random
player1 = input('Player1의 이름 : ')
player2 = input('Player2의 이름 : ')
n1 = random.randint(16)
n2 = random.randint(16)
print('......주사위를 굴립니다......')
print(player1, '의 주사위 번호는 ', n1)
print(player2, '의 주사위 번호는 ', n2)
 
if n1 > n2 : 
    print(player1, '이 이겼습니다.')
elif n1 < n2 :
    print(player2, '이 이겼습니다.')
else :
    print('비겼습니다.')    
cs

 

4.12 : 컴퓨터와 승부차기 게임을 만들어보자. options = ['왼쪽', '중앙', '오른쪽'] 리스트를 생성하자. 다음으로 random 모듈을 사용하여 computer_choice = random.choice(options)와 같이하여 리스트에서 임의의 문자열을 추출하는 방식으로 다시 작성해 보자. 리스트에 대한 상세한 설명은 6장에서 다룰 것이다. 

어디를 공격하시겠습니까?(왼쪽, 중앙, 오른쪽) : 왼쪽
축하합니다!! 공격에 성공하였습니다.
컴퓨터의 수비위치 : 오른쪽 
cs
더보기
import random
attack = input('어디를 공격하시겠습니까?(왼쪽, 중앙, 오른쪽) : ')
options = ['왼쪽''중앙''오른쪽']
defence = random.choice(options)
 
if attack == defence :
    print('공격에 실패하셨습니다.')
 
else :
    print('축하합니다! 공격에 성공하였습니다.')
 
print('컴퓨터의 수비위치 : ', defence)
cs

 

 

 

심화문제

 

4.5 : random.randint(0, 9)를 이용하여 0에서 9사이의 복권번호 3개를 생성하도록 하자. 이들 중에서 3개의 숫자를 모두 맞히면 '1억원', 2개를 맞히면 '1천만원', 1개를 맞히면 '1만원', 모두 틀리면 '다음 기회에...'를 출력하는 복권 시스템이 있다고 가정하자. 사용자로부터 3개의 정수를 받은 다음 상금을 알려주는 프로그램을 다음과 같이 작성하시오. (예시는 랜덤하게 생성한 복권 당첨 번호가 2, 3, 9라고 가정한다.)  

(Tip. 공백으로 구분된 숫자는 n1, n2, n3 = map(int, input('세 복권번호를 입력하시오 : ').split())으로 한 번에 할당시킬 수 있다. map(x, y)는 y자리에 들어온 여러 데이터에 x라는 함수를 적용해주고, split()은 앞의 문자열을 괄호 속 단위로 문자열을 끊어 리스트로 만들어준다.)

세 복권번호를 입력하시오 : 157
다음 기회에...
 
세 복권번호를 입력하시오 : 129
상금 1천만원
cs
더보기
import random 
n1, n2, n3 = map(int, input('세 복권번호를 입력하시오: ').split())
= random.randint(09)
= random.randint(09)
= random.randint(09)
 
if n1 == x :
    if n2 == y :
        if n3 == z :
            print('상금 1억원')
        else : 
            print('상금 1천만원')
    else :
        if n3 == z :
            print('상금 1천만원')
        else : 
            print('상금 1만원')
 
else : 
    if n2 == y :
        if n3 == z : 
            print('상금 1천만원')
        else : 
            print('상금 1만원')
    else : 
        if n3 == z : 
            print('상금 1만원')
        else : 
            print('다음 기회에...')
cs

 

 

4.8: 덧셈, 뺄셈, 곱셈, 나눗셈을 수행해주는 프로그램을 작성하려 한다. 원하는 연산의 번호(1: 덧셈, 2:뺄셈, 3:곱셈, 4:나눗셈)을 입력 후, 두 개의 양의 정수를 입력하면 연산 결과를 출력해준다. 이때 연산의 번호에서 1, 2, 3, 4가 아닌 다른 값이 입력되면 '잘못 입력하였습니다.'를 출력한다. 또한, 각 연산에 배정된 숫자가 아닌 다른 숫자를 입력하면 잘못 입력하였다는 정보를 출력해야 한다.

1)덧셈 2)뺄셈 3)곱셈 4)나눗셈
어떤 연산을 원하는지 번호를 입력하세요: 4
연산을 원하는 숫자 두 개를 입력하세요 : 3 4
3 / 4 = 0.75
cs
더보기
print('1)덧셈 2)뺄셈 3)곱셈 4)나눗셈')
cal = int(input('어떤 연산을 원하는지 번호를 입력하세요: '))
n1, n2 = map(int, input('연산을 원하는 숫자 두 개를 입력하세요: ').split())
 
if cal == 1 :
    print(n1, '+', n2, '=', n1 + n2)
 
elif cal == 2 :
    print(n1, '-', n2, '=', n1 - n2)
 
elif cal == 3 :
    print(n1, '*', n2, '=', n1 * n2)
 
elif cal == 4 :
    print(n1, '/', n2, '=', n1 / n2)
 
else :
    print('잘못 입력하였습니다.')
cs
COMMENT