본문 바로가기
Python 코딩도장

파이썬 코딩도장 Unit 13 ~ Unit 20 심사문제 풀이

by chanfficial 2022. 1. 16.

Unit 13

Q. 표준 입력으로 가격(정수)과 쿠폰 이름이 각 줄에 입력됩니다. Cash3000 쿠폰은 3,000원, Cash5000 쿠폰은 5,000원을 할인합니다. 쿠폰에 따라 할인된 가격을 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다)

  • 정답 :
    price = int(input())
    coupon = input()
    if coupon == 'Cash3000' :
        print(price - 3000)
    if coupon == 'Cash5000' :
        print(price - 5000)​
    - 가격을 정수로 입력 받아야 하므로 int(input())으로 값을 받아오고 쿠폰의 이름을 input으로 입력 받은 다음, if 조건문을 사용하여 쿠폰 이름이 'Cash3000'(문자열)일 때와 'Cash5000'일 때로 나누어 각각 입력받은 값에서 3000원과 5000원을 뺀 값을 출력하도록 했다.

 

Unit 14

Q. 표준 입력으로 국어, 영어, 수학, 과학 점수가 입력됩니다. 여기서 네 과목의 평균 점수가 80점 이상일 때 합격이라고 정했습니다. 평균 점수에 따라 '합격', '불합격'을 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다). 단, 점수는 0점부터 100점까지만 입력받을 수 있으며 범위를 벗어났다면 '잘못된 점수'를 출력하고 합격, 불합격 여부는 출력하지 않아야 합니다.

  • 정답 :
    korean, english ,math, science = map(int, input().split())
    if 0 <= korean <= 100 and 0 <= english <= 100 and 0 <= math <= 100 and 0 <= science <= 100:
        if (korean + english + math + science) / 4 >= 80 :
            print('합격')
        else :
            print('불합격')
    else :
        print('잘못된 점수')​
    - 먼저 국어, 영어, 수학, 과학 점수를 한 줄에 입력받을 수 있도록 input().split()을 사용한 뒤 변수 네 개에 각각 저장해주는데, 이때 입력받은 값이 문자열 상태이므로 map에 int를 사용하여 정수로 변환했다. 입력받은 점수들이 0점 이상 100점 이하일 때만 평균 계산을 실행하기 때문에 if 조건문과 and 연산자를 사용하여 각각의 점수가 들어있는 변수들이 조건을 만족 시킬 때 4과목의 평균을 계산하여 80점 이상을 만족할 때 '합격', 만족하지 않을 때 '불합격'을 출력하도록 했고 첫 번째 조건문으로 돌아가서 처음 조건을 만족하지 않을 때 '잘못된 점수'를 출력하도록 했다.

 

Unit 15

Q. 표준 입력으로 나이(만 나이)가 입력됩니다(입력 값은 7 이상 입력됨). 교통카드 시스템에서 시내버스 요금은 다음과 같으며 각 나이에 맞게 요금을 차감한 뒤 잔액이 출력되게 만드세요(if, elif 사용). 현재 교통카드에는 9,000원이 들어있습니다.

  • 어린이(초등학생, 만 7세 이상 12세 이하): 650원
  • 청소년(중∙고등학생, 만 13세 이상 18세 이하): 1,050원
  • 어른(일반, 만 19세 이상): 1,250원

  • 정답 :
    # age = int(input())
    # balance = 9000 -> 교통카드 잔액
    
    if 7 <= age <= 12 :
        balance -= 650
    elif 13 <= age <= 18 :
        balance -= 1050
    elif age >= 19 :
        balance -= 1250
    # print(balance)​
    - 변수 age에 입력 받은 나이로 조건에 맞게 금액을 차감하여 출력해야 하기 때문에 문제에서 제시한 조건으로 if - elif문을 만들고 balance -= 650처럼 차감 후 남은 요금을 다시 balance에 저장하여 조건문 밖에서 출력하도록 했다.

 

Unit 16

