본문 바로가기
SK Shieldus Rookies 19th/인프라 활용을 위한 파이썬

[SK shieldus Rookies 19기][Python] - 실습 2

by En_Geon 2024. 3. 17.

1. 성적 데이터 파일을 읽어서 이름, 과목별 점수, 합계, 평균 정보 출력

 

출력 예시

이      름  국어  영어  수학  합계  평균
====== ==== ==== ==== ==== ====
홍길동     100     90      80   270      90
신길동       90     70      60   220      73     ⇐ 평균은 반올림
고길동       60   100      20   180      60

 

성적 데이터 파일을 읽기 위해서는 성적 데이터 파일이 있어야 하기 때문에 score_data.txt 파일에 이름과 성적을 적어 성적 데이터를 만들어 준다.

성적 데이터

 

더보기

 

def calurate_sum(scores):
    sum = 0
    for score in scores:
        sum += int(score)
    return sum

def calurate_average(scores):
    return int(calurate_sum(scores) / len(scores))
     
def print_data(name, scores, sum, average):
    print(f"{name:3}", end=" ")
    for score in scores:
        print(f"{int(score):4}", end=" ")
    print(f"{sum:4}", end=" ")
    print(f"{average:4}")

with open('score_data.txt', 'r', encoding = 'utf-8') as file :
    # 타이틀 출력
    print('====== ==== ==== ==== ==== ====')
    print('이  름 국어 영어 수학 합계 평균')
    print('====== ==== ==== ==== ==== ====')

    # 파일을 행 단위로 읽어서 처리
    for line in file :
       
        # 개행문자를 제거
        line = line.strip()

        # 공백문자를 기준으로 분리
        datas = line.split()

        # 이름을 추출
        name = datas[0]

        # 점수를 추출
        scores = datas[1:]
       
        # 합계를 계산
        sum = calurate_sum(scores)
       
        # 평균을 계산
        average = calurate_average(scores)
       
        # 이름, 점수, 합계, 평균을 출력
        print_data(name, scores, sum, average)

 

  • 기능들을 함수화 하여 코드를 단순화 

 

 

2. 프로그램 실행 시 전달받은 문장에 포함된 글자의 사용 횟수를 계산해서 출력

 

1) 기본

출력 예시

python test.py "This is sample program"
입력 ⇒ This is sample program
T => 1
h => 1
i => 2
s => 3  
   :

 

더보기

 

import sys

sentence = sys.argv[1]
print(f"입력 => {sentence}")

# 글자(키)와 글자의 사용 횟수(값)를 가지는 딕셔너리
char_count = dict()

# 입력받은 문장에서 한 글자씩을 추출해서 딕셔너리에 추가
for char in sentence:
    # 딕셔너리에 해당 글자가 존재하는 경우, 사용 횟수를 증가
    if char in char_count:
        char_count[char] = char_count[char] + 1
    # 딕셔너리에 해당 글자가 존재하지 않는 경우, 사용 횟수로 1을 설정해서 추가
    else:
        char_count[char] = 1

# 딕셔너리를 순회하면서 출력
for char in char_count:
    print(f"{char} => {char_count[char]}")

 

  • 이 코드는 콘솔창에서 파일명과 인수를 같이 줘야 한다.
  • test.py "This is an apple."

argv[0]은 파일 이름이기 때문에 argv[1]이 들어가고 다음 문장을 입력할 때는 따옴표로 묶어 줘야 argv[1]로 인식할 수 있다.

 

2) 위 프로그램을 대소문자를 구분하지 않은 알파벳과 그 횟수로 제한하고 알파벳 순으로 정렬해서 출력

 

출력 예시

C:\python> test.py "T & t is sampe char."
입력 => T & t is sampe char.
a => 2
c => 1
  :
i => 1
s => 1
t => 2

 

더보기

 

import sys

sentence = sys.argv[1]
print(f"입력 => {sentence}")

char_count = dict()

for char in sentence:

    # 알파벳을 소문자로 변경
    char = char.lower()

    # 알파벳이 아닌 경우 다음 글자를 처리
    if char < 'a' or char > 'z':
        continue
   
    if char in char_count: char_count[char] = char_count[char] + 1
    else: char_count[char] = 1

# 알파벳(키)을 기준으로 정렬한 결과를 출력
for key in sorted(char_count.keys()):
    print(f"{key} => {char_count[key]}")

 

  • 소문자로 변경 추가
  • 공백, 특수문자 제외 추가
  • 알파벳 정렬 추가

 

3) 위 프로그램을 가장 많이 나온 알파벳 순으로 출력

 

출력 예시

C:\python> test.py "T & t is same alphabet."
입력 => T & t is same alphabet.
3 => [ 'a', 't' ]
2 => [ 'e', 's' ]
1 => [ 'b', 'h', 'i', 'l', 'm' ]

 

 

더보기

 

import sys

sentence = sys.argv[1]
print(f"입력 => {sentence}")

char_count = dict()

for char in sentence:

    char = char.lower()
    if char < 'a' or char > 'z':
        continue
   
    if char in char_count: char_count[char] = char_count[char] + 1
    else: char_count[char] = 1

# 횟수(숫자)를 키로 가지고, 문자 리스트를 값으로 가지는 딕셔너리를 정의
# { 3: ['a', 'b', 'c'], 2: ['x', 'y'] }
count_char = {}
for char in sorted(char_count.keys()):
    count = char_count[char]
    if count in count_char: count_char[count].append(char)
    else: count_char[count] = [char]

