Python_알고리즘/Gold V

3980. [Python]선발 명단

최근영 2024. 10. 21. 18:40

1. 문제

 

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

 

2. 접근 방법

 

  • 시간 제한: 1초
  • 메모리 제한: 128MB
  • 백트래킹
  • 브루트 포스

 

3. 파이썬 코드

 

import sys

input = sys.stdin.readline
# 백트래킹
def DFS(start):
    # 최대값 저장
    global max_value
    # 값 저장
    global value
    # 최종 11에 도달했을 때
    if start == 11:
        # 최대 값보다 값이 크면 갱신
        if max_value < value:
            max_value = value
        return
    # 11명의 포지션 바복
    for j in range(11):
        # 포지션 값이 0 이 아니고 방문안했을 경우
        if position[start][j] != 0 and pos_visited[j] == False:
            # 방문 처리 후 값 더해주고 재귀 실행 백트래킹
            pos_visited[j] = True
            value += position[start][j]
            DFS(start+1)
            value -= position[start][j]
            pos_visited[j] = False

T = int(input())
# 테스트 케이스 반복문 만큼 진행
for _ in range(T):
    # 포지션별 리스트 추가
    position = []
    for _ in range(11):
        position.append(list(map(int,input().split())))
    # 최대값 기본 값
    max_value = 0
    value = 0
    # 방문처리 체크
    pos_visited = [False] * 11
    # 백트래킹
    for i in range(11):
        if position[0][i] != 0:
            pos_visited[i] = True
            value += position[0][i]
            DFS(1)
            value -= position[0][i]
            pos_visited[i] = False
    print(max_value)

 

4. 문제를 풀고난 후 생각

 

  • 모든 경우의 수를 다 탐색하면서 알고리즘을 돌리면 된다.
  • 백트래킹을 진행하되 0 번인덱스를 기준으로 백트래킹을 해주면 원하는 결과값이 나온다.
  • 테스트 케이스 개수가 따로 명시되어있진 않았고 인풋이 많을 것 같아서 sys.stdin.readline 처리를 해줬다.

 

5. 문제를 푸는데 도움이 되는 지식

 

  • 브루트 포스
  • 백트래킹