Coding Test/초보자를 위한 파이썬 300제

[독학 파이썬] 초보자를 위한 파이썬 300제 풀이(121~130)_12.19

Klay_J 2022. 12. 19. 22:58

안녕하세요. Harry입니다.

 

현재 풀이중인 초보자를 위한 파이썬 300제 풀이를 진행하면서 나름대로 파악했던 문제 출제 의도와 풀이를 작성했습니다.

모든 풀이는 직접 Pycharm을 통해 에러없이 출력됨을 확인 후 작성했습니다.

 

초보자를 위한 파이썬 300제 풀이는 Wikidocs에 무료로 배포된 전자책을 활용했습니다/

https://wikidocs.net/book/922

[학습목표]

1. 각 문제별 요구하는 역량(출제의도)이 무엇인지 파악할 수 있다.

2. 각 문제별 요구하는 기술 및 기능을 활용하여 문제를 해결할 수 있다.

 

121 ~ 130

121

사용자로부터 문자 한 개를 입력 받고, 소문자일 경우 대문자로, 대문자 일 경우, 소문자로 변경해서 출력하라.

- 요구역량 : 대/소문자 구분 함수를 활용하여 입력 문자의 대소문자여부에 따라 원하는 출력값을 출력할 수 있는가?

힌트가 없었다면 못 풀었을 문제입니다. a.islower() 함수는 처음 배웠습니다.

그럼에도 불구하고, If문 문법에 맞추어 정확하게 구현했습니다.

>> a
A

힌트-1 : islower() 함수는 문자의 소문자 여부를 판별합니다. 만약 소문자일 경우 True, 대문자일 경우 False를 반환합니다. 힌트-2 : upper() 함수는 대문자로, lower() 함수는 소문자로 변경합니다.

 정답확인

a = input(" ")
if a.islower():
    print(a.upper())
else:
    print(a.lower())

122

점수 구간에 해당하는 학점이 아래와 같이 정의되어 있다. 사용자로부터 score를 입력받아 학점을 출력하라.

- 요구역량 : if문을 활용하여 입력받은 값에 따라 특정 출력값을 제시할 수 있는가?

점수 학점
81~100 A
61~80 B
41~60 C
21~40 D
0~20 E
>> score: 83
grade is A

 정답확인

a = input("score: ")
if 81 <= int(a) <= 100 :
    print("A")
elif 61 <= int(a) <= 80 :
    print("B")
elif 41 <= int(a) <= 60 :
    print("C")
elif 21 <= int(a) <= 40 :
    print("D")
elif 0<= int(a) <= 20 :
    print("E")
    
#답지 / 마지막에 else로 마무리
score = input("score: ")
score = int(score)
if 81 <= score <= 100:
    print("grade is A")
elif 61 <= score <= 80:
    print("grade is B")
elif 41 <= score <= 60:
    print("grade is C")
elif 21 <= score <= 40:
    print("grade is D")
else:
    print("grade is E")

123

사용자로부터 달러, 엔, 유로, 또는 위안 금액을 입력받은 후 이를 원으로 변환하는 프로그램을 작성하라. 각 통화별 환율은 다음과 같다. 사용자는 100 달러, 1000 엔, 13 유로, 100 위안과 같이 금액과 통화명 사이에 공백을 넣어 입력한다고 가정한다.

- 요구역량 : 딕셔너리를 활용하여 입력값에 따라 특정 키와 특정 숫자를 곱하여 출력할 수 있는가?

처음으로 답지와 제가 아예 다른 방향으로 풀이를 했던 문제입니다. (물론 풀이 영상에서는 저와 똑같이 풀었더군요)

저는 If/elif를 연속적으로 활용하여 입력값의 특징(뒷자리에 '엔'이냐,'달러'냐 등등)에 따라 일일이 출력값을 지정한 반면, 답지는 딕셔너리를 활용하여 손쉽게 문제를 해결했습니다. 추후 값의 추가나 삭제등을 활용할 때는 딕셔너리를 활용한 답지의 풀이가 더 이상적이라고 판단합니다.

