본문 바로가기

코딩테스트 준비 with Python/내가 보려고 정리하는 문풀

대표값

N개의 점수가 주어진다. N개의 점수의 평균을 구하고 N개의 숫자 중 평균에 가장 가까운 숫자는 몇번째 인지(*인덱스+1) 구하는 프로그램 작성.

만약에 가장 가까운 값이 여러개인 경우, 더 높은 점수를 선택해야함

만약에 같은 점수가 여러개 인경우, 번호가 빠른 점수를 선택해야함

*평균은 소수첫째자리에서 반올림, 즉 정수로 만들어야함

 

입력예시)

10

45 73 66 87 92 67 75 79 75 80

 

출력예시)74 7


내가 쓴 코드

N = int(input())
lst = list(map(int, input().split()))

avg = round(sum(lst)/N)

closestDiff = abs(avg - lst[0])
closest = lst[0]

for i in range(1, len(lst)):
    if abs(avg - lst[i]) <= closestDiff:
        closestDiff = abs(avg - lst[i])
        if abs(avg-lst[i]) == closestDiff:
            closest = max(closest,lst[i])
        else:
            closest = lst[i]

print(avg, lst.index(closest)+1)

모범답안

n = int(input())
a = list(map(int, input().split()))

ave = int((sum(a)/n)+0.5)

min = 2147000000
#정수형의 가장 큰 값

for idx, x in enumerate(a):
    tmp = abs(x-ave)
    if tmp < min:
        min = tmp
        score = x
        res = idx + 1
    elif tmp == min:
        if x > score:
            score = x
            res = idx + 1
            # 점수 같은게 여러개인경우 번호가 빠른거를 선택해야하는 조건도 충족
            # 근데 굳이? 걍 index쓰면 될듯
            
print(ave, res)

모범답안 보고 든 생각

우선, 리스트의 인덱스값과 실제 값을 튜플 쌍으로 표현하여 활용할 수 있도록 하는
enumerate(lst)를 사용하면 더 효율적 이었을듯 싶다.
그런데? 한번도 안써본거니까 ㅜㅜ 써볼 생각이 들 수가 있었는가? 없지
그러므로 기죽지말고 앞으로 써보면서 활용능력을 기르면 되는 것!

다음으로 round 함수에 대한 나의 멍청함!
실은 멍청한건 아니지 누가 round 함수가 우리가 아는 일반적인 반올림을 하지 않을거라고
예상했겠는가? 
round 함수는 숫자가 정확히 반(half)일때, 짝수 쪽으로 바꾼다.
ex) 4.5 => 4가되고, 5.5 => 6이 되는 것
우리가 생각하는 일반적인 반올림을 구현하기 위해서는
round(value)가 아니라 int(value+0.5)가 정확한 표현 방법일 것이다.

아, 그리고 애초에 차이 절댓값이 작거나 같은 조건문에서 이중if로 같은 경우를 뽑아내는 것보다
elif를 이용해서 다중조건을 사용하지 않고도 해결할 수 있었을 것..
근데 내가 한 방법이 그렇게 구린걸까? ㅜㅜ

근데 리스트의 내장함수 index가 가장 첫번째로 나오는 인덱스를 가져온다는 특징을
이용하여 똑같은 점수가 여러개인경우 번호가 빠른 것을 추출해야한다는 조건을
충족시킨점은 칭찬해주고싶다. 내장함수에 대한 깊은 이해를 가진 우니!
하지만? 모범답안에서는 반복문 내에서 자연스럽게 처리했지..
쌤쌤으로 하자. 왜냐면 난 인덱스 변수는 설정을 안했으니까
그리고 난 굳건히 인덱스 변수 설정안하고 다시 풀랭.


다시 써보기

N = int(input())
lst = list(map(int, input().split()))

avg = int((sum(lst)/N) + 0.5)
closest = lst[0]
closestDiff = abs(avg - lst[0])
closest = lst[0]

for idx, x in enumerate(lst):
    diff = abs(avg - x)
    if diff < closestDiff:
        closestDiff = diff
        closest = x
    elif diff == closestDiff:
        closest = max(closest, x)

print(avg, lst.index(closest)+1)

 

'코딩테스트 준비 with Python > 내가 보려고 정리하는 문풀' 카테고리의 다른 글

자릿수의 합  (2) 2024.06.08
정다면체  (0) 2024.06.07
K번째 큰 수  (0) 2024.06.06
K번째 수  (0) 2024.06.06
K번째 약수  (0) 2024.06.06