2021. 4. 25. 10:34ㆍPYTHON/Do it! 점프 투 파이썬
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. +기호를 사용하여 더한 경우와는 달리 extend 함수를 사용하면 주소 값이 변하지 않고 그대로 유지된다.
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)
481
Q5. 피보나치 함수
첫 번째 항의 값이 0이고 두 번째 항의 값이 1일 때, 이후에 이어지는 항은 이전의 두 항을 더한 값으로 이루어지는 수열을 피보나치 수열이라고 한다.
0,1,1,2,3,5,8,13,...
입력을 정수 n으로 받았을 때, n이하까지의 피보나치 수열을 출력하는 함수를 작성해보자.
def fib(n):
if n==0: return 0
if n==1: return 1
return fib(n-2)+fib(n-1)
for i in range(10):
print(fib(i))
Q6. 숫자의 총합 구하기
사용자로부터 다음과 같은 숫자를 입력받아 입력받은 숫자의 총합을 구하는 프로그램을 작성하시오. (단 숫자는 콤마로 구분하여 입력한다)
65, 45, 2, 3, 45, 8
user_input=input("숫자를 입력하세요: ")
numbers=user_input.split(",")
total=0
for n in numbers:
total+=int(n)
print(total)
숫자를 입력하세요: 65,45,2,3,45,8
168
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
average=total/len(lines)
f=open("result.txt", "w")
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 num in self.numberList:
result+=num
return result
def avg(self):
total=self.add()
return tatal/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())
Q11. 모듈 사용 방법
C:\doit 디렉터리에 mymod.py 파이썬 모듈이 있다고 가정해보자. 명령 프롬프트 창에서 파이썬 셀을 열어 이 모듈을 import해서 사용할 수 있는 방법을 모두 기술하시오. (즉 다음과 같이 import mymod를 수행할 때 오류가 없어야 한다)
import mymod
A. 파이썬 셸에서 mymod.py 모듈을 인식하기 위해서는 다음과 같은 3가지 방법이 있을 수 있다.
1. sys 모듈 사용하기
sys.path 에 C:\doit이라는 디렉터리를 추가하면 C:\doit 이라는 디렉터리에 있는 mymod 모듈을 사용할 수 있다
import sys
sys.path.append("c:/doit")
import mymod
2. PYTHONPATH 환경 변수 사용하기
PYTHONPATH 환경 변수에 C:\doit 디렉터리를 지정하면 C:\doit 디렉터리에 있는 mymod 모듈을 사용할 수 있다.
C:\Users\home>set PYTHONPATH=c:\doit
C:\Users\home>python
import mymod
3. 현재디렉터리 사용하기
파이썬 셸을 mymod.py가 있는 위치로 이동하여 실행해도 mymod 모듈을 사용할 수 있다. sys.path 에는 현재 디렉터리인 .이 항상 포함되어 있기 때문이다.
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)
A. 7이 출력된다.
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(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))
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
print(compress_string("aaabbcccccca"))
Q15. Duplicate Numbers
0~9의 문자로 된 숫자를 입력받았을 때, 이 입력값이 0~9의 모든 숫자를 각각 한 번씩만 사용한 것인지 확인하는 함수를 작성하시오.
입력예시: 0123456789 01234 01234567890 6789012345 012322456789
출력예시: True False False True Flase
def chkDupNum(s):
result=[]
for num in s:
if num not in result:
result.append(num)
else:
return False
return len(result)==10
print(chkDupNum("0123456789"))
print(chkDupNum("01234"))
print(chkDupNum("01234567890"))
print(chkDupNum("6789012345"))
print(chkDupNum("012322456789"))
Q16. 모스 부호 해독
문자열 형식으로 입력받은 모스 부호(dot:. dash:-)를 해독하여 영어 문장으로 출력하는 프로그램을 작성하시오.
글자와 글자 사이는 공백 1개, 단어와 단어 사이는 공백 2개로 구분한다.
dic={'.-':'A', '-...':'B', '-.-.':'C', '-..':'D', 'c':'E', '..-.':'F', '--.':'G', '....':'H', '..':'I', '.---':'J', '-.-':'K', '.-..':'L', '...':'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('.... . ... .-.. . . .--. ... . .- .-. .-.. -.--'))
모스 부호 규칙 표를 딕셔너리로 작성한 후 입력에 해당되는 모스 부호 문자열을 먼저 단어(공백문자2개)로 구분한다. 그 후 단어를 문자(공백문자1개)로 구분하여 해당 모스 부호 값을 딕셔너리에서 찾아서 그 결과값을 구한다.
Q17. 기초 메타 문자
다음 중 정규식 a[.]{3,}b과 매치되는 문자열은 무엇일까?
1. acccb
2. a...b
3. aaab
4. a.cccb
A. 2 a...b
import re
p=re.compile("a[.]{3,}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]+')
m=p.search("5 python")
print(m.start()+m.end())
정규식 [a-z]+는 소문자로 이루어진 단어를 뜻하므로 '5 python' 문자열에서 python과 매치된다. 따라서 시작인덱스는 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=par.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("pahkey@gmail.com"))
print(pat.match("kim@daum.net"))
print(pat.match("lee@myhome.co.kr"))
'PYTHON > Do it! 점프 투 파이썬' 카테고리의 다른 글
[Do it! 점프 투 파이썬-스터디 노트] 07장 정규 표현식(07-3 강력한 정규 표현식의 세계로) (0) | 2021.04.23 |
---|---|
[Do it! 점프 투 파이썬-스터디 노트] 07장 정규 표현식(07-1 정규 표현식 살펴보기, 07-2 정규 표현식 시작하기) (0) | 2021.04.22 |
[Do it! 점프 투 파이썬-스터디 노트] 06장 파이썬 프로그래밍, 어떻게 시작해야할까?(06-4~06-6) (0) | 2021.04.21 |
[Do it! 점프 투 파이썬-스터디 노트] 06장 파이썬 프로그래밍, 어떻게 시작해야할까?(06-1~06-3) (0) | 2021.04.21 |
[Do it! 점프 투 파이썬-스터디 노트] 05장 파이썬 날개 달기 연습문제 (0) | 2021.04.21 |