Wisdom’s Cloud

[PYTHON] 15. 파이썬 Final 20제 본문

PYTHON

[PYTHON] 15. 파이썬 Final 20제

지혜로운지혜쓰 2021. 3. 3. 23:14

지금까지 배운 내용들을 Final 20제를 통해서 마지막으로 점검해보도록 하자!!


 

 

Q1 문자열 바꾸기

# 다음과 같은 문자열이 있다.
a:b:c:d
# 문자열의 split와 join 함수를 사용하여 위 문자열을 다음과 같이 고치시오.
a#b#c#d
>>> a = "a:b:c:d"
>>> b = a.split(":")
>>> b
['a', 'b', 'c', 'd']
>>> c = "#".join(b)
>>> c
'a#b#c#d'

 

 

Q2 딕셔너리 값 추출하기

# 다음은 딕셔너리의 a에서 'C'라는 key에 해당하는 value를 출력하는 프로그램이다.
>>> a = {'A':90, 'B':80}
>> a['C']
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
KeyError: 'C'
# a 딕셔너리에는 'C'라는 key가 없으므로 위와 같은 오류가 발생한다.
# 'C'에 해당하는 key 값이 없을 경우 오류 대신 70을 얻을 수 있도록 수정하시오.
>>> a = {'A':90, 'B':80}
>>> a.get('C', 70)
70

 

 

Q3 리스트의 더하기와 extend 함수

# 다음과 같은 리스트 a가 있다.
>>> a = [1, 2, 3]
# 리스트 a에 [4, 5]를 + 기호를 사용하여 더한 결과는 다음과 같다.
>>> a = [1, 2, 3]
>>> a = a + [4, 5]
>>> a
[1, 2, 3, 4, 5]
# 리스트 a에 [4, 5]를 extend를 사용하여 더한 결과는 다음과 같다.
>>> a = [1, 2, 3]
>>> a.extend([4, 5])
>>> a
[1, 2, 3, 4, 5]
# + 기호를 사용하여 더한 것과 extend한 것의 차이점이 있을까? 있다면 그 차이점을 설명하시오.
>>> a = [1, 2, 3]
>>> id(a)
4302342807
>>> a = a + [4, 5]
>>> id(a)
4302347216
# 주소 값이 다르기 때문에 +를 사용하면 리스트 a의 값이 변하는 것이 아니라
# 두 리스트가 더해진 새로운 리스트가 반환된다는 것을 확인할 수 있다.
>>> a = [1, 2, 3]
>>> id(a)
4302348543
>>> a.extend([4, 5])
>>> id(a)
4302348543
# + 기호를 사용하여 더한 경우와는 달리 주소 값이 변하지 않고 그대로 유지되는 것을 확인할 수 있다.

 

 

Q4 리스트 총합 구하기

# 다음은 A 학급 학생의 점수를 나타내느 리스트이다.
# 다음 리스트에서 50점 이상 점수의 총합을 구하시오.
A = [20, 55, 67, 82, 45, 33, 90, 87, 100, 25]
A = [20, 55, 67, 82, 45, 33, 90, 87, 100, 25]

result = 0
while A:
   mark = A.pop()
   if mark >= 50:
      result += mark
      
print(result)

 

 

Q5 피보나치 함수

# 첫 번째 항의 값이 0이고 두 번째 항의 값이 1일 때,
# 이후에 이어지는 항은 이전의 두 항을 더한 값으로 이루어지는 수열을 피보나치 수열이라고 한다.
0, 1, 1, 2, 3, 5, 8, 13, ...
# 입력을 정수 n으로 받았을 때, n 이하까지의 피보나치 수열을 출력하는 함수를 작성해 보자.
def fibo(n):
   if n == 0 : return 0
   if n == 1 : return 1
   return fibo(n-2) + fibo(n-1)

 

 

Q6 숫자의 총합 구하기

# 사용자로부터 다음과 같은 숫자를 입력받아 입력받은 숫자의 총합을 구하는 프로그램을 작성하시오.
# 단 숫자는 콤마로 구분하여 입력한다.
65, 45, 2, 3, 45, 8
user_input = input("숫자를 입력하세요: ")
numbers = user_input.split(",")

total = 0
for number in numbers:
   total += int(number)

print(total)

 

 

Q7 한 줄 구구단

# 사용자로부터 2~9의 숫자 중 하나를 입력받아 해당 숫자의 구구단을 한 줄로 출력하는 프로그램을 작성하시오.
구구단을 출력할 숫자를 입력하세요(2~9): 2
2 4 6 8 10 12 14 16 18
user_input = input("구구단을 출력할 숫자를 입력하세요(2~9): ")
dan = int(user_input)
for i in range(1, 10):
   print(i*dan, end=' ')

 

