이 영역을 누르면 첫 페이지로 이동
포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

페이지 맨 위로 올라가기

포렌식 & 개발 이야기 - Forensics & Development

Pental - Forensics / iOS / Windows / Android / Kakaotalk / Telegram / Etc

백준 14889 - 스타트와 링크 (파이썬)

  • 2025.02.22 22:50
  • Programming/백준
글 작성자: pental

분류 : 브루트포싱

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

풀이

문제 분석을 하면 다음과 같다.

  1. N명의 사람을 두 개의 팀으로 나누어야한다.
  2. S[i][j]는 i번 사람과 j번 사람이 같은 팀일때 더해지는 능력치이다.
  3. 두팀의 능력치 차이를 최소화 해야한다.
  4. 능력치는 대팅이 아닐 수 있으며, 대각선 값은 항상 0이다.
4
0 1 2 3
4 0 5 6
7 1 0 2
3 4 5 0

예제의 값을 생각해보면 다음과 같이 풀이 할 수 있다. 일단 가능한 팀 조합은 다음과 같다.

  1. (1, 2) vs (3 , 4) → 능력치 차이 | 5 - 7 | = 2
  2. (1, 3) vs (2, 4) → 능력치 차이 | 9 - 10 | = 1
  3. (1, 4) vs (2, 3) → 능력치 차이 | 6 - 6 | = 0

문제 풀이를 위한 해결 방법은 다음과 같다.

  1. 조합을 이용한 팀 나누기
    1. N명의 사람 중 N / 2 명을 선택하는 모든 경우의 수를 생성해야한다.
    2. 조합을 사용하면 쉽게 구할 수 있다.
  2. 능력치 계산
    1. 선택된 팀에 대해 모든 (x, y) 쌍에 때해 능력치를 더한다.
    2. 나머지 인원을 다른 팀으로 구성하고 동일하게 계산한다.
  3. 차이값 갱신
    1. 두팀의 능력치 차이의 최솟값을 갱신하면서 탐색한다.
    2. 차이가 0 이면 조기 종료한다.

시간복잡도를 분석해보면, combinations(range(N), N // 2) 의 갯수는 N choose N / 2

최대 N = 20d일때, (20 choose 10) = 184,756으로 충분히 계산 가능하다.

이중 for문으로 능력치를 합산하므로 O(N^2 * 2 ^ N) 정도의 연산이지만 20 이하에서 충분히 해결 가능하다.

코드

# 백준 14889 - 스타트와 링크
# 분류 : 브루트포싱

from itertools import combinations

N = int(input())
S = [[] for _ in range(N)]

for i in range(N):
    S[i] = list(map(int, input().split()))

min_diff = 1e9

for combination in combinations(list(range(N)), N // 2) :
    team_a = combination
    team_b = []
    for i in range(N) :
        if i not in team_a :
            team_b.append(i)
    
    power_a = 0
    power_b = 0

    for x in team_a :
        for y in team_a :
            power_a += S[x][y]
    
    for x in team_b :
        for y in team_b :
            power_b += S[x][y]
    
    diff = abs(power_a - power_b)
    if min_diff > diff :
        min_diff = diff

print(min_diff)
저작자표시 비영리 (새창열림)

'Programming > 백준' 카테고리의 다른 글

백준 20365 - 블로그2 (파이썬)  (0) 2025.02.24
백준 10844 - 쉬운 계단 수 (파이썬)  (0) 2025.02.23
백준 11726 - 2 x n 타일링 (파이썬)  (0) 2025.02.21
백준 1759 - 암호 만들기 (파이썬)  (0) 2025.02.21
백준 2579 - 계단 오르기 (파이썬)  (0) 2025.02.03

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 백준 20365 - 블로그2 (파이썬)

    백준 20365 - 블로그2 (파이썬)

    2025.02.24
  • 백준 10844 - 쉬운 계단 수 (파이썬)

    백준 10844 - 쉬운 계단 수 (파이썬)

    2025.02.23
  • 백준 11726 - 2 x n 타일링 (파이썬)

    백준 11726 - 2 x n 타일링 (파이썬)

    2025.02.21
  • 백준 1759 - 암호 만들기 (파이썬)

    백준 1759 - 암호 만들기 (파이썬)

    2025.02.21
다른 글 더 둘러보기

정보

포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

  • 포렌식 & 개발 이야기 - Forensics & Development의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

카테고리

  • Category (442) N
    • Forensics (104)
      • Magnet AXIOM (28)
      • Digital Forensics Informati.. (9)
      • Iphone Forensics (23)
      • DFC (7)
      • 디지털포렌식전문가2급 자격증 (10)
      • FTK ACE 자격증 (7)
    • 이것저것 (7)
      • Ubuntu (6)
      • 디스코드 봇 (4)
      • Volatility GUI (2)
    • CTF (32)
      • NEWSECU (14)
      • CTF-d (5)
      • Puzzel - Network Forensics (2)
      • Security Traps (2)
      • system32.kr (5)
      • HMCTF (4)
    • Programming (251) N
      • C (10)
      • Python (11)
      • 백준 (197) N
      • 프로그래머스 (32)
    • 그냥 개발 및 잡담 (16)
      • Docker (2)
      • Google Cloud (3)
      • OS 개발 (3)
    • Best of Best (20)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • Forensics
  • 포렌식
  • 프로그래머스
  • 파이썬
  • 디지털포렌식
  • 백준
  • pental
  • axiom
  • 전체 보기…

정보

pental의 포렌식 & 개발 이야기 - Forensics & Development

포렌식 & 개발 이야기 - Forensics & Development

pental

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © pental.

티스토리툴바