https://www.acmicpc.net/problem/9017
1.설명
위 그래프는 함수 선언할때 고민했던 그림입니다. 이번 문제 돌리면서 가장 헷갈렸던 부분이 2개정도 있는데
1)팀원이 6명이 안될시에 NaN값을 어떻게 넣을지에 대한 고민
2)점수를 어떻게 줘야할지?
에 대해서 고민하다가 그냥 6명이 안되는 팀들은 제거를 한뒤 점수 입력을 하자라는 생각이 들었습니다.
def main():
T = int(input())
for _ in range(T):
N = int(input())
Rank = list(map(int, input().split()))
if len(Rank) != N:
print("잘못된 입력입니다")
break
else:
winner = calculate_winner(N, Rank)
print("Winner for this test case:", winner)
if __name__ == "__main__":
main()
일단 기본 main 함수를 정의 했습니다. 그럼 이제 calculate_winner부분을 정의 해보도록 하죠
def calculate_winner(N, Rank):
count = {} #각팀의 주자수 세기
for i in range(N):
if Rank[i] in count:
count[Rank[i]] += 1
else:
count[Rank[i]] = 1
# 6명 안되면 제거하기
count = {key: value for key, value in count.items() if value >= 6}
score = {} # 각 팀 점수 확인
idx = 1
for i in range(N):
if Rank[i] in count:
if Rank[i] in score:
if score[Rank[i]][0] < 4:
score[Rank[i]][0] += 1
score[Rank[i]][1] += idx
elif score[Rank[i]][0] == 4:
score[Rank[i]][0] += 1
score[Rank[i]][2] = idx
else:
score[Rank[i]] = [1, idx, 0]
idx += 1
# 점수와 5번째 주자 위치로 저장
team = sorted(score.items(), key=lambda x: (x[1][1], x[1][2]))
return team[0][0] # 1등팀 반환
사실 이 함수정의 자체가 메인이라고봅니다. 각 팀의 주자수 세기는 항상 해왔던거!!! 그러면 6명이 안되면 제거하기는 list comprehension을 활용해서 문제를 풀었습니다. 또 score계산하는게 젤 어려웠는데.... 다른 블로그들을 참고하면서 문제를 풀었던거같아용 :)
2.코드
def calculate_winner(N, Rank):
count = {} #각팀의 주자수 세기
for i in range(N):
if Rank[i] in count:
count[Rank[i]] += 1
else:
count[Rank[i]] = 1
# 6명 안되면 제거하기
count = {key: value for key, value in count.items() if value >= 6}
score = {} # 각 팀 점수 확인
idx = 1
for i in range(N):
if Rank[i] in count:
if Rank[i] in score:
if score[Rank[i]][0] < 4:
score[Rank[i]][0] += 1
score[Rank[i]][1] += idx
elif score[Rank[i]][0] == 4:
score[Rank[i]][0] += 1
score[Rank[i]][2] = idx
else:
score[Rank[i]] = [1, idx, 0]
idx += 1
# 점수와 5번째 주자 위치로 저장
team = sorted(score.items(), key=lambda x: (x[1][1], x[1][2]))
return team[0][0] # 1등팀 반환
def main():
T = int(input())
for _ in range(T):
N = int(input())
Rank = list(map(int, input().split()))
if len(Rank) != N:
print("잘못된 입력입니다")
break
else:
winner = calculate_winner(N, Rank)
print("Winner for this test case:", winner)
if __name__ == "__main__":
main()
개인적으로 풀면서 좀 헷갈렸던 부분이 많았던거 같아요. 실력을 더 키워서 이런것도 한방에 빠바박!!
'코딩test공부 > 백준python' 카테고리의 다른 글
20920.영단어 암기는 괴로워 (1) | 2024.01.10 |
---|---|
13305.주유소 (1) | 2024.01.09 |
1244.스위치 끄고 켜기 (2) | 2024.01.04 |
8979.올림픽 (1) | 2024.01.03 |
10431.줄세우기 (0) | 2024.01.02 |