Preface
이번 문제를 끝으로 위키독스의 '점프 투 파이썬' 공부를 모두 마쳤다.
그동안 어려운 부분이 있어도 나름 재미있게 진도를 나갈 수 있었지만, 오늘 처음으로 문제를 풀며 자신감을 잃었다.
이전에 풀었던 문제들은 대부분 해설을 보지 않고 혼자 힘으로 해결할 수 있었는데, 이번 종합문제에 수록된 몇몇 문제들은 아무리 고민해봐도 도저히 해결 방법이 떠오르지 않아 손도 댈 수 없었다.
평소엔 항상 무엇이든 할 수 있다는 자신감을 갖고 공부에 임했지만, 혼자 힘으로 해결할 수 없는 상황이 닥치자 지난 한달 간의 노력이 물거품이 된 것 같고 의미없는 공부를 한 것 같다는 생각도 들었다.
그래도 포기는 하지 않을 생각이다.
처음 배우는 내용으로 한달만에 원하는 코드를 작성할 수 있다면 누구나 개발자가 될 수 있지 않았을까.
적어도 1년 이상 노력해 본 후 이쪽 일에 정말 재능이 없다고 느껴지면 그때 자책하자.
추석 이후엔 파이썬을 통해 자료구조와 알고리즘을 공부할 계획이다.
새로운 내용에 들어가기 전, 파이썬 문법 중 어려웠던 부분과 연습문제들을 복습하며 부족한 내용을 보충할 시간이 필요할 것 같다.
마지막으로, 남들보다 늦게 시작한 만큼 더욱 노력해야 한다는 사실을 항상 잊지 말자.
10. 다음과 같이 동작하는 클래스 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, first, second, third, fourth, fifth):
self.first = first
self.second = second
self.third = third
self.fourth = fourth
self.fifth = fifth
def sum(self):
result = self.first + self.second + self.third + self.fourth + self.fifth
return result
def avg(self):
total = self.sum()
result = self.sum() / 5
return result
cal1 = Calculator(1, 2, 3, 4, 5)
cal2 = Calculator(6, 7, 8, 9, 10)
print(cal1.sum())
print(cal1.avg())
print(cal2.sum())
print(cal2.avg())
→ 해설 : 나는 변수를 직접 설정했지만, 해설에선 제어문을 사용했다.
class Calculator:
def __init__(self, numberList):
self.numberList = numberList
def sum(self):
result = 0
for num in self.numberList:
result += num
return result
def avg(self):
total = self.sum()
return total / len(self.numberList)
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())
11. C:\doit 디렉터리에 mymod.py 파이썬 모듈이 있다고 가정해 보자. 명령 프롬프트 창에서 파이썬 셸을 열어 이 모듈을 import해서 사용할 수 있는 방법을 모두 기술하시오. (즉 다음과 같이 import mymod를 수행할 때 오류가 없어야 한다.)
>>> import mymod
>>>
→ 해설 참조
12. 다음 코드의 실행 결과를 예측하고 그 이유에 대해 설명하시오.
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 - IndexError가 발생하여 3을 더한 후, finally문이 실행되어 4를 더한다.
13. 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(numbers)-1: # 다음 수가 있다면
is_odd = num % 2 == 1 # 현재 수가 홀수
is_next_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))
14. 문자열을 입력받아 같은 문자가 연속적으로 반복되는 경우에 그 반복 횟수를 표시해 문자열을 압축하여 표시하시오.
입력 예시: 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
print(compress_string("aaabbcccccca")) # a3b2c6a1 출력
15. 0~9의 문자로 된 숫자를 입력받았을 때, 이 입력값이 0~9의 모든 숫자를 각각 한 번씩만 사용한 것인지 확인하는 함수를 작성하시오.
입력 예시: 0123456789 01234 01234567890 6789012345 012322456789
출력 예시: True False False True False
→ 답안
def check(n):
result = []
for num in n:
if num not in result:
result.append(num)
else:
return False
return len(result) == 10
→ 해설 : 답안과 동일
16. 문자열 형식으로 입력받은 모스 부호(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(" "):
for char in word.split(" "):
result.append(dic[char])
result.append(" ")
return "".join(result)
print(morse('.... . ... .-.. . . .--. ... . .- .-. .-.. -.--'))
17. 다음 중 정규식 a[.]{3,}b과 매치되는 문자열은 무엇일까?
- acccb
- a....b
- aaab
- a.cccb
→ 답안 : 2
18. 다음 코드의 결괏값은 무엇일까?
>>> import re
>>> p = re.compile("[a-z]+")
>>> m = p.search("5 python")
>>> m.start() + m.end()
→ 답안 : 10
19. 다음과 같은 문자열에서 휴대폰 번호 뒷자리인 숫자 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
'''
p = re.compile(r'(\w+\s+\d+[-]\d+)[-]\d+')
m = p.sub('\g<1>-####', s)
print(m)
20. 다음은 이메일 주소를 나타내는 정규식이다. 이 정규식은 park@naver.com, kim@daum.net, lee@myhome.co.kr 등과 매치된다. 긍정형 전방 탐색 기법을 사용하여 .com, .net이 아닌 이메일 주소는 제외시키는 정규식을 작성하시오.
.*[@].*[.].*$
→ 답안
import re
pat = re.compile(".*[@].*[.](?=com$|net$).*$")
print(pat.match("pahkey@gmail.com"))
print(pat.match("kim@daum.net"))
print(pat.match("lee@myhome.co.kr"))
→ 해설 : 답안과 동일
출처 : https://wikidocs.net/17114
08장 종합문제
파이썬은 웹, GUI, 네트워크, 딥러닝 등 상당히 많은 일을 할 수 있는 언어이다. 여러분이 지금까지 배운 내용을 충분히 숙지했다면 이제 이들을 향해 첫발을 내디딜 준비를 ...
wikidocs.net
'Python > 점프 투 파이썬' 카테고리의 다른 글
파이썬 복습 (0) | 2022.01.01 |
---|---|
파이썬 기초 마무리 (0) | 2021.09.26 |
종합문제 (1) (0) | 2021.09.16 |
정규 표현식 (2) (0) | 2021.09.14 |
정규 표현식 (1) (0) | 2021.09.13 |
댓글