티스토리 뷰

 

이번 포스팅은 백준 알고리즘 사이트의 4344번 평균은 넘겠지 문제를 Python 언어로 코딩해보도록 하겠습니다. 아래 url로 접속하시면 문제를 볼 수 있습니다.

 

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

 

이번 포스팅은 지난 포스팅과 같은 단계로 if문 사용해보기 단계입니다.

 

 

이 문제의 경우 입력 받을 케이스 수 C와 각 케이스에서 입력 받을 학생의 수 N, 그리고 N명의 각 점수를 입력 받아 각 케이스마다 평균을 넘는 학생들의 비율을 소수점 셋째자리까지 구해 출력하는 문제입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
num = int(input())
avg = []
for i in range(num):
        sco = list(map(int,input().split()))
        stu = sco[0]
        del sco[0]
        sum = 0
        cnt = 0
        
        for j in sco:
                sum += j
        avg.append(sum/stu)
 
        for j in sco:
                if j > avg[i]:
                        cnt = cnt+1
        avg[i] = cnt/stu*100
        
for i in range(len(avg)):
        print("%.3f%%" %round(avg[i], 3))

 

먼저 케이스의 개수를 입력 받을 num, 각 케이스 별 평균을 저장할 avg를 빈 List로 초기화해줍니다.

 

각 케이스에 해당하는 학생의 수와 학생의 수 만큼의 점수를 받아야하기에 sco라는 List형을 지정하고 map(int, input().split) 코드를 통해 int형 수를 list형 sco에 담아줍니다.

 

예시를 보면 한줄에 학생 수와 점수를 모두 받아야 하기에 sco List의 첫 값은 학생수가 되어야 해서 stu 변수에 sco[0]값을 전달하여 주고 del을 통해 sco[0]을 삭제하여줍니다.

 

이후 점수를 더해줄 sum 변수와 cnt 변수를 0으로 초기화 하고, for문을 이용해 sco만큼 반복하여 sum 변수에 sco 각 값을 더해줍니다.

 

저는 각 케이스 별 평균을 avg라는 List형에 저장하길 원하기에 avg.append(sum/stu) 코드를 이용해 avg 리스트에 평균값을 저장하여줍니다.

 

이중 for문을 통해 각 케이스 별로 평균이 넘는 학생의 수를 알기 위해서 각 케이스별 평균값 avg보다 sco 점수가 높으면 cnt의 값을 하나씩 늘려주게 됩니다.

 

변수를 더 사용하지 않고 값을 출력하기 위해 평균 이상 점수를 가진 학생의 퍼센트를 평균을 저장한 avg에 저장하여 주고, 소수점 셋째자리의 값까지 출력시키기 위해 round 함수를 사용해 값을 출력 해줍니다.

 

python의 round함수는 반올림을 위한 함수로 round(반올림 할 값, 반올림 위치 지정) 형식으로 사용해주시면 됩니다.

 

 

위의 코드를 보시면 불필요한 코드가 많아 수정하여 조금 더 짧고 효율적인 코드를 작성할 수 있을 것 같아 아래와 같은 코드로 다시 작성해보았습니다.

 

1
2
3
4
5
6
7
8
9
num = int(input())
for i in range(num):
    sco = list(map(int, input().split()))
    avg = sum(sco[1:]) / sco[0]
    cnt = 0
    for j in sco[1:]:
        if j > avg:
            cnt += 1
    print("%.3f%%" %round(cnt/sco[0]*1003))

 

num = int(input) 코드를 통해 케이스의 수를 입력 받고, for문을 num 만큼 반복하여 줍니다.

 

List형을 통해 각 케이스의 학생 수와 해당 학생 수 만큼의 점수를 입력 받아주는데, 위의 코드와 다른 점은 학생 수를 다른 변수에 저장하지 않고 sco[0] 값이 학생 수 임을 가지고 가다는 점입니다.

 

또한 평균을 저장하는 avg를 List가 아닌 일반 변수로 받고, avg값은 sum(sco[1:])/sco[0] 로 저장해줍니다. python의 sum 함수를 이용해 sco List에 있는 1번째 값부터 마지막 값까지를 다 더하고 sco[0]의 값인 학생수만큼 나눠주는 코드입니다.

 

이후 cnt를 0으로 초기화 하고, for문을 이용해 sco의 1번째 값부터 마지막 값까지를 반복하여 출력해 avg보다 큰 값이 있을 때는 cnt를 1씩 증가시켜주는 코드입니다.

 

마지막으로 print와 round를 이용해 최종 값을 출력해 줄 수 있습니다.

 

 

이번 포스팅에서는 한 문제를 풀 수 있는 코드에 대해 2가지 방법으로 작성해 보았습니다. 첫번째 코드는 제가 이 문제를 보고 바로 작성한 코드로 불필요한 부분이 있고, 줄여서 작성할 수 있는 부분에 대해 고려하지 않아 작성한 것이고, 두번째 코드는 그를 보완하여 더욱 짧고 효율적으로 작성한 코드입니다.

 

문제를 해결하는 방법에는 여러가지가 있지만, 코드를 더욱 간결하게 작성하여 효율적이고 강력한 코드를 작성하는 연습을 하는 것도 중요하다고 생각합니다.

 

 

다음 포스팅에서는 다음 단계의 문제를 풀어보도록 하겠습니다.

 

다음 포스팅에서 봐요 :))

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함