# 3. APS/백준

백준 # Python_lambda/우선순위 큐_14593_2017 아주대학교 프로그래밍 경시대회 (Large)

둥굴둥굴둥굴레차 2021. 5. 7. 22:51

😀 [문제]

아주대학교 프로그래밍 경시대회(Ajou Programming Contest, APC)는 2009년 제1회를 시작으로 2014년 제6회까지 개최된 아주대학교 학생들을 위한 프로그래밍 경시대회이다. 2017년, 다른 학교에서 활발히 진행되는 교내 대회를 보던 현정이는 3년 만에 APC를 부활시키기로 결심했다.

2017 APC 운영 방식은 다음과 같다.

  • 문제는 Small 데이터와 Large 데이터로 이루어져 있다.
  • 문제를 풀기 위해서는 입력 파일을 다운로드 받고, 5분 이내로 이에 맞는 출력 파일과 소스 코드를 업로드해야 한다.
  • Small 데이터 문제를 해결해야 Large 데이터 입력 파일을 다운로드할 수 있다.
  • 각 문제의 Small, Large 데이터를 해결하면 점수를 얻을 수 있으며, 이 점수는 각각 다르다.
  • 제출 횟수는 점수를 획득한 문제를 맞기 까지 인풋을 다운로드한 횟수의 총합이다.
  • 즉, 점수를 획득하지 못한 문제의 다운로드 횟수는 포함되지 않는다.

위 운영 방식에 따라 순위는 다음과 같이 결정된다.

  • 해결한 문제 점수의 총합이 높은 참가자가 더 높은 순위를 가진다.
  • 점수의 총합이 같은 경우, 제출 횟수가 적은 참가자가 더 높은 순위를 가진다.
  • 점수의 총합과 제출 횟수가 같은 경우, 마지막으로 점수를 획득한 문제의 업로드 시간이 빠른 참가자가 더 높은 순위를 가진다.

매우 유감스럽게도 현정이는 며칠째 잠을 제대로 자지 못해 흉폭해져있다. 현정이의 일을 덜어 잠깐이라도 잘 수 있도록 참가자들의 순위를 계산하는 프로그램을 작성해주자.

 

😙 [입력]

첫 번째 줄에는 참가자의 수를 나타내는 자연수 N (1 ≤ N ≤ 10,000) 이 주어진다.

두 번째 줄부터 N 개의 줄에 걸쳐 세개의 정수 Si, Ci, Li (0 ≤ Si ≤ 620, 0 ≤ Ci ≤ 50, 0 ≤ Li ≤ 179)가 주어진다.

(1+i) 번째 줄의 각 값은 차례로 i 번째 참가자의 점수, 제출 횟수, 마지막으로 점수를 획득한 문제의 업로드 시간을 나타낸다. 세 값이 모두 같은 참가자는 존재하지 않는다.

 

🤗 [출력]

1등을 하는 참가자의 번호를 한 줄에 출력한다.

 

😍 [input 1]

2

620 7 179

300 5 100

 

🥰 [output 1]

1

 

😜 [input 1]

3

300 5 100

620 7 179

600 9 150

 

😛 [output 1]

2

 

😎 [알고리즘 분류]

 

 

14593번: 2017 아주대학교 프로그래밍 경시대회 (Large)

아주대학교 프로그래밍 경시대회(Ajou Programming Contest, APC)는 2009년 제1회를 시작으로 2014년 제6회까지 개최된 아주대학교 학생들을 위한 프로그래밍 경시대회이다. 2017년, 다른 학교에서 활발히

www.acmicpc.net


🤔 [나의 풀이]

## [정답입니다]

import sys
sys.stdin = open("input.txt")

participant = int(sys.stdin.readline())

value = [list(map(int, sys.stdin.readline().split())) for _ in range(participant)]

sorted_value = sorted(value, key=lambda x:(-x[0], x[1], x[2]))

print(value.index(sorted_value[0])+1)

 

 

🤠 [친구 풀이]

import sys

N = int(sys.stdin.readline())

MaxS = 0
MinC = 51
MinL = 180

result = 0

for i in range(N):
	S, C, L = map(int, input().split())
    
    if S > MaxS : 
    	MaxS = S
        MinC = C
        MinL = L
        result = i+1
    
    if S == MaxS :
    	if C < MinC : 
       	 MaxS = S
       	 MinC = C
       	 MinL = L
       	 result = i+1
        
        elif C == MinC:
        	if L < MinL:
            	 MaxS = S
                 MinC = C
            	 MinL = L
                 result = i+1
  
print(result)

 


람다(lambda)함수란?

람다 함수는 익명 함수이다. 

함수를 사용하는 대신 이름은 정해주지 않고 그냥 일회성으로 쓰기 위해 사용한다. 

 

lambda 함수의 형태

 

## x와 y를 곱해서 반환해주는 간단한 람다함수 예시

a = lambda x , y : x * y 

print a(3,4) 
>> 12

 

key function을 lambda로 선언해서, 기본적으로 제공해주는 sorting algorithm이 돌아갈 수 있도록 해주자

## 제곱수가 가장 작은 순서대로 소팅을 하고 싶다.

a = [ -1, -8, 3, -4, 2, 5, -7]

a.sorted(key=lambda x : x*x,reverse=False) 

>> print a
[-1,2,3,-4,5,-7,8]

 

람다 함수의 장점?

    1. 코드량이 줄어든다

    2. 생각의 흐름을 방해받지 않고 물 흐르듯이 드를 짤 수 있다

 

람다 함수 우선순위

비교할 아이템이 요소가 여러 개일 경우, 튜플로 우선순위를 정해줄 수 있다.
기본적으로 오름차순으로 정렬되며 - 를 붙이면 내림차순으로 정렬된다.

e = sorted(a, key = lambda x : (x[0], -x[1]))
# e = [(0, 1), (1, 2), (3, 0), (5, 2), (5, 1)]

f = sorted(a, key = lambda x : -x[0])
# f = [(5, 1), (5, 2), (3, 0), (1, 2), (0, 1)]

 

[참고]

위의 람다 함수 개념은 아래의 블로그를 참고하여 작성하였습니다.

 

파이썬 람다(lambda) 함수

lambda 함수는 무엇일까요..  람다 함수는 람다 대수학(lambda calculus)에서 유래된 이름입니다만, 대부분의 사람들은 lambda란 용어가 사실 익숙치가 않습니다.  간단하게 이해하기 쉬운용어로 이것

pyengine.blogspot.com

 

'# 3. APS > 백준' 카테고리의 다른 글

백준 # Python_2750_수 정렬하기  (0) 2021.07.30
백준 # Python_10872_팩토리얼  (0) 2021.07.30
백준 # Python_10845_큐  (0) 2021.05.05
백준 # Python_10828_스택  (0) 2021.05.05
백준 # Python_2161_카드1  (0) 2021.05.05