본문 바로가기
I can do it on my own!/백준

[백준] 4344번 파이썬(Python) feat.소수점 표현

by zivvon 2023. 5. 26.
목차 접기

문제

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력

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

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

출력

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


'문제 접근 및 오답 코드'

첫 번째 케이스 계산 시 "40.000%"가 출력되어야 하는데 "40.0%"가 출력되어 틀렸다.

 

따라서, rate의 값을 String형으로 형변환 해 문자열의 3번째 자리가 0이면 출력 시 round()값에 "00%"를 붙여 출력하게 했는데 '틀렸습니다.', ValueError, IndexError를 모두 맛 봤다. 그나저나 예제 출력처럼 똑같이 나왔는데 왜 틀렸을까 했더니 예를 들어 35.012일 수도 있지 않은가.. 정말 바보 같은 코드를 짜놨다 ^^;

 

'정답 코드'

c = int(input())

for _ in range(c):
    n = list(map(int, input().split()))
    sum = 0
  
    for score in n[1:]:
        sum += score

    avr = sum // (len(n) - 1)

    cnt = 0 #평균 넘는 학생들
    for score in n[1:]:
       if score > avr:
          cnt += 1

    rate = cnt / (len(n) - 1) * 100

    #반올림 해서 소수점 셋째 자리까지
    print('%.3f'%rate + "%")

 

'공부한 것'

[ 파이썬에서 소수점 표현하는 방법 ]

1. round() 함수 : round(값, 반올림 하려는 자릿수)

⚠️ round의 두 번째 매개변수는 반올림 하려는 자릿수로 실제 output은 두 번째 매개변수 값의 -1한 소수점 자릿수가 반환

⚠️ 소수점 두 번째 자리부터의 round() 함수 동작

  • 반올림 하는 값의 앞의 값이 홀수일 경우 : 0~5값은 내림, 6~9값은 올림
  • 반올림 하는 값의 앞의 값이 짝수일 경우 : 0~4값을 내림, 5~9값은 올림

⚠️ 소수점 첫 번째 자리에서 반올림 하기

  • 정수의 값 중 1의 자리의 수가 짝수일 경우 : 0~5값은 내림, 6~9값은 올림
  • 정수의 값 중 1의 자리의 수가 홀수일 경우 : 0~4값은 내림, 5~9값은 올림

 

2. 문자열 포맷팅 (String Formatting)

- % 서식문자

⚠️ 출력하길 원하는 값 앞에 반드시 % 붙이기

*이때 f는 실수를 출력할 때 사용하는 서식문자열

 

 

(1) %.nf : 소수점 n번째 자릿수까지 반올림한 값 출력

⚠️ 단, 전체 자릿수보다 더 많은 숫자를 지정하게 되면 남은 공간은 0을 채우면서 출력

pi = 3.141592

print('%.1f'%pi) # 1번째 자릿수까지 반올림
print('%.2f'%pi) # 2번째 자릿수까지 반올림
print('%.3f'%pi) # 3번째 자릿수까지 반올림

# 차례로 output
# 3.1
# 3.14
# 3.142

 

(2) %m.nf : 전체 m칸 공간을 마련하여 남은 앞 칸에 공백을 채워 소수점 n번째 자릿수까지 출력

⚠️ 칸을 셀 때는 소수점을 구분하는 '.'도 포함하여 셈

pi = 3.141592

# 총 공간 5칸
print('%5.1f'%pi)
print('%5.2f'%pi)
print('%5.3f'%pi)

# 차례대로 output
#   3.1
#  3.14
# 3.142

 

 

(3) %0m.nf : 전체 m칸 공간을 마련하여 남은 앞 칸에 0을 채워 소수점 n번째 자릿수까지 출력

⚠️ 칸을 셀 때는 소수점을 구분하는 '.'도 포함하여 셈

pi = 3.141592

# 전체 5칸, 남은 칸은 0으로 채우기
print('%05.1f'%pi)
print('%05.2f'%pi)
print('%05.3f'%pi)

# 차례대로 output
# 003.1
# 03.14
# 3.142

 

- format() 함수 :  ':' 콜론 앞에 가리키고자 하는 format 인자의 인덱스 값 넣어주기

print("{0:.1f} {1:.1f}".format(3.14, 1.12))

# ouput
# 3.1 1.1

위 예시처럼 콜론 앞 '0', '1'은 각각 format 함수의 매개변수 인덱스이다.

또한 ':' 콜론을 사용한다면 :.nf를 통해 n+1번째 자리에서 반올림 해 소수점 n번째 자리까지 출력 가능

 

- f-string  : 문자열 앞에 'f' 추가하고 중괄호 안에 {실수값:반올림 하려는 자릿수} 지정

⚠️ round() 함수와 마찬가지로 실제 output은 중괄호 안 오른쪽 값에 -1한 소수점 자릿수가 반환

 

pi = 3.141592

print(f"{pi:.0f}")
print(f"{pi:.1f}")
print(f"{pi:.2f}")
print(f"{pi:.3f}")
print(f"{pi:.4f}")

# 차례대로 output
# 3
# 3.1
# 3.14
# 3.142
# 3.1416

이때, round() 함수와 다른 점은 0번째 자리에서 반올림 한 값이 3.0이 아닌 3이라는 점이다.

또한 반올림 공식 또한 우리가 알고 있는 것과 같다.

 

'돌아보며'

생각보다 소수점을 다룰 수 있는 방법이 많음을 깨달았다.

특히 round() 함수의 동작을 직접 구현해보며 이상하다는 것을 알았는데, 실제 코딩테스트 현장에서는 빠르고 간결하게 코드를 쓰기 위해 문자열 포맷팅 방법 중 한 가지는 꼭 숙지해야겠다.