https://www.acmicpc.net/problem/5800
문제를 풀면서 몰랐던 개념
- 정수 출력 값 옆에 바로 붙여서 쉼표를 출력하는 방법
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])
'백준 write-up > 정렬 & 그리디' 카테고리의 다른 글
[백준] 수 정렬하기 5 : 15688번 - Python (0) | 2021.07.21 |
---|---|
[백준] 통나무 건너뛰기 : 11497번 - Python (0) | 2021.07.21 |
[백준] 거북이 : 2959번 - Python (0) | 2021.07.19 |
[백준] 콘테스트 : 5576번 - Python (0) | 2021.07.19 |
[백준] 수 정렬하기 4 : 11931번 - Python (0) | 2021.07.19 |