일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스프링
- 배열
- Flutter
- 최단 경로
- php 프로그래밍 입문 예제
- 파이썬
- 한정 분기
- 자바 스프링
- php
- 백준
- spring
- 플러터
- programmers
- Java
- php 프로그래밍 입문
- php 프로그래밍
- JAVA SPRING
- php 프로그래밍 입문 솔루션
- 페이코 초대코드
- php 프로그래밍 입문 연습문제
- 페이코 추천인코드
- 자바
- php 프로그래밍 입문 3판
- 플러터 개발환경 설정
- SWEA
- C언어
- php 프로그래밍 입문 문제풀이
- C
- 페이코 친구코드
- 페이코 추천인
- Today
- Total
ImJay
[파이썬/Python] 백준 8979번 올림픽 본문
[파이썬/Python] 백준 8979번 올림픽
문제
올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.
- 금메달 수가 더 많은 나라
- 금메달 수가 같으면, 은메달 수가 더 많은 나라
- 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라
각 국가는 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차원 배열을 입력받는 방법에 대한 설명은 아래의 블로그를 참고하자.
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 함수에 대한 설명은 아래의 블로그를 참고하자.
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 함수의 활용법, 람다식, 인덱스 함수의 활용법, 슬라이싱의 활용법 등
파이썬 내장함수를 활용하는 다양한 방법들을 배워갈 수 있었다.
근데 이게 초등생 문제..? ㅋ.. 초졸 어렵다 ㅠ
'백준 - 문제집 > 대학생 기본반' 카테고리의 다른 글
[파이썬/Python] 백준 2606번 바이러스 (0) | 2023.01.19 |
---|---|
[파이썬/Python] 백준 11724번 연결 요소의 개수 (0) | 2023.01.17 |
[파이썬/Python] 백준 2816번 디지털 티비 (0) | 2023.01.16 |
[파이썬/Python] 백준 2621번 카드게임 (0) | 2023.01.09 |
[파이썬/Python] 백준 1652번 누울 자리를 찾아라 (0) | 2022.12.22 |