Python #34 | 종합문제

신승호·2021년 4월 1일
0

Python

목록 보기
34/35
post-custom-banner

List

  • 종합문제

종합문제


Q1 문자열 바꾸기

다음과 같은 문자열이 있다.

a:b:c:d

문자열의 split와 join 함수를 사용하여 위 문자열을 다음과 같이 고치시오.

a#b#c#d

정답

>>> s
'a:b:c:d'
>>> s = "a:b:c:d"
>>> s
'a:b:c:d'
>>> s.split(":")
['a', 'b', 'c', 'd']
>>> a = s.split(":")
>>> a
['a', 'b', 'c', 'd']
>>> "#".join(a)
'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)		# key가 없을 경우에는 두 번째 매개변수로 전달된 default 값을 대신 돌려준다.
70
>> a = {'A':90, 'B':80}
>>> a
{'A': 90, 'B': 80}
>>> a["C"] = 70
>>> a
{'A': 90, 'B': 80, 'C': 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한 것의 차이점이 있을까? 있다면 그 차이점을 설명하시오.

정답

  • extend([]) 로 한것은 위치의 변화가 없음 id(a)로 확인
>> a = [1, 2, 3]
>> id(a)
140198339523456
>> a.extend([4,5])
>> a
[1, 2, 3, 4, 5]
>> id(a)
140198339523456
>> 
  • +한것은 위치가 달라짐
>> a = [1, 2, 3]
>> id(a)
140198343642112
>> a = a + [4,5]
>> a
[1, 2, 3, 4, 5]
>> id(a)
140198339524544

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]
total = 0
`
for a in A:
    if a >= 50:
        total = total + a
`
print(total)
481
A = [20, 55, 67, 82, 45, 33, 90, 87, 100, 25]
`
result = 0
while A:                # A 리스트에 값이 있는 동안
    mark = A.pop()      # A리스트의 가장 마지막 항목을 하나씩 뽑아냄
    if mark >= 50:      # 50점 이상의 점수만 더함
        result += mark
`
print(result)           # 481 출력

Q5 피보나치 함수

첫 번째 항의 값이 0이고 두 번째 항의 값이 1일 때, 이후에 이어지는 항은 이전의 두 항을 더한 값으로 이루어지는 수열을 피보나치 수열이라고 한다.

0, 1, 1, 2, 3, 5, 8, 13, ...

입력을 정수 n으로 받았을 때, n 이하까지의 피보나치 수열을 출력하는 함수를 작성해 보자.

정답

  • 피보나치 수열은 다음과 같은 순서로 결괏값을 반환한다.
fib(0) → 0 반환
fib(1) → 1 반환
fib(2) → fib(0) + fib(1) → 0 + 1 → 1 반환
fib(3) → fib(1) + fib(2) → 1 + 1 → 2 반환
fib(4) → fib(2) + fib(3) → 1 + 2 → 3 반환
fib(5) → fib(3) + fib(4) → 2 + 3 → 8 반환
...
  • ** n이 0일 때는 0을 반환, 1일 때는 1을 반환한다. n이 2 이상일 경우에는 이전의 두 값을 더하여 반환
def fib(n):
    if n == 0 : return 0          # n이 0일 때는 0을 반환
    if n == 1 : return 1          # n이 1일 때는 1을 반환
    return fib(n-2) + fib(n-1)    # n이 2 이상일 때는 그 이전의 두 값을 더하여 반환
`
for i in range(10):
    print(fib(i))

Q6 숫자의 총합 구하기

사용자로부터 다음과 같은 숫자를 입력받아 입력받은 숫자의 총합을 구하는 프로그램을 작성하시오. (단 숫자는 콤마로 구분하여 입력한다.)

65,45,2,3,45,8

정답

data = input("숫자를 입력하세요: ")
numbers = list(data.split(","))
result = 0
`
for number in numbers:
    result = result + int(number)
