[Algorithm] 8979. 올림픽

유지민·2024년 1월 29일
0

Algorithm

목록 보기
12/75
post-thumbnail

8979. 올림픽

8979 문제 보기

접근 방식

이 문제는 Python에서 제공하는 기본적인 슬라이싱 방법과 sort에 key를 넘겨주는 방식을 잘 알고 있으면 비교적 쉽게 풀이할 수 있는 문제였다! (하지만 저는 헷갈려버렸어요...)

먼저 N과 K, 국가 별 금/은/동메달의 개수를 배열에 저장한다.

N, K = map(int, input().split())
score = [list(map(int, input().split())) for _ in range(N)]
# 0 : 국가 정수, 1~3: 메달

다음으로는 국가를 나타내는 정수, 금메달, 은메달, 동메달의 개수를 저장해둔 score배열을 key값을 통해 정렬한다.

이 때, 아래 메달 조건을 만족하기 위해 sort 함수 내부에 key값을 주어,
x[1]이 같으면 x[2]로, x[2]가 같으면 x[3]으로 정렬하도록 한다.
메달의 수가 많은 순서대로 정렬해야하기에! reverse=True옵션을 주었다.

1. 금메달 수가 더 많은 나라 
2. 금메달 수가 같으면, 은메달 수가 더 많은 나라
3. 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라 
score.sort(key = lambda x : (x[1], x[2], x[3]), reverse=True)

만약, reverse=True 옵션을 주는 방법을 사용하지 않을 것이라면, lambda 함수에 다음과 같이 매개변수를 넣어줄 수 있다.

s.sort(key=lambda x : (-x[1], -x[2], -x[3]))

이제 찾고자 하는 국가의 정수 K가 몇번째 인덱스에 있는지를 index함수로 조회한다.
이 문법이 조금 헷갈렸는데, N개의 국가를 모두 순회하며 score[i][0]에 국가의 정수값이 나와있으니 K와 같은 값을 찾는 코드다.

selected_nation = [score[i][0] for i in range(N)].index(K) 

마지막으로 N개의 국가 중 K 국가의 메달 개수와 일치하는 국가가 있다면 해당 인덱스 + 1, 일치하는 국가가 K일 경우 동점자가 없는 경우다.

for i in range(N): # 동점 국가 확인
  if score[selected_nation][1:] == score[i][1:]:
    print(i+1)
    break

최종 코드

N, K = map(int, input().split())
score = [list(map(int, input().split())) for _ in range(N)] # 0 : 국가 정수, 1~3: 메달
score.sort(key = lambda x : (x[1], x[2], x[3]), reverse=True) # 메달 개수에 따라 내림차순 정렬(lambda 조건 통해 메달 개수 같을 경우 다음으로)
selected_nation = [score[i][0] for i in range(N)].index(K) # score[i][0]: 국가 나타내는 정수. 국가명이 K와 일치하는 인덱스 찾아서 저장
# print(score, selected_nation)

for i in range(N): # 동점 국가 확인
  if score[selected_nation][1:] == score[i][1:]: # 일치하는 다른 국가가 있을 경우
    print(i+1)
    break

배운점

▶️ 파이썬 sort 시 상황에 따라 key값 잘 넘겨줄 수 있도록 방법 까먹지 않기
▶️ 리스트 슬라이싱
▶️ 인덱스 찾는 함수: index()
▶️ 리스트의 행과 열 바꾸기
list(zip(*arr)) : 가로 합 or 세로 합 구해야 하는 경우,

[1 2 3]         [1 4 7]
[4 5 6]         [2 5 8]
[7 8 9]         [3 6 9]
*arr        list(zip(*arr))

▶️ 리스트 90도 회전시키기
list(zip( *arr[::-1] ))

[1 2 3]        [7 8 9]        [7 4 1]
[4 5 6]        [4 5 6]        [8 5 2]
[7 8 9]        [1 2 3]        [9 6 3]
*arr         *arr[::-1]   zip(*arr[::-1])
profile
끊임없이 도전하며 사고하는 주니어 Web 개발자 유지민입니다.

2개의 댓글

comment-user-thumbnail
2024년 1월 29일

파이썬 리스트 슬라이싱을 잘하시네요.
글 잘 봤습니다!

1개의 답글