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


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

9

출력

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

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개일 경우 소수임을 나타내십시오)

입력

5

출력

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

약수를 구하는 과정은 연습문제 #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이 떴다. 출력 양식을 잘 확인하자. 아니면 출력문을 그대로 긁어서 해당 숫자 부분에 인자만 바꿔넣는 식으로 하던가ㅠㅠ


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

입력

b

출력

b 는 소문자 입니다.

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

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

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

  • 입력

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

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

입력

바위
가위

출력

Result : Man1 Win!

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는 했지만 다소 아쉬움이 남는 풀이였다.


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

입력

c

출력

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

우선 대문자 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이 나왔다. 뭐가 잘못된건지 모르겠다.

대문자와 소문자로 만들어주는 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 로도 바꿔보고 다 해봤고, 결과도 문제에서 요구하는대로 나오는데 왜 안 될까 싶다.

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

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

논리곱으로 선별하면 될 것 같다. 만약 입력한 수를 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

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

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