`
print(result)

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()  # 포함되어 있는 줄 바꿈 문자(\n) 제거를 위해 이거 안하면 한줄씩 띄우기 함
    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", 'w')
f.write("""70
60
55
75
95
90
80
80
85
100""")
f.close()
`
f = open("sample.txt", 'r')
lines = f.readlines()
f.close()
`
total = 0
for line in lines:
    total = total + int(line)		
    average = total / len(lines)	# 읽어온 라인들을 len함수로 해도 된당
`
f = open("result.txt" , "w")
f.write(str(total))			# 저장할 때 무조건 str 서서 해야한다
f.write("\n")
f.write(str(average))
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 Calculator:
    def __init__(self,numberList):
        self.numberList = numberList
`
    def sum(self):
        result = 0
        for number in self.numberList:		# in 뒤 self.numberList로 꼭 써줘야한다
            result = result + int(number)	# int로 꼭 감싸줘야한다.
        return result
`
    def avg(self):
        total = self.sum()			# 굳이 다시 수식 쓸필요없고 이거로 주자
        average = total / len(self.numberList)	# 여기서도 self.numberList로 해줘된다.
        return average
`
cal1 = Calculator([1,2,3,4,5])
print(cal1.sum())
print(cal1.avg())
`
cal2 = Calculator([6,7,8,9,10])
print(cal2.sum())
print(cal2.avg())

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 PYTHONPATH=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)

정답

7이 출력된다.
`
result의 초깃값은 0이다.
try문 안의 [1, 2, 3][3] 이라는 문장 수행 시 IndexError가 발생하여 except IndexError: 구문으로 이동하게 되어 result에 3이 더해져 3이 된다.
최종적으로 finally 구문이 실행되어 result에 4가 더해져 7이 된다.
print(result)가 수행되어 result의 최종 값인 7이 출력된다.

Q13 DashInsert 함수

DashInsert 함수는 숫자로 구성된 문자열을 입력받은 뒤 문자열 안에서 홀수가 연속되면 두 수 사이에 - 를 추가하고, 짝수가 연속되면 * 를 추가하는 기능을 갖고 있다. DashInsert 함수를 완성하시오.

입력 예시: 4546793
출력 예시: 454*67-9-3

####정답

data = "4546793"			#입력 시 " " 써서 입력 줘야함
data2 = list(map(int, data))		
result = []
`
for i, n in enumerate(data2):		#data2인거 잘 확인
    result.append(str(n))		# str() 로 n 잘 감싸줘야된다. 이건 결괏값이 사직연산하고 그런게 아니니까 str()로
    if i < len(data2)-1:		# 1을 뺴는 이유는 len하면 글자수보다 1더 많은 숫자가 나오니까
        odd = n % 2 == 1		# 
        odd2 = data2[i+1] % 2 == 1	# data2의 인덱스로 다음값을 불러오자
        if odd and odd2:
            result.append("-")
        elif not odd and not odd2:
            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 = c # 그대로 "c"
            if cnt:     # 그리고 cnt = 0 이면
                result += str(cnt)  # result에 cnt를 str로 더해 
            result += c     # 
            cnt = 1
        else:
            cnt +=1
    if cnt:
        result += str(cnt)
    return result
`
print (compress_string("aaabbcccccca"))  # a3b2c6a1 출력

Q15 Duplicate Numbers

0~9의 문자로 된 숫자를 입력받았을 때, 이 입력값이 0~9의 모든 숫자를 각각 한 번씩만 사용한 것인지 확인하는 함수를 작성하시오.
입력 예시: 0123456789 01234 01234567890 6789012345 012322456789
출력 예시: True False False True False

정답

def onetonine(x):
    result = []
    for i in x:
        if i not in result:	# 먼저 중복값이 있는지 조사 / i가 추가될때 result에 i가 없으면 추가 
            result.append(i)
        else:      		# 그 외 중복값이 있으면 (i 이미 result에 있으면) False 출력 
            return False
    if len(result) == 10: 	# 마지막으로 값이 10개 가 다 쓰였나 확인하기 위해 len으로 확인
        return True
    else:
        return False
`
print(onetonine("0123456789"))
print(onetonine("01234"))
print(onetonine("01234567890"))
print(onetonine("6789012345"))
print(onetonine("012322456789"))    
def onetonine(x):
    result = []
    for i in x:
        if i not in result: 
            result.append(i)
        else:     
            return False
    return len(result) == 10		# 이렇게 줄여써도됌..
