반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
12-26 11:42
관리 메뉴

ImJay

[파이썬/Python] 백준 8979번 올림픽 본문

백준 - 문제집/대학생 기본반

[파이썬/Python] 백준 8979번 올림픽

ImJay 2023. 1. 16. 15:28
반응형

[파이썬/Python] 백준 8979번 올림픽

 

8979번: 올림픽

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각

www.acmicpc.net


문제

올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.

  1. 금메달 수가 더 많은 나라 
  2. 금메달 수가 같으면, 은메달 수가 더 많은 나라
  3. 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라 

각 국가는 1부터 N 사이의 정수로 표현된다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다. 

각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오. 

 

해설

1. 국가, 각 메달 수를 분리하여 입력 받아 저장한다.

2. 메달 수에 따라 내림차순으로 정렬한다.

3. 찾고자하는 국가가 해당하는 인덱스를 확인한다.

4. 해당 인덱스와 메달 수가 동일한 국가를 찾아 해당 인덱스+1 을 출력한다.

- 동점일 경우를 위해 필요한 작업이다.

- 1등이 인덱스 0이므로 +1이 필요하다.

 

코드

N, K = map(int, input().split())

medals = [list(map(int, input().split())) for _ in range(N)]
    
medals.sort(key = lambda x : (x[1], x[2], x[3]), reverse=True)

idx = [medals[i][0] for i in range(N)].index(K)

for i in range(N):
    if medals[idx][1:] == medals[i][1:]:
        print(i+1)
        break

 

풀이

N, K = map(int, input().split())

1. 국가의 수 N과 등수를 알고 싶은 국가 K를 입력 받는다.

 

medals = [list(map(int, input().split())) for _ in range(N)]

2. 국가의 수 N 만큼 국가들의 메달 수를 입력 받아 리스트에 저장해준다.

 

- medals[0][0] : 0번째 국가의 국가이름

- medals[1][1] : 1번째 국가의 금메달 수

위와 같은 형태로 저장된다.

 

2차원 배열을 입력받는 방법에 대한 설명은 아래의 블로그를 참고하자.

 

[Python] 2차원 배열 입력받기

안녕하세요! daily_D 입니다! 👩🏻‍💻 오늘은 Python 으로 2차원 배열 입력받는 방법에 대해 공부해봐요! 파이썬에서 2차원 배열을 입력받는 방법은 3가지가 있습니다. 아래의 그림과 같이, 가로 A

dailylifeofdeveloper.tistory.com

 

medals.sort(key = lambda x : (x[1], x[2], x[3]), reverse=True)

3. 메달 수에 따라 내림차순으로 정렬한다.

sort 메소드의 key 옵션으로 lambda 함수를 사용한다. x[1], x[2], x[3] 은 각각 금메달, 은메달, 동메달이다.금메달의 수가 같을 경우, 은메달, 또 같을 경우 동메달의 수에 따라 내림차순(reverse=True)으로 정렬해준다.

 

파이썬의 sort 함수에 대한 설명은 아래의 블로그를 참고하자.

 

파이썬 정렬 함수 sort, sorted _ key = lambda, function / reverse= 파라미터 이용 방법 (Python)

파이썬 정렬 함수 - 순서 - 1. sort 2. sorted 3. reverse 사용 예시 4. key function, lambda 사용방법 1. sort 원본을 변형시켜 정렬한다. '변수. sort( )' 형태로 사용. 정렬 기준은 문자열은 알파벳, 가나다순이고

ooyoung.tistory.com

 

idx = [medals[i][0] for i in range(N)].index(K)

4. 국가 K에 해당하는 인덱스를 찾아야한다.

0부터 N-1 인덱스까지 medals[i][0], 즉 국가명을 확인하여 국가명이 'K'와 일치하는 인덱스를 찾아 idx에 저장한다.

 

for i in range(N):
    if medals[idx][1:] == medals[i][1:]:
        print(i+1)
        break

5. 동점국가가 존재하는지 검사해준다.

N개의 국가를 확인해서 만약 국가 K의 메달 수와 일치하는 국가가 존재한다면, 그 인덱스의 +1이 등수가 될 것이다.

일치하는게 본인일 경우는 동점자의 첫번째 인덱스 순위이거나 동점자가 없을 경우일 것이다.

 

피드백

2차원 배열을 입력 받는 방법, sort 함수의 활용법, 람다식, 인덱스 함수의 활용법, 슬라이싱의 활용법 등

파이썬 내장함수를 활용하는 다양한 방법들을 배워갈 수 있었다.

근데 이게 초등생 문제..? ㅋ.. 초졸 어렵다 ㅠ

 

 

반응형
Comments