CSE1017 프로그래밍기초 (2022) 숙제 6 [2점] 마감 : 5월 18일 수업시작 직전까지 코드파일 업로드

사전 지식 습득용 자습 자료

(1) 0으로만 구성된 길이 10의 리스트 만들기

>>> [0 for _ in range(10)]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

(2) 숫자문자(digit: '0','1','2','3','4','5','6','7','8','9')로만 구성된 문자열을 인수로 받아서, 숫자문자와 해당 문자의 빈도수의 튜플의 리스트를 리턴하는 함수 digit_frequencies를 작성하자.

ds = "2037035976334486086268445688409378161051468393665936250636140449354381299763336706183397376"

def digit_frequencies(ds):
    digits_count = [0 for _ in range(10)]
    for d in ds:
        digits_count[int(d)] += 1
    paired = []
    i = 0
    for dc in digits_count:
        paired.append((str(i),dc))
        i += 1
    return paired

print(digit_frequencies(ds))

이 프로그램을 실행하면, 실행창에 다음과 같이 프린트 한다.

[('0', 8), ('1', 6), ('2', 4), ('3', 17), ('4', 10), ('5', 6), ('6', 16), ('7', 7), ('8', 9), ('9', 8)]

(3) 문제 (2)의 digit_frequencies 함수를 호출하여 얻은 리스트를 숫자문자의 빈도수가 높은 순으로 정렬한 리스트를 리턴하는 함수 digit_frequencies_sort는 다음과 같이 작성할 수 있다.

def digit_frequencies_sort(ds):
    paired = digit_frequencies(ds)
    paired.sort(key=lambda x: x[1], reverse=True)
    return paired

print(digit_frequencies_sort(ds))

이 프로그램을 실행하면, 실행창에 다음과 같이 프린트 한다.

[('3', 17), ('6', 16), ('4', 10), ('8', 9), ('0', 8), ('9', 8), ('7', 7), ('1', 6), ('5', 6), ('2', 4)]

문제

숫자문자로만 구성된 텍스트 파일명(문자열)을 인수로 받아서, 숫자의 빈도수와 각 숫자가 전체에서 몇 %를 차지하는지 가장 많이 나오는 숫자 순으로 나열하여 텍스트 파일 ranking.txt에 저장하는 프로시저 digit_ranking_board 함수를 작성하자.

예를 들어, 같은 폴더에 있는 digits.txt 파일의 내용이 다음과 같다고 하고,

2037035976334486086268445688409378161051468393665936250636140449354381299763336706183397376

digit_ranking_board("digits.txt")를 호출하면, 다음과 같은 내용의 텍스트 파일 ranking.txt이 같은 폴더에 생성되어야 한다.

3 17 18.7%
6 16 17.6%
4 10 11.0%
8 9 9.9%
0 8 8.8%
9 8 8.8%
7 7 7.7%
1 6 6.6%
5 6 6.6%
2 4 4.4%