통화명 환율
달러 1167
1.096
유로 1268
위안 171
>> 입력: 100 달러
116700.00 원

 정답확인

a = input("입력: ")
if a[-2:] == "달러":
    print((int(a[:-3])*1167.00) ,"원")
elif a[-1:] == "엔":
    print(int(a[:-2])*1.096 , "원")
elif a[-2:] == "유로":
    print(int(a[:-3])*1268, "원")
elif a[-2:] == "위안":
    print(int(a[:-3]) * 171, "원")
    
#답지
환율 = {"달러": 1167, 
        "엔": 1.096, 
        "유로": 1268, 
        "위안": 171}
user = input("입력: ")
num, currency = user.split()
print(float(num) * 환율[currency], "원")

124

사용자로부터 세 개의 숫자를 입력 받은 후 가장 큰 숫자를 출력하라.

- 요구역량 : if문을 활용하여 3개 숫자 비교 후 출력할 수 있는가?

and를 활용할 줄 알아야하는데, 저는 이부분을 놓치고 있었습니다. 좀만 생각하면 쉽게 떠올릴 수 있는 개념인데,,아직 개념적으로 부족한 부분이 많다고 생각합니다.

>> input number1: 10
>> input number2: 9
>> input number3: 20
20

 정답확인

a = input("input number1: ")
b = input("input number2: ")
c = input("input number3: ")
if int(a) > int(b) and int(c):
    print(a)
elif int(b) > int(c) and int(a):
    print(b)
else:
    print(c)

125

휴대폰 번호 앞자리에 따라 통신사는 아래와 같이 구분된다. 사용자로부터 휴대전화 번호를 입력 받고, 통신사를 출력하는 프로그램을 작성하라. 

- 요구역량 : if문을 활용하여 사용자 입력에 따라 특정 문구를 출력할 수 있는가?

답지에서는 split함수를 활용하여 - 를 기준으로 구분하였습니다. 또한 if문 실행 문장을 print가 아닌, 특정 변수로 지정한 후 마지막에 print문을 활용하여 출력하는 방식을 활용하였습니다. 일일이 저처럼 하나씩 출력하는 방식보단, 답지의 방식이 더 효율적으로 느껴집니다.

011 SKT
016 KT
019 LGU
010 알수없음
>> 휴대전화 번호 입력: 011-345-1922
당신은 SKT 사용자입니다.

 정답확인

b = input("전화번호를 입력하시오: ")
if b[:3] == '011':
    print('당신은 SKT 사용자입니다.')
elif b[:3] == '016':
    print('당신은 KT 사용자입니다.')
elif b[:3] == '019':
    print('당신은 LG 사용자입니다.')
else:
    print('알수없음')
    
#답지
number = input("휴대전화 번호 입력: ")
num = number.split("-")[0]
if num == "011":
    com = "SKT"
elif num == "016":
    com = "KT"
elif num == "019":
    com = "LGU"
else:
    com = "알수없음"
print(f"당신은 {com} 사용자입니다.")

126

우편번호는 5자리로 구성되는데, 앞의 세자리는 구를 나타낸다. 예를들어, 강북구의 경우 010, 011, 012 세 자리로 시작한다. 

 

  0 1 2 3 4 5 6 7 8 9
01 강북구 강북구 강북구 도봉구 도봉구 도봉구 노원구 노원구 노원구 노원구

사용자로 부터 5자리 우편번호를 입력받고 구를 판별하라

- 요구역량 : if 문과 in을 활용하여 입력받은 요소에 따라 특정 문구를 출력할 수 있는가?

>> 우편번호: 01400
도봉구

 정답확인

num = input("우편번호: ")
if num[0:3] == ["010", "011", "012"]:
    a = "강북구"
