본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 성적 통계 : 5800번 - Python

728x90
반응형

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

 

5800번: 성적 통계

첫째 줄에 중덕 고등학교에 있는 반의 수 K (1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 각 반의 학생수 N (2 ≤ N ≤ 50)과 각 학생의 수학 성적이 주어진다. 시험 성적은 0보다 크거나 같고, 100보다

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

- 정수 출력 값 옆에 바로 붙여서 쉼표를 출력하는 방법

print("Max", str(save[i][0])+',', "Min", str(save[i][1])+',',
     "Largest gap", save[i][2])

: 정수 출력 값을 문자열로 바꿔주어서 출력해야 한다!!!

 

 

 

문제의 접근 방법

 

- 둘째 줄에 입력 받는 학생수와 수학 성적을 분리할 수 있는 방법 생각해보기

- 예시에 나와있는 것처럼 i가지의 케이스의 결과 출력이 꼭 한번에 되어야 할 필요는 없음

- 최솟값, 최댓값 구하는 방법 생각해보기

 

 

 

내가 막혔던 부분

 

(1) 간결하게 구현하는 방법

(2) for문 안에서 돌아가는 결과값들이 초기화 되지 않고 저장되어 출력되는 방법

(3) 쉼표(문자열)을 정수 옆에 붙여서 출력하는 방법

(4) 첫 번째로 입력 받은 수(학생 수)와 그 이후로 입력받은 수(학생들의 점수)를 분리해서 리스트에 저장하는 방법

 

 

 

문제 풀이 방법

 

(1) 고등학교에 있는 반의 수 K 입력받기

(2) K번 만큼 학생들의 수와 점수들을 입력받아서 X에 저장한다

(3) 학생들의 수(첫 번째 인덱스 값)를 제외하고 점수들만 가지고 내림차순 정렬 및 최대, 최소 값을 구해야 하기 때문에 len(X)-1번만큼의 반복문을 돌려서 두번째 인덱스 값부터 arr 리스트에(미리 선언) 저장한다.

(4) 내림차순 정렬 후 max()와 min() 함수를 이용해서 최댓값과 최솟값을 찾는다.

(5) 변수 result를 초기화 하고, 첫번째 인덱스와 그 다음 인덱스의 차(절댓값)들을 len(X)-2번만큼 비교해서 가장 큰 값(차이가 가장 큰 것)을 result에 저장한다.

(6) 전역변수로 미리 선언했던 save 리스트에 앞서 구했던 최댓값(maxx), 최솟값(minn), 가장 큰 점수의 차이(result)를 2차원 배열로 추가한다.

(7) Class가 K번 만큼 1부터 1씩 증가한다고 했기 때문에 K번만큼의 반복문을 돌리고 i+1(1부터 출력되게 하기 위함)을 출력해주고, 그 다음 줄에는 앞서 저장해두었던 save 리스트를 인덱스 값을 주어서 출력해준다.

 * 출력 형식에 맞게 쉼표가 숫자 바로 옆에 붙어서 출력될 수 있게 문자열로 형변환을 시켜준 후 '+' 기호를 통해 추가해준다.

 

 

 

다른 사람의 풀이

 

조금 비효율적인 코드라고 생각해서 다른 사람들이 구현하신 코드들도 공부해보았다.

 

*알게된 사실*

(1) 학생들의 수와 점수를 구분하기 위해 리스트를 하나 생성해서 반복문을 통해 두번째 인덱스부터 추가하여 저장

-> del 메소드를 통해서 0번째 인덱스 제거.

(2) 한 번에 값들을 출력하기 위해 save 리스트를 만들어서 반복문이 한 번 돌 때마다 생겨나는 값들을 저장해서 출력

-> 그때 그때 print문을 사용해서 출력 가능.

(3) 내림차순으로 정렬 후 max함수를 사용해서 차이들을 일일히 비교해본 후 가장 큰 값 출력 & result 변수에 저장

-> 처음에 한 번 오름차순 정렬 한 후, 차이들을 구하는 반복문을 이용해 그것들을 리스트에 추가 & 따로 변수를 선언할 필요 없이 출력과정에서 바로 max, min 함수를 사용해서 값을 도출해내기

K = int(input())

for i in range(K):

    X = list(map(int, input().split()))
    del X[0]
    X.sort()
    arr = []
    print('Class', i+1)
    for i in range(len(X)-1):
        arr.append(X[i+1] - X[i])

    print('Max', str(max(X))+',' ,'Min', str(min(X))+',', 'Largest gap', max(arr))

 

 

 

소스코드

K = int(input())

save = []

for _ in range(K):

    arr = []
    maxx = 0
    minn = 0

    X = list(map(int, input().split()))

    for i in range(len(X)-1):
        arr.append(X[i+1])

    arr.sort(reverse=True)
    maxx = max(arr)
    minn = min(arr)

    result = 0

    for j in range(len(X)-2):
        result = max(result, abs(arr[j]-arr[j+1]))

    save.append([maxx,minn,result])

for i in range(K):
    print("Class", i+1)
    print("Max", str(save[i][0])+',', "Min", str(save[i][1])+',',
     "Largest gap", save[i][2])
728x90
반응형