alpyrithm_알파이리즘

[알고리즘][Python] 백준(BOJ) 8979 올림픽_파이썬 본문

Algorithm/백준 알고리즘_Python

[알고리즘][Python] 백준(BOJ) 8979 올림픽_파이썬

알파이 2020. 8. 7. 08:49

 

8979 올림픽    https://www.acmicpc.net/problem/8979

 

8979번: 올림픽

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

www.acmicpc.net

 

 

 

 

 

 

 

 

 

 

문제 풀기 전 공부할 것 : 정렬, 구현

 

 

 

 

 

 

 

풀이 1

<내용>

  • n, k를 입력받는다.
  • 국가별 메달 수를 리스트로 입력받는다.
  • 정렬 sort() 함수를 이용해서 금, 은, 동 많은 순서로 정렬한다.
  • 최종 등수를 grade로 사이에 등수가 같을 경우를 count할 s를 초기화한다.
    • grade를 1로 초기화하는 경우는 등수는 1등부터 시작하기 때문이다.
  • medals[i][0]이 k이면 grade를 출력하고 break로 for문을 빠져나오면 된다.
  • 등수가 같을 때를 대비해서 정렬된 이전 국가와 비교해서 금, 은, 동의 메달 수가 똑같으면 grade가 아닌 s에 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)

grade, s = 1, 0
for i in range(n):       
    if i != 0:
        if medals[i-1][1:] == medals[i][1:]:
            s += 1
        else:
            if s:
                grade += s
                s = 0
            grade += 1
    if medals[i][0] == k:
        print(grade)
        break

+) sort함수 key로 구현하는 방법 정확히 알고 있기

+) 다른 방법 찾아보기

 

 

 

 

 

 

 

 

풀이 2

<내용>

- 위의 내용에서 정렬까지는 같은 방법

  • 등수를 찾을 때 for문을 돌며 국가 k의 index를 찾아서 저장한다.
  • 등수가 같은 나라가 있을 때를 대비해서 for문을 돌며 국가 k의 금, 은, 동메달 수와 같은 국가가 나오면 그 국가의 (index+1)등이므로 출력하고 break로 for문을 빠져나온다.

 

 

<코드>

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)

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

 

 

 

 

 

 

풀이 3

<내용>

- 위의 방법에서 index 찾는 방법 빼고는 같은 방법

  • index 찾을 때 list.index() 함수를 이용해서 찾는다.

 

 

 

<코드>

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

 

 

 

 

728x90
반응형
Comments