Q8 역순 저장

# 다음과 같은 내용의 파일 abc.txt가 있다.
AAA
BBB
CCC
DDD
EEE
# 이 파일의 내용을 다음과 같이 역순으로 바꾸어 저장하시오.
EEE
DDD
CCC
BBB
AAA
f = open('abc.txt', 'r')
lines = f.readlines()
f.close()

lines.reverse()

f = open('abc.txt', 'w')
for line in lines:
   line = line.strip()
   f.write(line)
   f.write('\n')
f.close()

 

 

Q9 평균값 구하기

# 다음과 같이 총 10줄로 이루어진 sample.txt 파일이 있다.
# sample.txt 파일의 숫자 값을 모두 읽어 총합과 평균 값을 구한 후
# 평균 값을 result.txt 파일에 쓰는 프로그램을 작성하시오.
70
60
55
75
95
90
80
80
85
100
f = open("sample.txt")
lines = f.readlines()
f.close()

total = 0
for line in lines:
   score = int(line)
   total += score
avg = total / len(lines)

f = open("result.txt", "w")
f.write(str(avg))
f.close()

 

 

Q10 사칙연산 계산기

# 다음과 같이 동작하는 클래스 Calculator를 작성하시오.
>>> cal1 = Calculator([1, 2, 3, 4, 5])
>>> cal1.sum()
15
>>> cal1.avg()
3.0
>>> cal2 = Calculator([6, 7, 8, 9, 10])
>>> cal2.sum()
40
>>> cal2.avg()
8.0
class Calulator:
   def __init__(self, numberList):
      self.numberList = numberList
      
   def add(self):
      result = 0
      for num in self.numberList:
         result += num
      return result
      
   def avg(self):
      total = self.add()
      return total / len(self.numberList)

 

 

Q11 모듈 사용 방법

# C:\doit 디렉터리에 mymod.py 파이썬 모듈이 있다고 가정해 보자.
# 명령 프롬프트 창에서 파이썬 셸을 열어 이 모듈을 import해서 사용할 수 있는 방법을 모두 기술하시오.
# 즉 다음과 같이 import mymod를 수행할 때 오류가 없어야 한다.
>>> import mymod
>>> 
# 1) sys 모듈 사용하기
>>> import sys
>>> sys.path.append("C:/doit")
>>> import mymod

# 2) PYTHONPATH 환경 변수 사용하기
C:\Users\home> set PYTHOPATH=C:\doit
C:\Users\home> python
>>> import mymod

# 3) 현재 디렉터리 사용하기
C:\Users\home> cd C:\doit
C:\doit> python
>>> import mymod

 

 

Q12 오류와 예외 처리

# 다음 코드의 실행 결과를 예측하고 그 이유에 대해 설명하시오.
result = 0
try:
   [1, 2, 3][3]
   "a"+1
   4 / 0
except TypeError:
   result += 1
except ZeroDivisionError:
   result += 2
except IndexError:
   result += 3
finally:
   result += 4
   
print(result)
1. result의 초깃값은 0이다.
2. try문 안의 [1, 2, 3][3]이라는 문장 수행 시 IndexError가 발생하여 except IndexError: 구문으로 이동하게 되어 result에 3이 더해져 3이 된다.
3. 최종적으로 finally 구문이 실행되어 result에 4가 더해져 7이 된다.
4. print(result)가 수행되어 result의 최종 값인 7이 출력된다.

 

 

Q13 DashInsert 함수

# DashInsert 함수는 숫자로 구성된 문자열을 입력받은 뒤 문자열 안에 홀수가 연속되면 두 수 사이에 -를 추가하고,
# 짝수가 연속되면 *를 추가하는 기능을 갖고 있다. DashInsert 함수를 완성하시오.
입력 예시: 4546793
출력 예시: 454*67-9-3
data = "4546793"

numbers = list(map(int, data))				# 숫자 문자열을 숫자 리스트로 변경
result = []

for i, num in enumerate(numbers):
   result.append(str(num))
   if i < len(number)-1:				# 다음 수가 있다면
      is_odd = num % 2 == 1				# 현재가 홀수
      is_nett_odd = numbers[i+1] % 2 == 1		# 다음 수가 홀수
      if is_odd and is_next_odd:			# 연속 홀수
         result.append("-")
      elif not is_odd and not is_next_odd:		# 연속 짝수
         result.append("*")
         
print("".join(result))

 

 

Q14 문자열 압축하기