# 회수(키) 내림차순으로 정렬해서 출력
for key in sorted(count_char.keys(), reverse=True):
    print(f"{key} => {count_char[key]}")

 

3. 실습 프로그램 통합

출력 예시 

=================
1. 행맨
2. 점수계산
3. 알파벳 카운터
Q. 종료
=================
실행할 프로그램의 번호를 입력 : 1

 

  • 행맨, 시험 점수, 글자 카운터를 한 프로그램에서 이용할 수 있도록 통합
  • 통합하기 위해서는 메인 페이지를 만들고 나머지 프로그램을 모듈화 한다.
  • 모듈화한 프로그램을 메인 페이지에서 불러온다.

 

더보기

 

1) 행맨

 

import re
import random

def main() :
    #words = input('여러 단어로 구성된 문장을 입력하세요. ')
    words = "This is an optional feature. You can study at W3Schools without using My Learning."
    print(f"입력 : {words}")

    # 문장부호를 제거 ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~ \
    words = re.sub(r'[!"#$%&\'()*+,-./:;<=>?@\[\]^_\`{|}~\\\\]', '', words)

    # 공백문자를 기준으로 단어를 분리
    words = words.split()

    # 임의의 단어를 추출
    rand_word = list(words[random.randrange(len(words))])

    # 화면에 출력할 내용
    disp_word = list('_' * len(rand_word))
    print(f'힌트 >>> {''.join(disp_word)}')

    try_count = 0
    while True:
        try_count += 1
        alpha = input(f'{try_count} 시도 >>> 영어 단어를 구성하는 알파벳을 입력하세요. ')

        for i, a in enumerate(rand_word):
            if alpha == a:
                disp_word[i] = alpha
        print(f'힌트 >>> {''.join(disp_word)}')
        if disp_word.count('_') == 0:
            print(f'정답 "{''.join(rand_word)}"를 {try_count}번 만에 맞췄습니다.')
            break
        elif try_count >= 10:
            print(f'10번에 기회가 모두 끝났습니다. 정답은 "{''.join(rand_word)}" 입니다.')
            break

if __name__ == "__main__" :
    main()

 

  • def main()는 main() 함수를 호출해야 실행되도록 수정
  • if __name__ == "__main__" : 는 모듈 import 시에는 실행되지 않도록 제한 모둘을 직접 실행했을 때만 실행

 

2) 점수

 

def calurate_sum(scores):
    sum = 0
    for score in scores:
        sum += int(score)
    return sum

def calurate_average(scores):
    return int(calurate_sum(scores) / len(scores))

def print_title():
    print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
    print('이  름 국어 영어 수학 합계 평균')
    print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')

def print_tail():
    print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')

def print_data(name, scores, sum, average):
    print(f"{name:3}", end=" ")
    for score in scores:
        print(f"{int(score):4}", end=" ")
    print(f"{sum:4}", end=" ")
    print(f"{average:4}")

def main() :
    with open('score_data.txt', 'r', encoding='utf-8') as file:

        print_title()

        for line in file:
            line = line.strip()
            datas = line.split()

            name = datas[0]
            scores = datas[1:]
            sum = calurate_sum(scores)
            average = calurate_average(scores)

            print_data(name, scores, sum, average)

        print_tail()

if __name__ == "__main__" :
    main()

 

  • def main() 실행 부분을 모듈화

 

3) 카운터

 

def main() :
    sentence = input("문장을 입력하세요. ")
    print(f"입력 => {sentence}")

    char_count = dict()

    for char in sentence:

        char = char.lower()
        if char < 'a' or char > 'z':
            continue
        
        if char in char_count: char_count[char] = char_count[char] + 1
        else: char_count[char] = 1

    # 회수(숫자)를 키로 가지고, 문자 리스트를 값으로 가지는 딕셔너리를 정의
    # { 3: ['a', 'b', 'c'], 2: ['x', 'y'] }
    count_char = {}
    for char in sorted(char_count.keys()):
        count = char_count[char]
        if count in count_char: count_char[count].append(char)
        else: count_char[count] = [char]

    # 회수(키) 내림차순으로 정렬해서 출력
    for key in sorted(count_char.keys(), reverse=True):
        print(f"{key} => {count_char[key]}")

if __name__ == "__main__" :
    main()

 

  • 카운터는 import sys로 콘솔에서 인수를 받아야 하는데 통합하면 sys로 받지 않기 때문에 제거
  • sys 입력을 받지 않기 때문에 사용자 입력을 받기 위해 input() 함수 추가

 

4) 메인

 

import _hangman
import _counter
import _score

def show_menu():
    print("""
=================
1. 행맨
2. 점수계산
3. 알파벳 카운터
Q. 종료
=================
    """)

while True :
    show_menu()

    menu = input('실행할 프로그램의 번호를 입력 : ')
    if menu == 'Q' :
        print('프로그램을 종료합니다.')
        break

    menu = int(menu)
    if menu == 1 :
        print("행맨 실행")
        _hangman.main()
    elif menu == 2 :
        print('점수 계산 실행')
        _score.main()
    elif menu == 3 :
        print('알파벳 카운터')
        _counter.main()
    else :
        print('잘못된 입력 다시 입력하세요')

 

  • 메인 페이지에서 행맨, 점수, 카운터 모듈을 사용하기 위해 각각 import 한다.
  • 메뉴의 해당하는 프로그램의 번호를 입력하면 해당 프로그램의 main() 함수를 호출한다.
  • 잘못된 입력 검증

 

댓글