elif num[0:3] == ["013", "014", "015"]:
    a = "도봉구"
else:
    a = "노원구"
print(f"{a}")

#답지
우편번호 = input("우편번호: ")
우편번호 = 우편번호[:3]
if 우편번호 in ["010", "011", "012"]:
    print("강북구")
elif 우편번호 in ["014", "015", "016"]:
    print("도봉구")
else:
    print("노원구")

127

주민등록번호 뒷 자리 7자리 중 첫째 자리는 성별을 나타내는데, 1, 3은 남자 2, 4는 여자를 의미한다. 사용자로부터 13자리의 주민등록번호를 입력 받은 후 성별 (남자, 여자)를 출력하는 프로그램을 작성하라.

 

- 요구역량 : 입력받은 문자열의 특정부분은 슬라이싱한 후, 슬라이싱한 문자에 따라 특정값을 출력할 수 있는가?

>> 주민등록번호: 821010-1635210
남자

 정답확인

number = input("주민등록번호: ")
a = str(number.split("-")[1])
b = a[:1]
if b in ['1','3']:
    print('남자')
else:
    print('여자')
    
#답지
주민번호 = input("주민등록번호: ")
주민번호 = 주민번호.split("-")[1]
if 주민번호[0] == "1" or 주민번호[0] == "3":
    print("남자")
else:
    print("여자")

128

주민등록번호의 뒷 자리 7자리 중 두번째와 세번째는 지역코드를 의미한다. 주민 등록 번호를 입력 받은 후 출생지가 서울인지 아닌지 판단하는 코드를 작성하라

- 요구역량 : 입력받은 값이 어느 범위 내 요소에 해당하는지 파악하고, 알맞은 출력값을 제시할 수 있는가?

지역코드 출생지
00 ~ 08 서울
09 ~ 12 부산
>> 주민등록번호: 821010-1635210
서울이 아닙니다.
>> 주민등록번호: 861010-1015210
서울 입니다.

 정답확인

# 리스트 내 포함되는 요소 전부 담기
a = input("주민등록번호: ")
지역코드 = str(a.split("-")[1])
지역코드 = 지역코드[1:3]
if 지역코드 in ['00','01','02','03','04','05','06','07','08']:
    print('서울 입니다.')
else:
    print('서울이 아닙니다.')
    
# 숫자형으로 바꾸고 범위 계산하여 넣기
a = input("주민등록번호: ")
지역코드 = str(a.split("-")[1])
지역코드 = int(지역코드[1:3])
if 0 <= 지역코드 <= 8:
    print('서울 입니다.')
else:
    print('서울이 아닙니다.')
    
# 답지
주민번호 = input("주민등록번호: ")
뒷자리 = 주민번호.split("-")[1]
if 0 <= int(뒷자리[1:3]) <= 8:
    print("서울입니다.")
else:
    print("서울이 아닙니다.")

 

129

주민등록번호는 13자리로 구성되는데 마지막 자리수는 주민등록번호의 유효성을 체크하는데 사용된다. 먼저 앞에서부터 12자리의 숫자에 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5를 차례로 곱한 뒤 그 값을 전부 더한다. 연산 결과 값을 11로 나누면 나머지가 나오는데 11에서 나머지를 뺀 값이 주민등록번호의 마지막 번호가 된다.

  8 2 1 0 1 0 - 1 6 3 5 2 1 0
x 2 3 4 5 6 7   8 9 2 3 4 5 
-----------------------------
1차 계산: (8*2 + 2*3 + 1*4 + 0*5 + 1*6 + 0*7 + 1*8 + 6*9 + 3*2 + 5*3 + 2*4 + 1*5) = (128 % 11) = 7
2차 계산: 11 -7 = 4

위와 같이 821010-1635210에 대해서 계산을 해보면 마지막 자리는 4가 되어야 함을 알 수 있다. 즉, 821010-1635210은 유효하지 않은 주민등록번호임을 알 수 있다.

