너와!나의!알고!리즘!/백준

[백준 #1268, Python] 임시 반장 정하기

moongchi98 2021. 2. 3. 00:48
문제 후기
난 이문제가 너무 싫다 진짜진짜찐짜 너무 힘들었따

[문제]

오민식 선생님은 올해 형택초등학교 6학년 1반 담임을 맡게 되었다. 오민식 선생님은 우선 임시로 반장을 정하고 학생들이 서로 친숙해진 후에 정식으로 선거를 통해 반장을 선출하려고 한다. 그는 자기반 학생 중에서 1학년부터 5학년까지 지내오면서 한번이라도 같은 반이었던 사람이 가장 많은 학생을 임시 반장으로 정하려 한다.

그래서 오민식 선생님은 각 학생들이 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 표를 만들었다. 예를 들어 학생 수가 5명일 때의 표를 살펴보자.

 1학년2학년3학년4학년5학년

1번 학생 2 3 1 7 3
2번 학생 4 1 9 6 8
3번 학생 5 5 2 4 4
4번 학생 6 5 2 6 7
5번 학생 8 4 2 2 2

위 경우에 4번 학생을 보면 3번 학생과 2학년 때 같은 반이었고, 3번 학생 및 5번 학생과 3학년 때 같은 반이었으며, 2번 학생과는 4학년 때 같은 반이었음을 알 수 있다. 그러므로 이 학급에서 4번 학생과 한번이라도 같은 반이었던 사람은 2번 학생, 3번 학생과 5번 학생으로 모두 3명이다. 이 예에서 4번 학생이 전체 학생 중에서 같은 반이었던 학생 수가 제일 많으므로 임시 반장이 된다.

각 학생들이 1학년부터 5학년까지 속했던 반이 주어질 때, 임시 반장을 정하는 프로그램을 작성하시오.

 

[풀이]

들어가기 앞서 일단 진짜진짜 수많은 실패를 거듭했다... 우선 초반에 이유는 문제를 잘못읽어서 ㅋ.. 나중에는 계속 ValueError와 함께 했따... 진짜 백준 문의에 올라와있는 모든 예외를 다 돌려보고 내 반례도 만들어보고 해서 다 작동시켜도 나는 출력이 잘 되기만 했는데!!!!!!!!!!!!!!!!!!!!! 이녀석은 날 통과시켜주지않았따!!!!!!!!!!!!!!!

심지어!!!!!!!! 민철님께서 알려주신 풀이를 적용했는데!!!!!!!!!!!!!!!!!!!!! 거의 다 똑같은데!!!!!통과가 안돼!!!!!!

런타임 에러의 늪...

🥴 문제 잘못 읽은 풀이

이 문제에서 구하는 건, 가장 많은 학생들과 같은반을 해본 학생을 선정하는것. 즉, 한 학생과 얼마나 같은 반을 많이 했는지는 상관없다.. 그런데 나는 오직 '같은 반을 한 횟수'를 구하는 코드를 작성하였다. 근데 또 이게 예시가

어떻게 구하든 같은 답이라서 내 뻘짓은 헤어나오질 못했다. 근데 지금 생각해보면 이것도 결국 input의 문제였나?

N = int(input())
students = []
for i in range(N):
    students.append(list(map(int,input().split(" "))))
    
#학생 
for idx in range(N-1):
    # print(idx,'i입니다')
    #과목
    for j in range(5):
        # print(j,'j입니다')
        if students[idx][j] == students[idx+1][j]:
            # print(students[idx][j],students[idx+1][j])
            result[idx] = result.get(idx,0) + 1
            result[idx+1] = result.get(idx+1,0) + 1
            # print(result,'result입니다')
          
        else:
            continue


if result == {}:
    print(1)
else:
    max_value = max(result.values())
    answer =[]
    for key, value in result.items():
   
        if value > max_value:
            max_value = value
            answer = [key+1]
        elif value == max_value:
            answer += [key+1]
    print(min(answer))

 나는 위의 코드에서, 각 학생들의 학년별 반기록을 한개의 리스트로 받아와 students라는 큰 리스트에 저장한다. 그래서 i번째 학생과 그 다음 학생이 같은 학년에서 반이 같은지 확인하고 -> 같다면 dict에 key는 학생번호로, value는 같은 반을 한 횟수로 저장했다.

또, 모두 같은 반을 한 반례를 고려해서 if문에서 결과가 없을 때는 가장 작은수인 1을 출력하게 하였고, 

마지막에는 반복문을 통해서 최대값이 같은애들은 list에 추가한다음에, min으로 가장 작은 값을 출력하게 해줬따..

나름 그럴싸했는데..

 

🐤 문제를 제대로 읽고 시도 -> set 이용

N = int(input())
students = []
for i in range(N):
    students.append(list(map(int,input().split(" "))))
# print(students)

answer ={}
for student_no in range(N):
    result =set()
    for grade in range(5):
        for friend in range(N):
            if friend == student_no:
                continue

            if students[student_no][grade] == students[friend][grade]:
                result.add(friend)               
    answer[student_no] = result
# print(answer)

# print(max(answer.values()))
if max(answer.values()) == set():
    print(1)
else:
    value_list = [len(value) for value in answer.values()]
    # print(value_list)
    print(value_list.index(max(value_list))+1)

set을 이용하면,, n번째 친구랑 n번 같은반을 해도 중복이 안되니까 그건 고민할게 아니다. 역시나, 가장 작은 값을 출력하는게 가장 고민이였는데. 나는 이번에도 역시 거의 비슷한 방법을 사용했다..

 

🐔 답...

N = int(input())
students = []
for i in range(N):
    students.append([int(j) for j in input().split()])
# print(students)

max_friend = -1
banjang = -1
for student_no in range(N):
    result =set()
    for grade in range(5):
        for friend in range(N):
            if students[student_no][grade] == students[friend][grade]:
                result.add(friend)               
    
    if len(result) > max_friend:
        banjang = student_no +1
        max_friend = len(result)
        

print(banjang)

가장 큰 차이는, max_friend, 즉 같은반을 할 수 있는 최대값의 수를 -1로 설정해놓아서 0일때도 돌아가게 한다. banjang역시 -1로 설정해놓았따. (if문 줄이고 이렇게 간편하게 시작하는 방법이 진짜 놀랍다)

그리고 나처럼 굳이 result를 빼올려하지말고, 반복문안에서 그 result값을 바로바로 최대값이랑 비교하여서 계산하는건 진짜 놀랍다.. 무한 경외 데헷.

근데 사실 저 코드에서도 위의 for i in range~이 부분 즉 input을 받아오는 부분에서 map을 사용하면 

에러가 난다. (Value Error) 진짜 저거만 바꿧는데 통과였다..

vs code상에서는 두개의 출력이 동일한데 왜 그러지.,..? 혹시 아시는분이 있다면 저좀 살려주세요..