본문 바로가기
Python/점프 투 파이썬

종합문제 (2)

by k-mozzi 2021. 9. 17.
반응형
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과 매치되는 문자열은 무엇일까?

 

  1. acccb
  2. a....b
  3. aaab
  4. 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

 

728x90
반응형

'Python > 점프 투 파이썬' 카테고리의 다른 글

파이썬 복습  (0) 2022.01.01
파이썬 기초 마무리  (0) 2021.09.26
종합문제 (1)  (0) 2021.09.16
정규 표현식 (2)  (0) 2021.09.14
정규 표현식 (1)  (0) 2021.09.13

댓글