Q. 표준 입력으로 정수가 입력됩니다. 입력된 정수의 구구단을 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다). 출력 형식은 숫자 * 숫자 = 숫자처럼 만들고 숫자와 *, = 사이는 공백을 한 칸 띄웁니다.

  • 정답 :
    num = int(input())
    for i in range(1, 10):
        print(num, '*', i, '=', num * i)​
    - 먼저 int(input())으로 입력받은 정수를 num이라는 변수에 저장하고, 구구단은 1부터 9까지의 곱셈이므로 1부터 9까지 반복하는 range(1, 10)를 지정하여 for문에 넣어주었다. 결과는 곱한 값만 출력하는 것이 아니라 몇 단인지 출력해야 하기 때문에 num, *, i, =, num * i 순서로 출력되도록 했다.(*과 =는 ' '를 사용하여 문자열 처리해줌)

 

Unit 17

Q. 표준 입력으로 금액(정수)이 입력됩니다. 1회당 요금은 1,350원이고, 교통카드를 사용했을 때마다의 잔액을 각 줄에 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다). 단, 최초 금액은 출력하지 않아야 합니다. 그리고 잔액은 음수가 될 수 없으며 잔액이 부족하면 출력을 끝냅니다.

  • 정답 : - 정수로 금액을 입력받기 위해 int(input())을 사용하여 금액 변수 card에 입력 값을 저장하고, 잔액이 음수가 될 수 없으며 잔액이 부족할 때 while문을 종료시키기 위해 card >= 1350이라는 조건문을 지정했다. 또 최초 금액을 출력하지 않기 위해 교통카드를 사용한 후 남은 금액을 먼저 계산하고 나중에 잔액을 출력하도록 했다.
  • card = int(input()) while card >= 1350 : card -= 1350 print(card)​

 

Unit 18

Q. 표준 입력으로 정수 두 개가 입력됩니다(첫 번째 입력 값의 범위는 1~200, 두 번째 입력 값의 범위는 10~200이며 첫 번째 입력 값은 두 번째 입력 값보다 항상 작습니다). 다음 소스 코드를 완성하여 첫 번째 정수와 두 번째 정수 사이의 숫자 중 3으로 끝나지 않는 숫자가 출력되게 만드세요. 정답에 코드를 작성할 때는 while True:에 맞춰서 들여쓰기를 해주세요.

  • 정답 :
     if i % 10 == 3:
            i += 1
            continue
        if i > stop:
            break​
    - 먼저 3으로 끝나지 않는 숫자를 제외하고 출력하기 위해서 if 조건문을 지정하여 if i % 10 == 3 이면(3으로 끝나는 수 이면) 출력하지 않고 다음 while 반복문을 실행하도록 continue를 사용했다. 그리고 continue로 코드를 건너뛰면 print 밑에 있는 i += 1도 건너뛰게 되므로 continue를 사용하기 전에 i += 1을 넣어주었다. 또 while 반복문에 Ture가 지정된 무한 루프이므로 i(start)가 stop보다 클 때 break로 루프를 중단하도록 했다.

 

Unit 19

Q. 표준 입력으로 삼각형의 높이가 입력됩니다. 입력된 높이만큼 산 모양으로 별을 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다). 이때 출력 결과는 예제와 정확히 일치해야 합니다. 모양이 같더라도 공백이나 빈 줄이 더 들어가면 틀린 것으로 처리됩니다.

  • 정답 :
    height = int(input())
    for i in range(height):
        for j in reversed(range(height)):
            if j > i:
                print(' ', end='')
            else:
                print('*', end='')
        for j in range(height):
            if j < i:
                print('*', end='')
        print()​
    - 너무 어렵게 느껴져서 해설을 그대로 복붙했다. ↓

가로 방향을 반복문 하나로 처리하려면 상당히 어렵습니다. 따라서 반복문을 두 개 사용하여 가로 방향을 반씩 출력하면 됩니다.

    *
   **
  ***
 ****
*****

