백준 알고리즘

백준 - 1268번 임시 반장 정하기 python 문제풀이 [Hellfer]

Hellfer 2024. 1. 27. 21:10
728x90

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

 

1268번: 임시 반장 정하기

오민식 선생님은 올해 형택초등학교 6학년 1반 담임을 맡게 되었다. 오민식 선생님은 우선 임시로 반장을 정하고 학생들이 서로 친숙해진 후에 정식으로 선거를 통해 반장을 선출하려고 한다.

www.acmicpc.net

🔷 알고리즘 분류 - 구현   난이도 - 브론즈 1

🔶문제 풀이 - 구현을 이용한 풀이

# 입력 받을 테스트 케이스의 수 T를 입력받습니다.
T=int(input())

# T만큼의 2차원 배열 x를 입력받습니다.
x=[list(map(int,input().split())) for _ in range(T)]

# T만큼의 세트 형태의 1차원 배열 y를 생성합니다. 
y=[set() for _ in range(T)]

# 2차원 배열 x를 순회합니다.
for i in range(5):
    for j in range(T):
        for k in range(T):
            # 같은 열에 위치한 두 숫자가 같고, 그 두 숫자가 다른 행에 위치할 경우
            if j != k and x[k][i] == x[j][i]:
                # 조건을 만족하는 행의 인덱스를 y에 추가합니다.
                y[j].add(k)
                
# y의 각 원소(세트) 중, 원소의 개수가 가장 많은 것을 찾아 result에 저장합니다.
result=max(len(i) for i in y)

# y를 순회하여,
for i in range(T):
    # 만약 y의 원소(세트)의 길이가 result와 같다면,
    if len(y[i])==result:
        # 그 세트의 인덱스(행의 번호, 1부터 시작)를 출력하고,
        print(i+1)
        # 반복문을 종료합니다.
        break

🔶문제 이해하기

# T만큼의 세트 형태의 1차원 배열 y를 생성합니다. 
y=[set() for _ in range(T)]

 

 

위 코드는 T만큼의 세트(set) 형태의 1차원 배열 y를 생성하는 코드입니다.

 

set()는 중복된 값을 허용하지 않는 특징을 가지고 있습니다.

예를 들어, T가 3이라고 가정해 봅시다.

 

그러면 다음과 같은 코드를 실행하게 됩니다.

 

y=[set() for _ in range(3)]

 

이 코드를 실행하면, y는 3개의 빈 세트를 원소로 가지는 리스트가 됩니다. 

 

즉, y = [set(), set(), set()] 와 같은 형태를 가지게 됩니다.

그러고 나서, 어떤 조건에 따라 이 세트들에 값을 추가하게 됩니다. 

 

예를 들어, y [0]. add(1), y [1]. add(2), y [2]. add(3)과 같은 코드를 실행합니다.

 

y는 [{1}, {2}, {3}]와 같은 형태를 가지게 됩니다.

여기서 중요한 점은, 세트는 중복된 값을 허용하지 않는다는 것입니다. 

 

즉, 같은 값을 여러 번 추가하려고 해도 세트 내에는 그 값이 한 번만 존재하게 됩니다. 

 

예를 들어, y [0]. add(1)을 다시 실행하더라도 y는 여전히 [{1}, {2}, {3}]와 같은 형태를 가지게 됩니다.

 

다음으로 y = [{1, 2}, {3, 4, 5}, {6}]이라고 가정해 봅시다.

 

그리고 result는 len(y [1]) = 3으로 설정하겠습니다.

# y를 순회하여,
for i in range(T):
    # 만약 y의 원소(세트)의 길이가 result와 같다면,
    if len(y[i])==result:
        # 그 세트의 인덱스(행의 번호, 1부터 시작)를 출력하고,
        print(i+1)
        # 반복문을 종료합니다.
        break

 

 

위의 코드를 실행하면, 출력 결과는 2가 됩니다. 

 

이는 y [1]의 길이가 result인 3과 같기 때문입니다.

i+1을 출력하는 이유는 문제에서 행의 번호가 1부터 시작하기 때문입니다. 

 

파이썬의 인덱스는 0부터 시작하므로, 1을 더해주어 문제의 조건에 맞추어 줍니다.

그리고 break문은 조건을 만족하는 첫 번째 원소를 찾은 후에 반복문을 종료하기 위해 사용됩니다. 

 

즉, result와 길이가 같은 첫 번째 세트의 인덱스를 찾으면 즉시 반복문을 빠져나옵니다.

 

 

728x90