본문 바로가기

Programming/Python

Do it! 공부단 11일차 | 문제 풀이 (3)

  • Q15에서부터 Q20까지의 문제를 풀었다.
  • 코드는 직접 작성하였으며 풀이와 다른 경우 표시를 해두었다.
  • 난이도는 책에서와 같이 ⭐로 표기했다(최대 3개).

 

Q15 Duplicate Numbers

#Q15 Duplicate Numbers
'''
입력값: 0-9까지의 숫자
DupNum(): 입력값이 0-9의 모든 숫자를 각각 한 번씩 사용한 것인지 확인
'''

def DupNum(x):
    x = list(map(int,x))
    x.sort()
    y = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    if x == y:
        return True
    else:
        return False

x = input('숫자를 입력하세요: ')
result = DupNum(x)
print(result)

  • 0부터 9까지 하나씩 담겨있는 리스트 y를 만들어 입력 값과 비교하는 코드를 작성했다.
  • 풀이에서는 빈 리스트를 만들고 반복문으로 중복된 값이 있는지 조사했다.

 

 

 

Q16 모스 부호 해독

#Q16 모스 부호 해독

morseCode = {'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':'--..'}
list_val = list(morseCode.values())
list_key = list(morseCode.keys())

def MorseCode(x):
    list_x = x.split(' ')
    for i in range(0, len(list_x)):
        for j in range(0, len(list_val)):
            if list_x[i] == list_val[j]:
                list_x[i] = list_key[j]
        if list_x[i] == '':
            list_x[i] = ' '
    return ''.join(list_x)

x = input('모스부호를 입력하세요: ')
result = MorseCode(x)
print(result)

  • 모스부호를 딕셔너리로 만들고 key와 value를 구분해 코드로 작성했다.
  • 풀이에서는 모스부호 입력값을 공백으로 구분하고 해당 값을 딕셔너리에서 찾는 방법을 사용했다.

 

 

 

 

Q17 기초 메타 문자

#Q17 기초 메타 문자
#정규식 a[.]{3,}b와 매치되는 문자열 맞추기

'''
a[.]b: a와 b사이에 Dot(.)문자가 있으면 매치
a[.]{3,}b: Dot(.)문자가 3이상 반복되면 매치

= 2번 a....b
'''

 

 

 

 

Q18 문자열 검색

#Q18 문자열 검색
#코드의 결괏값 예측하기

import re
p = re.compile("[a-z]+")    #a부터 z까지 1회 이상 반복
m = p.search("5 python")
print(m.start() + m.end())  #m.start()는 2(5 이후의 python과 매치), m.end()는 8

 

 

 

 

Q19 그루핑

#Q19 그루핑
#문자열에서 휴대폰 번호 뒷자리 숫자 4개 ####으로 정규식을 사용해서 바꾸기

import re

p = re.compile(r"\w+\s+\d+[-]\d+[-](\d+)")
m = p.search("lee 010-8789-7768")

test = re.sub(m.group(1), '####', "lee 010-8789-7768")
print(test)


'''
1) 문자클래스 []: [] 사이의 문자들과 매치
2) 정규 표현식
- \w : 문자+숫자와 매치, [a-zA-Z0-9_]와 동일한 표현식
- \s : whitespace 문자(space나 tab처럼 공백을 표현하는 문자)와 매치
- \d : 숫자와 매치, [0-9]와 동일한 표현식
'''

 

휴대폰 뒷자리 4개를 그룹으로 묶고 sub함수를 사용해 '####'으로 바꾸었다.

 

풀이에서의 방법은 아래와 같다.

 

#Q19 풀이
import re

s = """
park 010-0000-0000
kim 010-1111-1111
lee 010-2222-2222
"""

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

print(result)

 

 

 

Q20 전방 탐색

#Q20 긍정형 전방탐색

import re

p = re.compile(".*[@].*[.](?=com$|net$).*$")
print(p.match("ldonghae320@gmail.com"))

 

전방 탐색은 풀이를 보고 코드를 작성했다.

 

 

 


이 글은 책 『Do it! 점프 투 파이썬』을 읽은 후 작성한 글입니다.

 

Do it! 점프 투 파이썬

코딩을 처음 배우는 중·고등학생과 나만의 경쟁력을 갖추고 싶은 문과생, 소프트웨어 시대에 대비하여 새로운 스펙을 준비하려는 직장인까지! 모두 ‘점프 투 파이썬’으로 프로그래밍을 시작

www.easyspub.co.kr