뚝딱햄 탈출기

[Python][백준 BOJ Bronze I] 4344. 평균은 넘겠지 : f-string 소수점 출력 포맷팅, 배열 슬라이싱 본문

Algorithm & Data structure/알고리즘 문제 풀이

[Python][백준 BOJ Bronze I] 4344. 평균은 넘겠지 : f-string 소수점 출력 포맷팅, 배열 슬라이싱

hyrmzz1 2023. 12. 14. 19:32

 

핀토스에 절여진 뇌를 부여잡고 오랜만에 알고리즘 풀었당!👩‍💻

수월하게 풀었지만 백분율 출력 방식에 대해 배워 포스팅을 끄적여본다✍️

접근 방식

  1. 한 줄씩 입력 받고 (c 줄 만큼)
  2. 각 줄의 평균 점수를 구해서
  3. 각각의 점수가 평균치를 넘으면 cnt += 1
  4. 학생 수에 대한 cnt의 비율을 출력한다.

비율은 반올림해 소수점 셋째 자리까지 출력해야 한다. => f-string 이용

✅ Solution 1

import sys
c = int(sys.stdin.readline())    # tc 개수

for _ in range(c):
    n = list(map(int, sys.stdin.readline().split()))
    avg = (sum(n) - n[0]) / n[0]
    cnt = 0
    for i in range(1, len(n)):
        if n[i] > avg:
            cnt += 1
    rate = cnt * 100 / n[0]
    print(f'{rate:.3f}%')

변수를 원하는 포맷으로 출력하고 싶다면 아래의 형식처럼 작성하면 된다.

print(f'{변수:타입 지시자}')

소숫점 자리수 포맷팅을 하기 위해서는 .3f와 같이 타입 지시자를 작성하면 된다. .3은 소수점 셋째 자리까지, f는 float을 의미한다.

소숫점 둘째 자리까지만 출력하고 싶다면 .2f와 같이 작성해주면 된다.

 

f-string으로 퍼센트 포맷팅도 가능하다. 현재 코드처럼 %를 밖에 작성할 필요 없이 타입 지시자를 .3%로 작성하면 된다.

import sys
c = int(sys.stdin.readline())    # tc 개수

for _ in range(c):
    n = list(map(int, sys.stdin.readline().split()))
    avg = (sum(n) - n[0]) / n[0]
    cnt = 0
    for i in range(1, len(n)):
        if n[i] > avg:
            cnt += 1
    rate = cnt * 100 / n[0]
    print(f'{rate:.3%}')

✅ Solution 2 - 슬라이싱 이용

슬라이싱을 떠올리지 못한 상태로 Solution 1처럼 구현했는데,

Solution 2에서는 avg를 초기화할 때와 for문에서 범위를 지정할 때 슬라이싱을 이용했다.

import sys
c = int(sys.stdin.readline())    # tc 개수

for _ in range(c):
    n = list(map(int, sys.stdin.readline().split()))
    avg = sum(n[1:]) / n[0]	# avg = (sum(n) - n[0]) / n[0]
    cnt = 0
    for i in n[1:]:	# for i in range(1, len(n)):
        if i > avg:	# if n[i] > avg
            cnt += 1
    rate = cnt * 100 / n[0]
    print(f'{rate:.3%}')

💭What I learned

  1. 배열의 특성인 인덱싱과 슬라이싱을 잘 활용하자
  2. for문에서 범위를 지정할 때에도 슬라이싱을 활용한다.
  3. 소수점 아래까지 출력해야 할 때 f-string을 사용한다.

https://www.acmicpc.net/problem/4344

 

4344번: 평균은 넘겠지

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다. 정답과 출력값의 절대/상대 오차는 10-3이하이면 정답이다.

www.acmicpc.net

 

Comments