`
print(onetonine("0123456789"))
print(onetonine("01234"))
print(onetonine("01234567890"))
print(onetonine("6789012345"))
print(onetonine("012322456789"))    

Q16 모스 부호 해독

문자열 형식으로 입력받은 모스 부호(dot:. dash:-)를 해독하여 영어 문장으로 출력하는 프로그램을 작성하시오.

글자와 글자 사이는 공백 1개, 단어와 단어 사이는 공백 2개로 구분한다.

예를 들어 다음 모스 부호는 "HE SLEEPS EARLY"로 해석해야 한다.

.... .  ... .-.. . . .--. ...  . .- .-. .-.. -.--

정답

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("  "):	# 입력되는 모스 부호 문자열(scr)을 먼저 단어와 단어사이(공백 2개) 구분
        for char in word.split(" "):    # 단어와 단어 사이 (공백 2개) 구분 후 글짜와 글짜사이 (공백 1개) 구분
            result.append(dic[char])    # 딕셔너리 내의 chr 찾아서  추가하자
        result.append(" ")		# 단어와 단어 사이에 공백 하나 줘야지
    return "".join(result)		# 리스트 형태를 문자열 형태로 합쳐서 출력
`
print(morse('.... .  ... .-.. . . .--. ...  . .- .-. .-.. -.--'))

Q17 기초 메타 문자

다음 중 정규식 a[.]{3,}b과 매치되는 문자열은 무엇일까?

acccb
a....b
aaab
a.cccb

정답

a[.]{3,}b

  • [.] : 괄호 안에있는 게
  • {3,} : 3번 이상 반복
a....b

Q18 문자열 검색

다음 코드의 결괏값은 무엇일까?

>>> import re
>>> p = re.compile("[a-z]+")	
>>> m = p.search("5 python")
>>> m.start() + m.end()

정답

>> import re
>> p = re.compile("[a-z]+")		# a부터z사이 알파벳이 1번이상 반복
>> m = p.search("5 python")		# search로 조사 그래서 문자열 전체를 보는거라 "python" 부분만 매치
>> m.start() + m.end()			# 매치부분 첫번째 인덱스와 마지막 인덱스 출력
m.start() + m.end()	
= 2 + 8
= 10

Q19 그루핑

다음과 같은 문자열에서 휴대폰 번호 뒷자리인 숫자 4개를 ####로 바꾸는 프로그램을 정규식을 사용하여 작성하시오.

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

정답

import re
p = re.compile('(9988|7789|7768)')
m = p.sub("####" ,"park 010-9999-9988")
n = p.sub("####" ,"kim 010-9909-7789")
o = p.sub("####" ,"lee 010-8789-7768")
`
print(m)
print(n)
print(o)
import re
`
phonenumbers = """
park 010-9999-9988
kim 010-9909-7789
lee 010-8789-7768
"""
`
p = re.compile("(\w+\s+\d+[-]\d+)[-]\d+")   #이렇게 해도 되고 맞춰서 만들어도 된다.여러가지 형태로 나올수 있는
m = p.sub("\g<1>-####", phonenumbers)       # sub의 안에서 그룹 불러올때는 "\g<1>"를 써라([p.group(1) 아님), 그리고 바꿀부분 따옴표로 꼭 감싸줘
`
print(m)
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
p = re.compile(".*[@].*[.](?=com$|net$).*")     # (?=...)이거 쓴 다음 ".*"이거도 써줘야함/ 왜냐하면 이게 없어진게 아니니까 
print(p.match("pahkey@gmail.com")) 		# 여기선 match()를 써줘야함..
print(p.match("kim@daum.net"))
print(p.match("lee@myhome.co.kr"))
profile
신승홉니다
post-custom-banner

0개의 댓글