다음과 같이 사용자로부터 주민등록번호를 입력받은 후 주민등록번호가 유효한지를 출력하는 프로그램을 작성하라.

- 요구역량 : 입력받은 문자열을 일일이 인덱싱하여 계산한 값과 문자열 내 특정값이 일치함을 증명할 수 있는가?

 

설마 입력한 값을 하나하나 다 인덱싱한 후 int로 변경하여 곱하고 비교해야하나,,,? 라는 반신반의,,+ 노가다의 의심과 함께 작성했으나 답지도 그렇게 한걸보고,,,당황

>> 주민등록번호: 821010-1635210
유효하지 않은 주민등록번호입니다. 

 정답확인

a = input("주민등록번호: ")
b = (int(a[0])*2 + int(a[1])*3 + int(a[2])*4 + int(a[3])*5 + int(a[4])*6 + int(a[5])*7 + int(a[7])*8 + int(a[8])*9 + int(a[9])*2 + int(a[10])*3 + int(a[11])*4 + int(a[12])*5)
check = (11 - (b % 11))
if check == int(a[-1]):
    print("유효한 주민번호입니다.")
else:
    print("유효하지 않은 주민번호입니다.")
    
#답지
num = input("주민등록번호: ")
계산1 = int(num[0]) * 2 + int(num[1]) * 3 + int(num[2]) * 4 + int(num[3]) * 5 + int(num[4]) * 6 + \
        int(num[5]) * 7 + int(num[7]) * 8 + int(num[8]) * 9 + int(num[9]) * 2 + int(num[10])* 3 + \
        int(num[11])* 4 + int(num[12]) * 5
계산2 = 11 - (계산1 % 11)
계산3 = str(계산2)

if num[-1] == 계산3[-1]:
    print("유효한 주민등록번호입니다.")
else:
    print("유효하지 않은 주민등록번호입니다.")

130

아래 코드는 비트코인의 가격 정보를 딕셔너리로 가져오는 코드이다. 

import requests
btc = requests.get("https://api.bithumb.com/public/ticker/").json()['data']

btc 딕셔너리 안에는 시가, 종가, 최고가, 최저가 등이 저장되어 있다. 최고가와 최저가의 차이를 변동폭으로 정의할 때 (시가 + 변동폭)이 최고가 보다 높을 경우 "상승장", 그렇지 않은 경우 "하락장" 문자열을 출력하라.

- 요구역량 : 딕셔너리 내의 값을 실수값으로 변경하여 연산할 수 있는가?

key Name Description
opening_price 최근 24시간 내 시작 거래금액
closing_price 최근 24시간 내 마지막 거래금액
min_price 최근 24시간 내 최저 거래금액
max_price 최근 24시간 내 최고 거래금액

 정답확인

#답지
import requests
btc = requests.get("https://api.bithumb.com/public/ticker/").json()['data']

변동폭 = float(btc['max_price']) - float(btc['min_price'])
시가 = float(btc['opening_price'])
최고가 = float(btc['max_price'])

if (시가+변동폭) > 최고가:
    print("상승장")
else:
    print("하락장")

아래는 내가 쓴 오답이다.

나는 dict.values(인덱스 번호)를 하면 각 인덱스에 해당하는 밸류를 출력할 줄 알았는데,,,저 메서드 내 괄호에는 아무것도 들어가지 않는단다...어렵고 어려운 메서드의 세계...

 

#오답!!
import requests
btc = requests.get("https://api.bithumb.com/public/ticker/").json()['data']
price = float(btc.values(0)) + float(btc.values(3))-float(btc.values(2))
if price > float(btc.values(3)):
    print("상승장")
else:
    print("하락장")
    
#오답인 이유
    price = float(btc.values(0)) + float(btc.values(3))-float(btc.values(2))
TypeError: dict.values() takes no arguments (1 given)

감사합니다.