본문 바로가기

개발일지/TIL

TIL 23-06-22 백준 - 평균은 넘겠지 python 오사오입

1.백준 - 평균은 넘겠지

 문제점

풀었던 문제였으나 데이터가 추가되면서 기존 코드로는 정답이 불가능함

 시도해 본 것들

반례를 기준으로 기존 출력 확인하기 

20.312%출력 확인 

 

format 대신 round 사용 시도 

format과 같은 결과 출력 

 

소수점을 하나 더 받고, if문으로 처리하기 

기존 코드 

    over_score_ratio = format(
        len([i for i in scores if i > average_score]) / len(scores) * 100, ".3f"
    )
    print(f"{over_score_ratio}%")

 

수정된 코드 

# 사사오입 코드
    over_score_ratio = list(
        str(
            format(
                len([i for i in scores if i > average_score]) / len(scores) * 100, ".4f"
            )
        )
    )
    if int(over_score_ratio[-1]) >= 5:
        over_score_ratio[-2] = str(int(over_score_ratio[-2]) + 1)
    print(f"{''.join(over_score_ratio[:-1])}%")

제시된 반례는 해결했지만, 그리 마음에 드는 구조는 아닌 것 같다. 

 

반올림 검색하기 

오사오입 키워드 확인 

https://ko.wikipedia.org/wiki/%EB%B0%98%EC%98%AC%EB%A6%BC

 해결 방법

친숙한 사사오입으로 올림기준 만들기 

# 사사오입 코드
a = int(input())
for _ in range(a):
    scores = list(map(int, (input().split())))
    students = scores.pop(0)
    total_score = sum(scores)
    average_score = total_score // students
    over_score_ratio = list(
        str(
            format(
                len([i for i in scores if i > average_score]) / len(scores) * 100, ".4f"
            )
        )
    )
    if int(over_score_ratio[-1]) >= 5:
        over_score_ratio[-2] = str(int(over_score_ratio[-2]) + 1)
    print(f"{''.join(over_score_ratio[:-1])}%")

 

python 내장 올림법 오사오입으로 올림하기 

# 오사오입 코드
a = int(input())
for _ in range(a):
    scores = list(map(int, (input().split())))
    students = scores.pop(0)
    total_score = sum(scores)
    average_score = total_score // students
    over_score_ratio = list(
        str(
            format(
                len([i for i in scores if i > average_score]) / len(scores) * 100, ".4f"
            )
        )
    )
    # 이 부분에서 int(over_score_ratio[-2]) % 2 != 0이 python에서 round나 format을 하게되면 적용되는 로직이 된다.
    if int(over_score_ratio[-2]) % 2 != 0 and int(over_score_ratio[-1]) >= 5:
        over_score_ratio[-2] = str(int(over_score_ratio[-2]) + 1)
    print(f"{''.join(over_score_ratio[:-1])}%")

 알게 된 점

오사오입의 정확한 원리는 아직 이해하기 어렵지만, 일반적으로 사용하는 사사오입보다 정확한 값을 나타낸다고 한다.