본문 바로가기
알고리즘 문제 풀이

백준 1268번 : 임시 반장 정하기 (Python)

by 로널드 피셔 2022. 10. 24.

출처 : https://www.acmicpc.net/problem/1268

n = int(input())
stu = []

for i in range(n) :
    stu.append(list(map(int, input().split())))
    
same = [0] * n

for i in range(n-1) :
    already = []
    for j in range(5) :
        for k in range(i+1, n) :
            if stu[i][j] == stu[k][j] :
                if k not in already :
                    same[i] += 1
                    same[k] += 1
                    already.append(k)
                else :
                    pass

sol = same.index(max(same)) + 1

print(sol)

먼저 학생들의 정보를 저장할 빈 리스트 stu를 만들고, 입력 받는 순서대로 리스트로 저장해준다.

stu는 2차원 리스트이며 stu[i]는 i번 학생이 1학년부터 5학년까지 몇 반에 속했는지를 저장한 리스트이다.

또한 각 학생이 같은 반을 했던 학생 수를 저장하는 same 리스트를 생성한다.

 

i번째 학생이 j학년이었을 때, k번째(i+1부터 n까지) 학생 중 j학년일때 같은 반이었던 학생이 몇 명인지 센다.

만약 같은 반이었던 학생이 있으면, i와 k의 same 값에 1씩 더해준다.

또한 already라는 리스트를 만들어 이미 같은 반이었다고 센 학생을 중복해서 세지 않도록 한다.

예를 들어 5번째 학생이 3학년 때 9번째 학생과 같은 반이었는데, 5학년 때 또 같은 반이었다면 세지 않아야 한다.

k값을 already에 저장하고 k가 already에 들어있으면 same 값을 더하지 않는다.

 

1부터 n-1번째 학생까지 이 과정을 반복하고(n번째 학생은 이전의 n-1번 셀 때 모두 계산됨),

same의 값들 중 가장 큰 값의 인덱스 번호+1을 출력하면 된다.

 

* PyPy3은 괜찮지만 Python3으로 제출 시 시간초과가 뜬다. 

댓글