본문 바로가기

파이썬(문제풀이)

파이썬 - 평균 점수 구하기

 

더보기

준이네 반에서 국어, 영어, 수학 시험을 보았다. 준이네 친구들의 평균점수를 구해주기로 하였다. 공백으로 구분하여 세과목의 점수가 주어지면 전체 평균 점수를 구하는 파이썬 프로그램을 여러개 작성해 주세요. 단, 소숫점 자리는 모두 버립니다.

 

#1. split()과 int()를 이용한 방법

가장 기본적인 방법으로, 문자열로 입력받은 점수들을 split() 함수로 나누고, 각각 정수형(int)으로 변환하여 더한 후 평균을 구합니다. 마지막으로 정수 나눗셈(//)을 사용하여 소수점을 버립니다.

scores = input("국어, 영어, 수학 점수를 공백으로 구분하여 입력하세요: ")
score_list = scores.split()

korean_score = int(score_list[0])
english_score = int(score_list[1])
math_score = int(score_list[2])

total_score = korean_score + english_score + math_score
average_score = total_score // 3

print(f"준이 친구들의 전체 평균 점수는 {average_score}점입니다.")

코드 분석

scores = input("국어, 영어, 수학 점수를 공백으로 구분하여 입력하세요: ")

  • input() 함수를 사용하여 사용자에게 메시지를 보여주고 입력을 받습니다. 사용자가 "80 90 70"처럼 점수를 입력하면, 이 문자열이 scores 변수에 저장됩니다.

score_list = scores.split()

  • scores.split()은 문자열을 공백(' ')을 기준으로 나누어 리스트 형태로 만들어 줍니다. 예를 들어, scores가 "80 90 70"이면 score_list는 ['80', '90', '70']이 됩니다.

korean_score = int(score_list[0]) english_score = int(score_list[1]) math_score = int(score_list[2])

  • score_list의 각 요소는 현재 문자열 형태이므로, int() 함수를 사용하여 정수형으로 변환합니다.
  • score_list[0]은 첫 번째 요소인 '80'을, score_list[1]은 '90'을, score_list[2]는 '70'을 가리키며, 각각 korean_score, english_score, math_score 변수에 정수 값으로 저장됩니다.

total_score = korean_score + english_score + math_score

  • 세 과목의 점수를 모두 더해 total_score 변수에 저장합니다.

average_score = total_score // 3

  • total_score를 3으로 나누어 평균을 계산합니다. 여기서 정수 나눗셈 연산자인 //를 사용했는데, 이 연산자는 나눗셈의 몫만 취하고 소수점 이하는 버립니다. 예를 들어 250 // 3은 83.33...이 아닌 83이 됩니다. 문제에서 "소숫점 자리는 모두 버립니다"라는 조건에 부합하는 연산자입니다.

print(f"준이 친구들의 전체 평균 점수는 {average_score}점입니다.")

  • f-string (포맷팅된 문자열 리터럴)을 사용하여 출력합니다. 중괄호 {} 안에 변수 average_score를 넣어 계산된 평균 점수를 문장과 함께 보기 좋게 출력합니다.

코드의 장점 및 개선점

  • 장점: 코드가 직관적이고 이해하기 쉽습니다. 변수 이름도 명확해서 각 변수가 어떤 역할을 하는지 쉽게 알 수 있습니다.
  • 개선점: 점수 과목 수가 늘어나면 변수를 계속 추가해야 하는 불편함이 있습니다. 이러한 경우 sum() 함수와 len() 함수를 사용하면 더 유연하고 간결하게 코드를 작성할 수 있습니다. 예를 들어, average_score = sum(score_list) // len(score_list)와 같이 작성할 수 있습니다.

#2. map() 함수를 이용한 방법

map() 함수를 사용하면 split()으로 나눈 문자열 리스트의 모든 요소를 한 번에 정수형으로 변환할 수 있어 코드가 더 간결해집니다.

scores = input("국어, 영어, 수학 점수를 공백으로 구분하여 입력하세요: ")
score_list = list(map(int, scores.split()))

total_score = sum(score_list)
average_score = total_score // len(score_list)

print(f"준이 친구들의 전체 평균 점수는 {average_score}점입니다.")

코드 분석

scores = input("국어, 영어, 수학 점수를 공백으로 구분하여 입력하세요: ")

  • input() 함수를 사용해 사용자에게 점수를 입력받습니다. 예를 들어, 사용자가 80 90 70을 입력하면 이 문자열이 scores 변수에 할당됩니다.

score_list = list(map(int, scores.split()))

  • 이 줄은 이 코드의 핵심입니다.
    • scores.split(): 입력받은 문자열을 공백을 기준으로 나누어 '80', '90', '70'과 같은 문자열 요소들로 구성된 리스트를 만듭니다.
    • map(int, ...): map 함수는 리스트의 각 요소에 int 함수를 적용합니다. 즉, 모든 문자열 점수를 정수형으로 변환합니다.
    • list(...): map 함수의 결과를 리스트로 변환하여 score_list에 저장합니다. 최종적으로 score_list는 정수형 점수들이 담긴 [80, 90, 70]과 같은 형태가 됩니다.

total_score = sum(score_list)

  • sum() 함수는 리스트에 있는 모든 숫자의 합계를 자동으로 계산해 total_score에 저장합니다.

average_score = total_score // len(score_list)

  • total_score를 len(score_list)로 나누어 평균을 구합니다.
    • len(score_list): 리스트의 길이를 반환합니다. 이 코드에서는 과목 수가 3개이므로 3을 반환합니다.
    • //: 정수 나눗셈 연산자로, 나눗셈의 몫만 구하고 소수점 이하는 버립니다. 문제의 요구사항인 "소숫점 자리는 모두 버립니다"에 정확히 부합합니다.

print(f"준이 친구들의 전체 평균 점수는 {average_score}점입니다.")

  • f-string을 사용해 계산된 평균 점수를 문장과 함께 보기 좋게 출력합니다.

이전 코드와의 비교 및 장점

이 코드는 첫 번째로 제시된 코드보다 훨씬 효율적이고 유연합니다.

  • 가변적인 과목 수: 이전 코드에서는 과목 수에 맞춰 변수(korean_score, english_score 등)를 일일이 지정해야 했습니다. 하지만 이 코드는 sum()과 len() 함수를 사용하기 때문에 4과목, 5과목이 되어도 코드를 수정할 필요가 없습니다.
  • 간결성: map() 함수를 사용함으로써 여러 줄에 걸쳐 변환하던 과정을 한 줄로 줄였습니다. 코드가 더 짧고 읽기 쉬워졌습니다.
  • 유지보수 용이성: 점수가 추가되거나 변경되더라도 코드 수정 없이 재사용할 수 있어 유지보수가 쉽습니다.

#3. 리스트 컴프리헨션을 이용한 방법

리스트 컴프리헨션은 파이썬의 강력한 기능 중 하나로, 반복문을 사용하지 않고도 간결하게 리스트를 생성할 수 있습니다. map() 함수와 유사하게 코드를 줄일 수 있습니다.

scores = input("국어, 영어, 수학 점수를 공백으로 구분하여 입력하세요: ")
score_list = [int(score) for score in scores.split()]

total_score = sum(score_list)
average_score = total_score // len(score_list)

print(f"준이 친구들의 전체 평균 점수는 {average_score}점입니다.")

 

코드 분석

scores = input("국어, 영어, 수학 점수를 공백으로 구분하여 입력하세요: ")

  • input() 함수를 사용하여 사용자로부터 점수를 문자열 형태로 입력받습니다. 예를 들어, 사용자가 80 90 70을 입력하면 이 문자열이 scores 변수에 저장됩니다.

score_list = [int(score) for score in scores.split()]

  • 이 줄은 리스트 컴프리헨션을 활용한 부분으로, 코드를 매우 압축적으로 만듭니다.
    • scores.split(): 입력받은 문자열을 공백을 기준으로 나누어 ['80', '90', '70']와 같은 문자열 리스트를 생성합니다.
    • for score in ...: 이 리스트의 각 문자열 요소('80', '90', '70')를 순회합니다.
    • int(score): 순회하는 각 문자열 요소를 정수형으로 변환합니다.
    • [...]: 변환된 정수들을 새로운 리스트로 만들어 score_list에 할당합니다. 결과적으로 score_list는 [80, 90, 70]이 됩니다.

total_score = sum(score_list)

  • 파이썬의 내장 함수인 sum()을 사용하여 score_list에 있는 모든 숫자의 합을 간편하게 구합니다.

average_score = total_score // len(score_list)

  • total_score를 score_list의 길이(len())로 나누어 평균을 구합니다.
    • len(score_list): 리스트의 요소 개수, 즉 과목 수를 반환합니다.
    • //: 정수 나눗셈 연산자로, 소수점 이하를 버리고 몫만 구합니다. 이는 "소수점 자리를 모두 버린다"는 문제의 요구사항에 정확히 부합합니다.

print(f"준이 친구들의 전체 평균 점수는 {average_score}점입니다.")

  • f-string을 사용하여 계산된 평균 점수를 문장 내에 삽입하여 최종 결과를 출력합니다.

이전 코드와의 차이점

이 코드는 리스트 컴프리헨션을 사용함으로써, map() 함수를 사용한 코드와 마찬가지로 한 줄로 데이터 변환을 처리합니다. 이는 코드를 더욱 간결하고 가독성 높게 만들어 줍니다. 또한, sum()과 len() 함수를 사용하여 과목 수에 관계없이 작동하는 유연성을 갖추고 있어 실용적입니다.