[파이썬 쉽게 설명하기] 파이썬 마을의 수수께끼 (알파벳 빈도수 계산)
- 파이썬 마을에 살고 있는 지혜롭고 호기심 많은 마법사 코드릭이 '베니스의 상인' 마법 서적에서 발견된 알파벳 빈도수 수수께끼를 해결하기로 결심함.
- 코드릭은 특별한 마법 주문과 마법 구슬을 사용하여 각 알파벳의 빈도수를 세고, 결과를 도서관의 큰 벽에 마법으로 새겨 발표함.
- 이 과정을 통해 파이썬 마을 사람들은 '베니스의 상인'에 대한 새로운 비밀을 알게 되며 코드릭의 마법에 감탄함.
옛날옛적에 파이썬 마을에는 지혜롭고 호기심 많은 마법사 코드릭이 살고 있었어요. 코드릭은 마법 서적들로 가득한 커다란 도서관을 운영하고 있었죠. 어느 날, 그의 도서관에 놀라운 일이 일어났어요. 바로 '베니스의 상인'이라는 유명한 마법 서적에서 알파벳 빈도수에 관한 수수께끼가 발견된 거예요!
코드릭은 이 수수께끼를 풀기로 결심했어요. 수수께끼의 내용은 이러했죠. "이 마법 서적에서 각 알파벳이 몇 번씩 등장하는지 알아내는 자만이 진정한 마법사가 될 수 있으리라." 코드릭은 이 문제를 해결하기 위해 특별한 마법 주문을 준비했어요.
먼저, 코드릭은 'venice.txt'라는 마법 책을 열어 그 안의 마법 주문을 scripts
라는 두루마리에 옮겨 적었어요.
infile = open('venice.txt', 'r')
scripts = infile.read()
그리고 코드릭은 알파벳 빈도수를 세기 위해 58개의 마법 구슬을 준비했어요. 이 구슬들은 'A'부터 'z'까지 각 알파벳을 나타냈죠. 코드릭은 마법 주문을 외워 구슬들을 초기화했어요.
counts = [0] * 58
이제 본격적으로 수수께끼를 풀 시간이에요! 코드릭은 scripts
두루마리를 한 글자씩 읽어나가기 시작했어요. 그는 ord
라는 마법을 사용해 각 글자를 숫자로 변환했죠. 만약 그 숫자가 대문자나 소문자 알파벳에 해당한다면, 그 알파벳을 나타내는 마법 구슬의 숫자를 하나 늘렸어요.
for i in range(len(scripts)):
char_code = ord(scripts[i])
if ord('A') <= char_code <= ord('Z') or ord('a') <= char_code <= ord('z'):
counts[char_code - ord('A')] += 1
마침내 모든 글자를 확인한 코드릭은 chr
마법을 사용해 숫자를 다시 알파벳으로 바꾸고, 각 알파벳의 빈도수를 도서관의 큰 벽에 마법으로 새겨 발표했어요.
for i in range(ord('A'), ord('z') + 1):
if ord('A') <= i <= ord('Z') or ord('a') <= i <= ord('z'):
print(chr(i), counts[i - ord('A')])
마지막으로 코드릭은 'venice.txt' 마법 책을 닫아 마법을 종료했죠.
infile.close()
이렇게 코드릭은 수수께끼를 완벽하게 풀어냈어요. 파이썬 마을 사람들은 코드릭의 놀라운 마법에 감탄했죠. 그의 마법 덕분에 '베니스의 상인'에 대한 새로운 비밀이 밝혀졌어요. 가장 많이 사용된 알파벳이 무엇인지 알게 된 거죠!
튜토리얼
파이썬 마을의 수수께끼 해결: 알파벳 빈도수 계산 - 튜토리얼
# 파일 열기 및 읽기
infile = open('venice.txt', 'r')
scripts = infile.read()
# 알파벳 카운트를 위한 리스트 초기화
counts = [0] * 58
# 텍스트 내 알파벳 수 세기
for i in range(len(scripts)):
char_code = ord(scripts[i])
if ord('A') <= char_code <= ord('Z') or ord('a') <= char_code <= ord('z'):
counts[char_code - ord('A')] += 1
# 결과 출력
for i in range(ord('A'), ord('z') + 1):
if ord('A') <= i <= ord('Z') or ord('a') <= i <= ord('z'):
print(chr(i), counts[i - ord('A')])
# 파일 닫기
infile.close()
코드릭과 함께 코드를 한 줄씩 살펴보며, 각 마법 주문의 의미를 알아볼까요?
infile = open('venice.txt', 'r')
이 주문은 'venice.txt'라는 마법 책을 읽기 모드('r')로 열어요.
마치 도서관에서 책을 펼치는 것처럼, 우리는 텍스트 파일을 열어 내용을 읽을 준비를 해요.
scripts = infile.read()
이 주문은 열린 파일의 모든 내용을 읽어
scripts
라는 변수에 저장해요.마치 책의 내용을 두루마리에 옮겨 적는 것처럼, 우리는 파일의 내용을 메모리로 가져와요.
counts = [0] * 58
이 주문은 길이가 58인 리스트를 만들고, 모든 요소를 0으로 초기화해요.
마치 58개의 마법 구슬을 준비하고, 각 구슬의 값을 0으로 설정하는 것과 같아요.
for i in range(len(scripts)):
이 주문은
scripts
의 길이만큼 반복하면서, 각 글자를 하나씩 살펴봐요.마치 두루마리를 처음부터 끝까지 읽어나가는 것처럼, 우리는 텍스트를 한 글자씩 확인해요.
char_code = ord(scripts[i])
이 주문은
scripts
의 i번째 글자를 ASCII 코드 값으로 변환해요.마치 글자를 마법의 숫자로 바꾸는 것처럼, 우리는
ord
함수를 사용해 글자를 ASCII 코드 값으로 변환해요.
if ord('A') <= char_code <= ord('Z') or ord('a') <= char_code <= ord('z'):
이 주문은 현재 글자가 대문자 알파벳이나 소문자 알파벳인지 확인해요.
마치 마법 구슬이 알파벳을 나타내는지 확인하는 것처럼, 우리는 ASCII 코드 값을 사용해 글자가 알파벳인지 판단해요.
counts[char_code - ord('A')] += 1
이 주문은 해당 알파벳의 빈도수를 1 증가시켜요.
마치 알파벳에 해당하는 마법 구슬의 숫자를 하나 늘리는 것처럼, 우리는 알파벳의 빈도수를 증가시켜요.
for i in range(ord('A'), ord('z') + 1):
이 주문은 알파벳 'A'부터 'z'까지 반복하면서, 각 알파벳의 빈도수를 출력해요.
마치 마법 구슬을 하나씩 확인하며 그 값을 읽어내는 것처럼, 우리는 알파벳 순서대로 빈도수를 출력해요.
if ord('A') <= i <= ord('Z') or ord('a') <= i <= ord('z'):
이 주문은 현재 ASCII 코드 값이 알파벳에 해당하는지 확인해요.
마치 마법 구슬이 알파벳을 나타내는지 확인하는 것처럼, 우리는 출력할 ASCII 코드 값이 알파벳인지 판단해요.
print(chr(i), counts[i - ord('A')])
이 주문은 알파벳과 그에 해당하는 빈도수를 출력해요.
마치 마법 구슬의 값을 읽어 마법 벽에 새기는 것처럼, 우리는 알파벳과 빈도수를 화면에 출력해요.
infile.close()
이 주문은 열었던 파일을 닫아요.
마치 책을 다 읽은 후 덮는 것처럼, 우리는 파일을 닫아 자원을 반환해요.
/