본문 바로가기
Sejong University/Symmetric-key cryptography

Histogram for Character Frequency

by reindeer002 2022. 4. 23.
728x90
#문자열의 알파벳 개수를 센 후 데이터를 딕셔너리 형태로 출력하는 함수
def char_freq(string):
    ret_dic = {} #결과값
    string = string.lower() #입력받은 문자열의 대문자 알파벳을 모두 소문자로 변환
    print(string) #올바르게 입력되었는지 확인
    length = len(string) #문자열의 길이
    for i in range(0, length): #문자열의 길이만큼 반복
        if ord('a') <= ord(string[i]) and ord('z') >= ord(string[i]): #만약 해당 문자가 알파벳이라면
            if string[i] in ret_dic: #딕셔너리에 이미 등록된 문자라면
                ret_dic[string[i]] += 1 #문자의 개수 1증가
            else: #딕셔너리에 등록되어 있지 않다면
                ret_dic[string[i]] = 1 #문자를 등록 후 1로 초기화
    return ret_dic #결과값 반환

#파일 안에 저장된 문자열의 알파벳 개수를 센 후 데이터를 딕셔너리 형태로 출력하는 함수
def char_freq_file(file):
    f = open(file+'.txt', 'r') #파일 열기
    ret_dic = {} #결과값
    one_dic = {} #하나의 문자열에 대한 알파벳의 개수
    while True: #break가 나올 때까지 반복
        string = f.readline() #파일의 문자열 읽기
        if not string: #더 이상 읽을 문자열이 없다면
            break #반복문 탈출
        one_dic = char_freq(string) #문자열의 알파벳 개수 검사
        for i in one_dic.keys(): #검사한 문자열의 딕셔너리 키의 개수만큼 반복
            if i in ret_dic: #만약 해당 키값이 파일 전체 문자열에 대한 딕셔너리에 등록되어 있다면
                ret_dic[i] += one_dic[i] #파일 전체 문자열에 대한 딕셔너리에 추가
            else: #만약 해당 키값이 파일 전체 문자열에 대한 딕셔너리에 등록되어 있지 않다면
                ret_dic[i] = one_dic[i] #파일 전체 문자열에 대한 딕셔너리에 등록 후 값 추가
    f.close() #파일 열기 종료
    return ret_dic #결과값 반환

def histogram(dict_freq):
    for i in range(ord('a'), ord('z') + 1): #a부터 z까지
        if chr(i) in dict_freq: #만약 i가 dict_freq에 등록되어 있다면
            print(chr(i), ':', end='') #i :출력
            for j in range(0, dict_freq[chr(i)]): #i의 개수만큼 반복
                print('*', end='') #*출력
            print() #개행
        else: #만약 i가 dict_freq에 등록되어 있지 않다면
            print(chr(i), ':') #i :만 출력

#메인 함수
def main():
    #안내문 출력
    num = input('무엇을 histogram으로 표현할 것입니까? (파일입력일 경우 1, 문자열입력일 경우 2): ')
    if num == '2': #만약 문자열 입력일 경우
        string = input('문자열 입력: ') #문자열 입력
        histogram(char_freq(string)) #histogram제작
    else: #만약 파일명 입력일 경우
        file = input('파일명 입력: ') #파일명 입력
        histogram(char_freq_file(file)) #histogram제작

main() #메인함수 실행
728x90

'Sejong University > Symmetric-key cryptography' 카테고리의 다른 글

CBC mode  (0) 2022.04.23
Simple DES  (0) 2022.04.23
Classic Cipher  (0) 2022.04.23

댓글