알고리즘

백준 알고리즘 4344번 [파이썬]

Brad Daeho Lee 2021. 3. 6. 22:58

 

 

 

 

 

 

배운 내용

1. 두 변수에 한번에 인풋을 할 때 어떻게 split()을 사용해야되는지 배웠습니다. input().split(" ", 1)은 첫번 째 띄어쓰기를 기준으로 split을 해서 두 변수에 나눠준다는 뜻입니다. 

 

2. 이 문제는 문제를 정확하게 이해하지못해서 계속 헤맸던것 같다. 문제를 정확하게 읽는 중요성을 배웠다.

 

3. 특정 decimal point까지 값을 줄 때 round를 사용해서는 안되고,  %.nf %(value) 형식을 사용해야된다.

 

 

문제 

 

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다. 

 

 

 

문제풀이

 

# N = 테스트 케이스, 테스트 케이스 숫자에 따라 반복문이 돌수있게 설정
N = int(input())
# list에다가 각 클래스의 퍼센트를 구해서 저장 
list = []
# 학생 수와 점수들을 각 각 n과 lst에 split해서 저장
for i in range(N):
  n,lst = input().split(" ",1)
  n = int(n)
  lst = lst.split()    
  A = 0
  # A에 lst안에있는 점수의 총합을 구한다.
  for i in lst:
    A = A + int(i)

  average = A/n
  number = 0
  # average를 넘는 점수가 있으면 number값에 1씩 더한다.
  for i in lst:
    if int(i) > average:
      number = number + 1
  # decimal point를 특정 부분까지 주고 끝에 %를 붙이려면 '%.nf%%'을 사용한다.
  percent = ("%.3f%%" %((number/n)*100))
  list.append(percent)
# for문을 돌려서 각 클래스의 평군값을 한줄씩 나오게 한다.
for i in list:
  print(i)

 

 

다른 사람 풀이

 

# 예시 [5 50 50 70 80 100]
n = int(input())


# map = 리스트의 요소를 지정된 함수로 일괄처리
# range = for문의 요소를 자동으로 숫자 리스트로 만들어줌
for i in range(n):
    nums = list(map(int,input().split()))  # nums 변수에 리스트로 저장
    avg = sum(nums[1:])/nums[0]  # 평균 구하기
    count = 0
    for score in nums[1:]: 
        if score > avg : 
            count += 1  # 평균 이상인 학생의 수
    rate = count/nums[0] * 100
    
    print('%.3f%%' %rate) #반올림하여 소숫점 세자리까지 출력

내 코드보다 간단하고 학생수와 점수를 split한게 아니라 한 리스트에 두었다. list[1: ]는 리스트에서 index 1부터 마지막 숫자까지 불러온다. 이 값들을 sum()에 넣었을 때 저절로 더해지는것을 알 수 있었다. 이런 형식으로 코드를 사용했을 때 훨씬 간편하게 코딩할 수 있다.