알고리즘 문제 풀기/백준(Baekjoon)

[백준 알고리즘] 8979. 올림픽 _ 파이썬

hibscus 2021. 2. 15. 01:10

 

 

 

💻 문제 풀이의 2가지 방법

 

- 딕셔너리 사용

- 2차원 배열사용

 

 

문제에 답이 있다고, 문제 잘 읽으라는 소리를 초등학생부터 들어왔던 것 같은데.. 이 문제가 딱 문제에 해답? 힌트? 가 있는 문제였습니다.

 

6번째 줄에 자신보다 더 잘한 나라수 + 1 라고 되어있으니, 자신보다 더 잘한 나라수만 체크하면 되겠구나! 라는 아이디어를 문제를 통해 얻었습니다

 

그리고 조심해야할 부분이자, 처음에 제가 놓쳤던 부분이기도 한데요.

- 동메달이 아무리 많아도 1000개가 있어도, 금메달이 1개 있으면 금메달을 가진 나라가 높은 순위라는 것입니다. 즉, 합산으로 풀 수 없고, 금메달부터 봐야 한다는 거죠

 

(물론, 메달수 의 총합이 1,000,000 이하로 정해져 있기 때문에 가중치를 두어 합산으로 푸는 경우도 있었습니다!)

 

 

 

어쨌든, 저는 2가지 딕셔너리와, 2차원 배열을 활용하여 풀었습니다.

(튜플로 푸신분도 계시더라고요!)

 

 

 

🎈 딕셔너리

import sys

N, K = map(int, sys.stdin.readline().split())

scores = {}
for i in range(N):
    a = list(map(int, sys.stdin.readline().split()))
    scores[a[0]] = a[1:]

count = 1
for i in range(1, N+1):
    if scores[K][0] < scores[i][0]:
        count += 1
    elif scores[K][0] == scores[i][0]:
        if scores[K][1] < scores[i][1]:
            count += 1
        elif scores[K][1] == scores[i][1]:
            if scores[K][2] < scores[i][2]:
                count += 1
print(count)

 

🎈 2차원 배열

import sys

N, K = map(int, sys.stdin.readline().split())

# 2차원 배열
scores = [[] for _ in range(N+1)]
for _ in range(N):
    nation, gold, silver, bronze = map(int, sys.stdin.readline().split())
    scores[nation] = [gold, silver, bronze]
K_gold, K_silver, K_bronze = scores[K]

count = 1
# 금, 은, 동 비교해서 K보다 클 경우 +1
for i in range(1, N+1):
    if K_gold < scores[i][0]:
        count += 1
    elif K_gold == scores[i][0]:
        if K_silver < scores[i][1]:
            count += 1
        elif K_silver == scores[i][1]:
            if K_bronze < scores[i][2]:
                count += 1
print(count)

 

 

🎆문제풀 때 어떤 자료형으로 접근할 지를 결정하는 것이 중요하단 것을 배운 문제였습니다!

 

 

 

www.acmicpc.net/problem/8979

 

8979번: 올림픽

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

www.acmicpc.net