logo
Search검색어를 포함하는 게시물들이 최신순으로 표시됩니다.
    Table of Contents
    [Python] 흐름제어if - 연습문제 13~19

    이미지 보기

    [Python] 흐름제어if - 연습문제 13~19

    • 21.12.31 작성

    • 22.01.02 수정

    • 읽는 데 12

    TOC

    참고 강의

    SWEA 파이썬 프로그래밍 기초(1) 파이썬의 기본 구조와 기초 문법 #13 ~ #19


    연습문제 #1

    문제

    다음의 결과와 같이 임의의 양의 정수를 입력받아 그 정수의 모든 약수를 구하십시오 입력

    9
    

    출력

    1(은)는 9의 약수입니다.
    3(은)는 9의 약수입니다.
    9(은)는 9의 약수입니다.
    

    Sol

    A = int(input())
    
    for B in range(1, A + 1):
      if (A % B) == 0:
        print("{0}(은)는 {1}의 약수입니다.".format(B, A))
    

    어떤 정수 A가 어떤 정수 B의 약수이기 위해서는 B를 A로 나눈 나머지가 0이어야 한다. 즉, B % A = 0 이면 된다. 1부터 input() 값까지 모든 경우의 수에 대해 약수를 따져줘야 하므로, for문을 사용한다. 강의 진도상 아직 반복문은 안했지만 나는 이미 알고 있어.

    제출결과

    image

    연습문제 #2

    문제

    다음의 결과와 같이 임의의 양의 정수를 입력받아 그 정수의 모든 약수를 구하십시오 (단, 약수가 2개일 경우 소수임을 나타내십시오)

    입력

    5
    

    출력

    1(은)는 5의 약수입니다.
    5(은)는 5의 약수입니다.
    5(은)는 15로만 나눌 수 있는 소수입니다.
    

    Sol

    약수를 구하는 과정은 연습문제 #1과 같다. 소수를 구분하기 위해서는 다음의 과정을 거친다.

    모든 수는 1과 자신으로 나눌 수 있다. 때문에 소수이기 위해서는 1과 자신을 제외한 약수가 있으면 안되며, 이는 약수임을 표시하는 print문이 2번 발생함을 의미한다.

    때문에 print문 이전 행에 약수의 개수를 의미하는 변수의 값을 하나 높이고, 전체 for문이 다 돌았을 때, 해당 변수의 값이 2이면 소수임을 출력하는 if문을 하나 더 놓으면 될 것 같다.

    num_ys = 0
    A = int(input())
    
    for B in range(1, A + 1):
        if (A % B) == 0:
            num_ys += 1
            print("{0}(은)는 {1}의 약수입니다.".format(B, A))
    
    if num_ys == 2:
        print("{0}(은)는 1과 {0}로만 나눌 수 있는 소수입니다.".format(A))
    

    제출결과

    image

    출력문에 (은) 을 넣지 않아서 fail이 떴다. 출력 양식을 잘 확인하자. 아니면 출력문을 그대로 긁어서 해당 숫자 부분에 인자만 바꿔넣는 식으로 하던가ㅠㅠ


    연습문제 #3

    문제

    다음의 결과와 같이 입력된 영어 알파벳 문자에 대해 대소문자를 구분하는 코드를 작성하십시오.

    입력

    b
    

    출력

    b 는 소문자 입니다.
    

    Sol

    ASCII 코드의 비트 수를 계산하는 함수인 ord() 함수를 쓰면 될 것 같다. 영어 대문자 A ~ Z는 65에서 90, 소문자 a ~ z는 97에서 122이다.

    alpha = input()
    alpha_num = ord(alpha)
    
    if 65 <= alpha_num <= 90:
        print("{0} 는 대문자 입니다.".format(alpha))
    elif 97 <= alpha_num <= 122:
        print("{0} 는 소문자 입니다.".format(alpha))
    

    제출결과

    image

    연습문제 #4

    문제

    다음의 결과와 같이 가상의 두 사람이 가위 바위 보 중 하나를 내서 승패를 가르는 가위 바위 보 게임을 작성하십시오.

    이 때 ["가위", "바위", "보"] 리스트를 활용합니다.

    • 입력

      • 두 줄에 ["가위", "바위", "보"] 중 하나가 차례로 주어진다.
    • 출력

      • 첫 번째 사람은 Man1, 두 번째 사람은 Man2라고 하고, 이긴 사람의 결과를 출력한다.
      • 예를 들어, Man1이 이겼을 경우 Result : Man1 Win! 이라고 출력한다.
      • 단, 비긴 경우는 Result : Draw 라고 출력한다.

    입력

    바위
    가위
    

    출력

    Result : Man1 Win!
    

    Sol

    A in lst 를 사용해 "가위", "바위", "보" 가 아닌 (lst의 항목들이 아닌) input()의 경우 "Result = 입력 오류" 의 메세지를 출력하게 하였다.

    lst = ["가위", "바위", "보"]
    Man1 = input()
    Man2 = input()
    
    if not ((Man1 in lst) and (Man2 in lst)):
        Result = "입력 오류"
    elif Man1 == Man2:
        Result = "Draw"
    elif Man1 == lst[0]:
    
        if Man2 == lst[1]:
            Result = "Man2 Win!"
        elif Man2 == lst[2]:
            Result = "Man1 Win!"
    elif Man1 == lst[1]:
    
        if Man2 == lst[0]:
            Result = "Man1 Win!"
        elif Man2 == lst[2]:
            Result = "Man2 Win!"
    elif Man2 == lst[2]:
    
        if Man2 == lst[0]:
            Result = "Man1 Win!"
        elif Man2 == lst[1]:
            Result = "Man2 Win!"
    
    print("Result : " + Result)
    

    lst를 활용해야 했기 때문에 하드코딩했는데, 조금 더 효율적인 방법이 없을까 생각해보았지만, 생각이 들지 않았다.

    제출결과

    image

    Pass는 했지만 다소 아쉬움이 남는 풀이였다.


    연습문제 #5

    문제

    다음의 결과와 같이 입력된 문자가 대문자일 경우 소문자로, 소문자일 경우 대문자로 변경하고, 알파벳이 아닐 경우엔 그냥 출력하는 코드를 작성하십시오. 출력 시 아스키코드를 함께 출력합니다.

    입력

    c
    

    출력

    c(ASCII: 99) => C(ASCII: 67)
    

    Sol A

    우선 대문자 A는 65, 소문자 a는 97로 대문자와 소문자의 ASCII코드 숫자의 간격은 32이다. 이를 이용해보자.

    alpha = input()
    
    if len(alpha) == 1:
        alpha_num = ord(alpha)
    else:
        alpha_num = 0
    
    # 소문자 -> 대문자
    if 97 <= alpha_num <= 122:
        print("%c(ASCII: %d) = > %c(ASCII: %d)" %
              (alpha, alpha_num, alpha_num - 32, alpha_num - 32))
    # 대문자 -> 소문자
    elif 65 <= alpha_num <= 90:
        print("%c(ASCII: %d) = > %c(ASCII: %d)" %
              (alpha, alpha_num, alpha_num + 32, alpha_num + 32))
    # 기타
    else:
        print(alpha)
    

    Terminal에서 결과는 원하는대로 나왔는데, 자꾸 fail이 나왔다. 뭐가 잘못된건지 모르겠다.

    Sol B

    대문자와 소문자로 만들어주는 upper() 함수와 lower() 함수, 그리고 이들이 대문자인지 소문자인지를 확인하는 isupper() 함수와 islower()함수를 활용해보자.

    alpha = input()
    
    if len(alpha) > 1:
        print(alpha)
    elif alpha.islower():
        print("%c(ASCII: %d) = > %c(ASCII: %d)" %
              (alpha, ord(alpha), alpha.upper(), ord(alpha.upper())))
    elif alpha.isupper():
        print("%c(ASCII: %d) = > %c(ASCII: %d)" %
              (alpha, ord(alpha), alpha.lower(), ord(alpha.lower())))
    else:
        print(alpha)
    

    제출결과

    이번에도 fail이 떴다. %c 를 %s 로도 바꿔보고 다 해봤고, 결과도 문제에서 요구하는대로 나오는데 왜 안 될까 싶다.

    Sol C (22.01.02.)

    alpha = input()
    
    if 'a' <= alpha <= 'z':     # alpha가 소문자일 경우
        print("{0}(ASCII: {1}) => {2}(ASCII: {3})".format(
            alpha, ord(alpha), alpha.upper(), ord(alpha.upper())))
    elif 'A' <= alpha <= 'Z':  # alpha가 대문자일 경우
        print("{0}(ASCII: {1}) => {2}(ASCII: {3})".format(
            alpha, ord(alpha), alpha.lower(), ord(alpha.lower())))
    else:   # alpha가 소문자/대문자 가 아닌 경우
        print(alpha)
    

    범위를 나누고 입력값인 alpha를 'a'와 'z' 사이, 즉 아스키코드 숫자로 비교하는 식으로 작성하였다. islower(), isupper() 함수보다 훨씬 쉬운 것 같다. str.fotmat()을 이용해 해당하는 자리에 .upper(), .lower() 함수를 이용했다.

    제출결과

    image

    연습문제 #7

    문제

    1~200 사이의 정수 가운데 7의 배수이면서 5의 배수는 아닌 모든 숫자들을 찾아 콤마(,)로 구분된 문자열을 구성해 출력하는 프로그램을 작성하십시오.

    출력

    7,14,21,28,42,49,56,63,77,84,91,98,112,119,126,133,147,154,161,168,182,189,196
    

    Sol

    논리곱으로 선별하면 될 것 같다. 만약 입력한 수를 num이라고 한다면,

    1. num % 7 == 0
    2. num % 5 != 0

    인 것이다.

    처음엔 list에 각 요소들을 .append() 함수를 이용해 넣어서 한 번에 출력하려 했는데, list의 대괄호가 출력에 같이 나오게 되어 새롭게 짤 필요가 있었다.

    %- formating와 문자열 접합을 이용할 것이다.

    result = ""
    
    for i in range(1, 200):
        if ((i % 7 == 0) and (i % 5 != 0)):
            result += "%d," % i
    
    print(result[0:len(result)-1])
    

    맨 뒤의 반점을 제거하기 위해서 len(result)로 전체 길이를 확인하고, 이 길이보다 하나 모자르게 출력했다.

    제출결과

    image

    연습문제 #8

    문제

    100~300 사이의 숫자에서 각각의 자리 숫자가 짝수인 숫자를 찾아 콤마(,)로 구분해 출력하는 프로그램을 작성하십시오.

    출력

    200,202,204,206,208,220,222,224,226,228,240,242,244,246,248,260,262,264,266,268,280,282,284,286,288
    

    Sol

    Python의 Slicing을 이용해보자. Slicing은 문자열을 index를 이용해 잘라내는 것이다.

    result = ""
    
    for i in range(100, 300):
        i_s = str(i)
        if((int(i_s[0]) % 2 == 0) and (int(i_s[1]) % 2 == 0) and (int(i_s[2]) % 2 == 0)):
            # result += "%d," % i
            result += "%d," % i
    
    print(result[0:len(result)-1])
    
    • 각각의 i를 str()에 넣어 슬라이싱이 가능한 문자형으로 바꾸어준다.
    • i_s[0] 등 index로 슬라이싱한 각각은 문자형이므로 int() 안에 넣어 숫자형으로 바꿔 % 2 연산이 가능하게 한다.
    • 초기화한 result에 각각의 값을 넣은 뒤, len과 index로 맨 뒤의 반점을 제외하여 출력한다.

    제출결과

    image
    profile

    FE Developer 박승훈

    노력하는 자는 즐기는 자를 이길 수 없다