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

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

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

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

1. 입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.

2. 출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다. 

 

  • 코드
# 입력부
countrys,nation=map(int,input().split()); #국가 수, 국가 입력

# 처리부
tmp=[]

for i in range(countrys):
    tmp.append(list(map(int,input().split())));

tmp.sort(key=lambda x:(-x[1],-x[2],-x[3])); # 금, 은, 동 순으로 내림차순 정렬

for j in range(countrys): # 국가 찾기
    if(tmp[j][0]==nation):
        slicing=j;

# 출력부
for k in range(countrys): # 공동 순위가 있을 수 있으므로, 보정해야 함.
    if(tmp[slicing][1:]==tmp[k][1:]):
        print(k+1);
        break;

 

  • 풀이 과정

오늘 공부했던 lambda를 연속해서 적용하였다. 국가수와 국가를 입력는다.

그 후 금, 은, 동 순으로 내림차순 정리한다.

 

내가 알고자하는 국가가 어느 리스트에 있는지 판별한다. 그 후, slicing 변수에 대입한다.

 

그 후 내가 찾고자 하는 국가가 최초로 등장하는 리스트의 번호를 반환받는다.

(동점이 있는 경우도 있을 땐 빠른 번호로 공통 순위가 된다.)

 

-> 예시)

1등은 이미 정해졌고,

1번 리스트에 값이 (0,0,1) -> 1번 리스트는 2등

2번 리스트에 값이 (0,0,1) 이라면 -> 2번 리스트는 3등이 아닌 공동 2등이 된다.

 

고로, 최초로 등장하는 지점이 발견되면, 그 즉시 루프를 종료시킨다.

 

리스트는 0번부터 시작하므로, +1을 해주어 국가의 순위를 반환한다.


  • 여담

오늘 하루 종일 이것만 하다 하루가 끝났다....ㅠㅠ;

 

처음에는 금, 은, 동에 3점 2점 1점의 가중치를 부여하고, 국가별로 비교해서 그 국가보다 점수가 낮으면 뒤로 밀리면 국가의 등수가 나온다고 생각했다. (축구의 승패 점수 부여 방식과 동일하게 생각함.)

 

그랬더니, 8점을 받았다.

 

(8점)짜리 코드

# 입력부
countrys,nation=map(int,input().split()); #국가 수, 국가 입력

# 처리부
result=[0]*countrys;
rank=0;

for i in range(countrys):
    tmp=list(map(int,input().split()));
    result[nation-1]+=(tmp[1]*3+tmp[2]*2+tmp[3]*1); # 금 은 동을 각각 3 2 1 로 가중치 부여.

for j in range(countrys):
    if(tmp[nation-1]<tmp[j]):
        rank+=1;
    
# 출력부
print(rank);

 

그 후 오늘 공부했던 lambda를 이용해서 정렬을 한 뒤 처리를 했다.

그러나 아직 공동 순위를 처리하지 않았다. 그랬더니 12점을 받았다.

 

(12점)짜리 코드

# 입력부
countrys,nation=map(int,input().split()); #국가 수, 국가 입력

# 처리부
tmp=[]

for i in range(countrys):
    tmp.append(list(map(int,input().split())));

tmp.sort(key=lambda x:(-x[1],-x[2],-x[3])); # 금, 은, 동 순으로 내림차순 정렬

for j in range(countrys):
    if(tmp[j][0]==nation):
        break;
# 출력부
print(j+1);

 

공동 순위를 처리하지 않았다면, 완전한 정답이 아닌 부분 정답으로 인정이 된다...

 

 

코드가 이상하거나, 이해되지 않는 부분이 있다면 언제든 댓글 남겨주세요!

 

+ Recent posts