morijwana
수로그
morijwana
전체 방문자
오늘
어제
  • 분류 전체보기
    • 강의노트
    • Machine Learning
      • Pandas
      • NLP
    • Computer Science
      • Linux
      • TIL
    • Development
      • React
      • Swift
      • Javascript
    • 스터디 기록
      • Clean Code
      • 구글 BERT의 정석
      • 개발도서
      • 기타
    • Problem Solving
      • Baekjoon
      • ICPC Sinchon
    • 끄적
      • 끄적끄적
      • 요리왕

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • gdsc
  • 프레임워크없는프론트엔드개발
  • GDSC Sookmyung
  • 프로그래밍언어론
  • 데이터사이언스
  • 구글BERT의정석
  • Solution Challenge
  • cs224n
  • 자연어처리
  • Python
  • 개발도서
  • nlp
  • 백준
  • ML
  • Bert
  • Pandas
  • 구부정스터디
  • 민트하임스터디
  • 회고
  • word2vec

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
morijwana

수로그

Problem Solving/ICPC Sinchon

백준 10825번 - 국영수(C++, Python - lambda)

2020. 7. 29. 14:37

문제

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

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

풀이

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
    'Problem Solving/ICPC Sinchon' 카테고리의 다른 글
    • 백준 11582번 - 치킨 TOP N(C++)
    • 백준 1248번 - 맞춰봐(Python)
    • 백준 15811번 - 복면산!?(Python)
    morijwana
    morijwana
    행복한 휴학생의 devlog

    티스토리툴바