문제
https://www.acmicpc.net/problem/10825
풀이
C++에서는 학생 구조체 배열을 만들어 이름과 국어, 영어, 수학 점수를 저장한 다음 compare 함수를 통해 조건에 맞게 정렬한다.
Python에서는 lambda 함수를 이용해서 정렬할 수 있다. wow
나의 코드 - C++
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct person {
char name[11];
int guger;
int math;
int eng;
} member [100000];
bool cmp(struct person a, struct person b) {
if (a.guger == b.guger) {
if (a.eng == b.eng) {
if (a.math == b.math) {
if (strcmp(a.name, b.name) < 0) return true;
else return false;
} else
return a.math > b.math;
} else
return a.eng < b.eng;
} else
return a.guger > b.guger;
}
int main(int argc, const char * argv[]) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s %d %d %d", member[i].name, &member[i].guger, &member[i].eng, &member[i].math);
}
sort(member, member + n, cmp);
for (int i = 0; i < n; i++) {
printf("%s\n", member[i].name);
}
}
최대 100000명의 학생이 입력으로 들어오기 때문에 크기 100000의 학생 구조체 배열을 생성했다. 이름, 국어, 영어, 수학 점수 순으로 입력을 받아 구조체에 저장했고, sort 함수의 마지막 인자로 cmp 함수를 집어넣어 규칙대로 정렬할 수 있도록 했다.
cmp()에서 기억해둬야 할 점이 char 배열로 선언된 문자열끼리는 비교 연산자로 비교할 수 없다는 점이다. 점수가 모두 같으면 이름 가지고 사전순으로 정렬을 해야 하는데, a.name < b.name
이런 식으로 코드를 작성하면 안된다는 거다. 저렇게 코드를 작성하게 되면 메모리상 주소값의 크기로 비교를 하기 때문에 이상한 순서로 정렬이 된다(https://www.acmicpc.net/board/view/44165). 따라서 strcmp()
함수를 통해 비교해주어야 한다.strcmp()
의 리턴 값이 0인 경우는 두 문자열이 같은 경우이고, -1인 경우는 첫 번째 문자열이 두 번째 문자열보다 사전순으로 앞에 있는 경우이고, 1인 경우는 그 반대이다. 이 점을 유의해서 코드를 작성하면 된다.
강사님의 코드 - Python lambda 이용
import sys
input = sys.stdin.readline
n = int(input())
arr = []
for i in range(n):
n, k, e, m = input().split()
arr.append([n, int(k), int(e), int(m)])
arr.sort(key=lambda x: (x:(-x[1], x[2], -x[3], x[0])) // 오늘의 포인트
for i in arr:
print(i[0])
lambda 관련 문서: https://wikidocs.net/64
비교 우선순위대로 x: 뒤의 식을 작성해주면 되는 것 같다. 국어(x[1]), 수학(x[3]) 점수는 -
를 붙여 역순으로 비교할 수 있도록 했다.
lambda를 쓰니 코드가 훨씬 간결해지는 것 같다. 하지만 능숙하게 사용하려면 많은 연습이 필요할 듯하다.
'Problem Solving > ICPC Sinchon' 카테고리의 다른 글
백준 11582번 - 치킨 TOP N(C++) (1) | 2020.07.29 |
---|---|
백준 1248번 - 맞춰봐(Python) (0) | 2020.07.22 |
백준 15811번 - 복면산!?(Python) (0) | 2020.07.19 |