[백준] 1079번 마피아 _ Python

2024. 1. 29. 12:33·Algorithms/Brute Fource

[초기 접근 방법]

일단 '마피아'가 '나'라고 생각하자.

 

만약 dp로 푼다면

    dp[i] : i번째 밤에 유진이의 유죄지수 값을 저장

    꼭 유죄지수가 가장 낮게 유지할 필요는 없지 않을까?

    그 다음 날 낮에 본인이 안 죽을 정도에서 밤에 죽이면 된다.

 

그럼 백트래킹?

    본인이 유죄지수가 가장 높으면 리셋하고, 안 높으면 계속 진행

    그렇게 완전 탐색을 해서 제일 긴 밤 출력하자

 

 

[생각]

우선 "낮"과 "밤" 코드를 분리하지 않고, 한 로직 내에서 같이 구현하려고 했던 것이 초기 구현의 복잡도를 높였던 것 같다.

그리고 낮에 마피아(나)가 죽지 않게끔 조건 처리를 해주었는데,

     이 또한 일단 dfs() 재귀를 거치고 dfs() 내 조건 처리에서 제할 수 있었던 부분이었다.

 

음.. 백트래킹을 할 때 조건에 따라 분리하는 방법도 생각해서 코드를 작성해보자!!

 

 

[코드]

# 풀이 시간 : 1시간 30분 + 20분
# 시간복잡도 : O(N*N^2)
# 공간복잡도 : O(N^2)
# 참고 : https://zoosso.tistory.com/418#google_vignette
#       https://yabmoons.tistory.com/348

import sys
input = sys.stdin.readline

def dfs(night, playerCnt):
    global result

    # 마피아 혼자 살아남았을 경우
    if playerCnt == 1:
        result = max(result, night)
        print(result)
        exit()
        
    # 마피아가 죽은 경우
    if not player[me][1]:
        result = max(result, night)
        return


    # 낮
    if playerCnt % 2:
        target = 0
        maxPoint = -float('inf')
        for i in range(N):
            if player[i][1]:  # 남은 사람 & 살아있는 사람
                if maxPoint < player[i][0]:
                    target = i
                    maxPoint = player[i][0]

        player[target][1] = False
        dfs(night, playerCnt-1)
        player[target][1] = True


    # 밤
    else:
        for i in range(N):
            if not player[i][1] or i == me: # 죽은 사람 or 마피아일 경우
                continue

            player[i][1] = False
            for j in range(N):
                if j == i:
                    continue
                player[j][0] += graph[i][j]

            dfs(night+1, playerCnt-1)

            player[i][1] = True
            for j in range(N):
                if j == i:
                    continue
                player[j][0] -= graph[i][j]


N = int(input())
input_player = list(map(int, input().split()))  # 유죄지수
player = []
for k in input_player:
    player.append([k, True])

graph = [list(map(int, input().split())) for _ in range(N)]
me = int(input())  # 참가자 번호

result = -float('inf')

if N <= 1:
    print(0)
    exit()

dfs(0, N)
print(result)

 

 

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

 

1079번: 마피아

첫째 줄에 참가자의 수 N이 주어진다. 둘째 줄에는 각 참가자의 유죄 지수가 주어진다. 셋째 줄부터 N개의 줄에는 배열 R이 주어진다. 마지막 줄에는 은진이의 참가자 번호가 주어진다. N은 16보다

www.acmicpc.net

 

저작자표시 (새창열림)

'Algorithm > Brute Fource' 카테고리의 다른 글

[백준] 2239번 스도쿠 _ Python  (1) 2024.01.27
[백준] 18111번 마인크래프트 _ Python  (0) 2024.01.16
[백준] 2422번 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 _ Python  (1) 2023.11.16
[백준] 15721번 번데기 _ Python  (1) 2023.11.14
[백준] 1548번 부분 삼각 수열 _ Python  (0) 2023.11.10
'Algorithms/Brute Fource' 카테고리의 다른 글
  • [백준] 2239번 스도쿠 _ Python
  • [백준] 18111번 마인크래프트 _ Python
  • [백준] 2422번 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 _ Python
  • [백준] 15721번 번데기 _ Python
wch_t
wch_t
  • wch_t
    끄적끄적(TIL)
    wch_t
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (171)
      • Architecture (0)
      • Algorithm (67)
        • Math (5)
        • Simulation (1)
        • Data Structure (4)
        • DP (7)
        • Brute Fource (10)
        • Binary Search (6)
        • Greedy (2)
        • Graph (11)
        • Mst (1)
        • Shortest path (10)
        • Two Pointer (1)
        • Tsp (3)
        • Union Find (2)
        • Mitm (1)
      • CS (2)
        • 데이터베이스 (5)
        • 네트워크 (5)
      • DB (6)
      • DevOps (17)
        • AWS (9)
        • Docker (1)
        • CI-CD (5)
      • Error (1)
      • Project (0)
        • kotrip (0)
      • Spring (59)
        • 끄적끄적 (5)
        • 기본 (9)
        • MVC 1 (7)
        • MVC 2 (11)
        • ORM (8)
        • JPA 1 (7)
        • JPA 2 (5)
        • Spring Data Jpa (7)
      • Test (2)
      • TIL (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Merge
    백준 17299 파이썬
    aws secrets manager
    백준 17289 파이썬
    Jenkins
    apache poi
    spring-cloud-starter-aws-secrets-manager-config
    TempTable
    spring-cloud-starter-bootstrap
    view algorithm
    docker
    response_mode
    docker: not found
    form_post
    scope
    애플
    Sxssf
    백준 3015 파이썬
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
wch_t
[백준] 1079번 마피아 _ Python
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.