삼각형을 잘 보면 높이도 5이고, 가로 방향 크기도 5입니다(공백을 포함하면 정사각형). 따라서 height를 이용하여 세로와 가로를 그리면 됩니다. 먼저 for i in range(height):와 같이 세로 방향 반복문을 만듭니다(i는 0 1 2 3 4).조건식은 j > i와 같이 작성하여 가로 방향(j)의 변수보다 세로(i) 방향의 변수가 클 때 공백을 출력해주고, 반대되는 조건에서는 별을 출력해줍니다.이제 나머지 삼각형 반쪽도 출력해줍니다.여기서는 별의 가로 방향을 height - 1개 까지만 출력해야 합니다. 왜냐하면 앞에서 가로 방향도 height와 같게 출력하여 맨 위 꼭지점을 만들었기 때문입니다. 삼각형을 잘 보면 맨 위는 별이 없습니다.

    for j in range(height):
        if j < i:
            print('*', end='')
    print()

가로 방향의 남은 반쪽을 출력했다면 print를 사용하여 줄바꿈을 해주면 됩니다.

특히 range에서 생성되는 마지막 숫자가 지정된 숫자보다 1이 더 작으므로 가로 방향 반복문은 for j in range(height):와 같이 1을 빼지 않습니다. 그리고 조건식을 j < i와 같이 작성하여 가로 방향(j)의 변수가 세로 방향(i)의 변수보다 작을 때 출력하여 i가 증가할 때마다 별이 늘어날 수 있도록 만듭니다. 단, 첫 번째 줄은 출력하지 않아야 하므로 j i보다 작을 때만 출력합니다.

 
*
**
***
****
for i in range(height):
    for j in reversed(range(height)):
        if j > i:
            print(' ', end='')
        else:
            print('*', end='')

가로 방향 반복문은 공백을 기준으로 작성하는데 여기서는 공백이 감소하고 있으므로 for j가 감소하는 형태로 만듭니다. 즉, 첫 줄을 보면 공백 4칸 별 1개이므로 첫 시작은 height - 1이고, 마지막 줄을 보면 공백 0칸 별 5개이므로 끝은 0입니다. 단, range에서 생성되는 마지막 숫자가 지정된 숫자보다 1이 더 작으므로 for j in reversed(range(height)):와 같이 1을 빼지 않은 상태에서 reversed로 숫자의 순서를 뒤집습니다(j는 4 3 2 1 0).

예를 들어 height의 값이 5라면 먼저 다음과 같은 모양으로 삼각형 반쪽을 출력합니다.

input에서 입력된 값은 문자열이므로 int를 사용하여 정수로 변환한 뒤 변수에 저장합니다(이하 변수는 height).

 

 

Unit 20

Q. 표준 입력으로 정수 두 개가 입력됩니다(첫 번째 입력 값의 범위는 1~1000, 두 번째 입력 값의 범위는 10~1000이며 첫 번째 입력 값은 두 번째 입력 값보다 항상 작습니다). 첫 번째 정수부터 두 번째 정수까지 숫자를 출력하면서 5의 배수일 때는 'Fizz', 7의 배수일 때는 'Buzz', 5와 7의 공배수일 때는 'FizzBuzz'를 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다).

  • 정답 :
    a, b = map(int, input().split())
    for i in range(a, b+1):
        if i % 5 == 0 and i % 7 == 0:
            print('FizzBuzz')
        elif i % 5 == 0:
            print('Fizz')
        elif i % 7 == 0:
            print('Buzz')
        else:
            print(i)​
    - 먼저 정수 두 개를 map으로 한 줄에 입력 받은 뒤 각각 a, b 변수에 저장해준다. 첫 번째 정수에서 두 번째 정수까지 숫자를 출력하기 위해 for i in range(a, b+1)로 반복문의 범위를 지정하고 5와 7의 최소 공배수를 먼저 계산할 수 있도록 if문을 작성한 다음 5와 7의 배수를 구하는 조건문을 elif로 작성하게 했으며 세 가지 경우에 해당하지 않는 숫자들은 그냥 출력되게 했다.

 

 

 

정리 참조

https://dojang.io/course/view.php?id=7 

 

강좌: 파이썬 코딩 도장

모두 펼치기모두 접기

dojang.io