# 문자열을 입력받아 같은 문자가 연속적으로 반복되는 경우에 그 반복 횟수를 표시해 문자열을 압축하여 표시하시오.
입력 예시: aaabbcccccca
출력 예시: a3b2c6a1
def compress_string(s):
   _c = ""
   cnt = 0
   result = ""
   
   for c in s:
      if c!=_c:
         _c = c
         if cnt: result += str(cnt)
         result += c
         cnt = 1
      else:
         cnt += 1
         
   if cnt: result += str(cnt)
   return result

 

 

Q15 Duplicate Numbers

# 0~9의 문자로 된 숫자를 입력받았을 때, 이 입력값이 0~9의 모든 숫자를 각각 한 번씩만 사용한 것인지 확인하는 함수를 작성하시오.
입력 예시: 0123456789 01234 01234567890 6789012345 012322456789
출력 예시: true false false true false
def chkDupNum(s):
   reuslt = []
   
   for num in s:
      is num not in result:
         result.append(num)
      else:
         return False
      
   return len(result) == 10

 

 

Q16 모스 부호 해독

# 문자열 형식으로 입력받은 모스 부호(dot: . dash: -)를 해독하여 영어 문장으로 출력하는 프로그램을 작성하시오.
# 글자와 글자 사이는 공백 1개, 단어와 단어 사이는 공백 2개로 구분한다.
# 예를 들어 다음 모스 부호는 "HE SLEEPS EARLY"로 해석해야 한다.
.... .  ... .-.. . . .--. ...  . .- .-. .-.. -.--
문자 부호 문자 부호
A .- N -.
B -... O ---
C -.-. P .--.
D -.. Q --.-
E . R .-.
F ..-. S ...
G --. T -
H .... U ..-
I .. V ...-
J .--- W .--
K -.- X -..-
L .-.. Y -.--
M -- Z --..
dic = {
	'.-':'A', '-...':'B', '-.-.':'C', '-..':'D', '.':'E', '..-.':'F',
    '--.':'G', '....':'H', '..':'I', '.---':'J', '-.-':'K', '.-..':'L',
    '--':'M', '-.':'N', '---':'O', '.--.':'P', '--.-':'Q', '.-.':'R',
    '...':'S', '-':'T', '..-':'U', '...-':'V', '.--':'W', '-..-':'X',
    '-.--':'Y', '--..':'Z'
 }
 
 def morse(src):
    result = []
    
    for word in src.split("  "):
       for char in word.split(" "):
          result.append(dic[char])
       result.append(" ")
       
    return "".join(result)

 

 

Q17 기초 메타 문자

# 다음 중 정규식 a[.]{3,}b과 매치되는 문자열은 무엇일까?
1. accb
2. a....b
3. aaab
4. a.cccb
2번

 

 

Q18 문자열 검색

# 다음 코드의 결괏값은 무엇일까?
>>> import re
>>> p = re.compile("[a-z]+")
>>> m = p.search("5 python")
>>> m.start() + m.end()
2 + 8 = 10

 

 

Q19 그루핑

# 다음과 같은 문자열에서 휴대폰 번호 뒷자리인 숫자 4개를 ####로 바꾸는 프로그램을 정규식을 사용하여 작성하시오.
"""
park 010-9999-9988
kim 010-9909-7789
lee 010-8789-7768
"""
import re

s = """
park 010-9999-9988
kim 010-9909-7789
lee 010-8789-7768
"""

pat = re.compile("(\d{3}[-]\d{4})[-]\d{4}")
result = pat.sub("\g<1>-####", s)

print(result)

 

 

Q20 전방 검색

# 다음은 이메일 주소를 나타내는 정규식이다.
# 이 정규식은 park@naver.com, kim@daum.net, lee@myhome.co.kr 등과 매치된다.
# 긍정형 전방 탐색 기법을 사용하여 .com, .net이 아닌 이메일 주소는 제외시키는 정규식을 작성하시오.
.*[@].*[.]*$
import re

pat = re.compile(".*[@].*[.](?=com$|net$).*$")

print(pat.match("park@naver.com"))
print(pat.match("kim@daum.net"))
print(pat.match("lee@myhome.co.kr"))

'PYTHON' 카테고리의 다른 글

[PYTHON] 14. 정규 표현식  (0) 2021.03.03
[PYTHON] 13. 파이썬으로 간단한 프로그램 만들기  (0) 2021.02.26
[PYTHON] 12. 외장 함수  (0) 2021.02.25
[PYTHON] 11. 내장 함수  (0) 2021.02.25
[PYTHON] 10. 예외 처리  (0) 2021.02.24