입력할 내용들이 꽤 많아서 각각의 용도에 따라 그에 맞는 자료구조들을 각각 생성했다.
N, M = map(int, input().split())
score = list(map(int, input().split()))
arr = [[0]*(N+1) for _ in range(M)] # M개의 행 N+1 개의 열
profile = {} # 학번과 점수 기록
for i in range(M):
num = 0
arr[i] = input().split() # arr[0] = [1, O, X, X, X]
for j in range(N+1):
if j!=0 and arr[i][j] == 'O': num += score[j-1]
profile[arr[i][0]] = num
max_value = max(profile.values())
max_keys = [key for key, value in profile.items() if value == max_value]
min_key = min(int(key) for key in max_keys)
print(min_key, max_value)
일단 두 번째 줄에 입력받는 문제별 배점들은 순서대로 저장되는 것이 중요하므로 score 리스트에 순서대로 삽입
그 다음 세 번째 줄부터는 M명의 응시자 별 학번과 답안지를 M번 입력받는다.
이 때 학번까지 추가되므로 한 명당 N+1개의 데이터를 받는 셈이므로 M*(N+1) 크기의 arr 배열을 만들면 좋겠다고 생각
한 명씩 답안지 데이터를 받을 때마다 또 하나의 이중 for문으로 정답을 맞췄을 경우(arr[i][j] 원소가 O일 경우) 매 for 루프마다 초기화 되는 num 변수에 score에 저장되어 있는 점수별 배점을 더해준다.
이때 주의할 점은 score은 0부터 시작해서 1번 문제의 배점이 score의 0번째 원소인 반면, 점수를 합산하는 for문 내에서의 arr 배열은 0번째 인덱스가 학번, 1번째 인덱스가 1번 문제의 답이기 때문에 score[j-1] 한 만큼을 num 변수에 더해야 제대로된 점수 합산이 진행된다!
마지막으로 응시자의 학번과 점수를 묶음으로 기록해두려면 딕셔너리가 편할 것 같아 점수 계산이 완료된 점수를 응시자별로 저장할 profile 딕셔너리를 생성했다.
for 루프가 끝나기 전에 이 profile 딕셔너리에 arr[i][0] (학번) 과 num (계산 완료된 점수) 를 각각 key와 value로 저장해준다.
마지막에 출력하는 부분이 내가 딕셔너리로 저장해서 그런지 은근히 까다로웠다.
그냥 점수인 value값이 최대인 것을 추출해서 출력하면 좋지만, 문제 조건 중에는 점수가 같은 경우 학번이 제일 작은 것을 출력하라는 조건이 덧붙여져 있었기 때문이다.
딕셔너리에 value 값이 이렇게 중복되는 경우, 최대값을 가진 key 중에서 정수인 key 값이 가장 작은 것을 출력하도록 하기 위해 다음과 같이 코드를 구성했다.
1. 딕셔너리의 최대 value 값을 찾음
2. 최대 value 값을 가진 모든 key들을 리스트에 저장
3. 해당 key들 중 가장 작은 정수인 key를 선택
max() 내장함수 안쓰고 한 번 코딩해보려고 했는데,
코드가 너무 길어져서 비효율적이라 간결함을 위해 그냥 사용해서 숏코딩으로 완료했다.
'Python' 카테고리의 다른 글
[백준/Python] 1436 : 영화감독 숌 (0) | 2024.07.17 |
---|---|
[백준/Python] 14501 : 퇴사 (0) | 2024.07.17 |
[백준/Python] 1094번 : 막대기 (0) | 2024.07.14 |
[백준/Python] 11399번 : ATM (0) | 2024.07.04 |
[백준/Python] 1010번 : 다리 놓기 (0) | 2024.07.04 |