πŸ‘©πŸ»‍πŸ’» 갓생 직μž₯인 λ‚¨λ°”μ˜€
article thumbnail

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

 

14889번: μŠ€νƒ€νŠΈμ™€ 링크

예제 2의 κ²½μš°μ— (1, 3, 6), (2, 4, 5)둜 νŒ€μ„ λ‚˜λˆ„λ©΄ 되고, 예제 3의 κ²½μš°μ—λŠ” (1, 2, 4, 5), (3, 6, 7, 8)둜 νŒ€μ„ λ‚˜λˆ„λ©΄ λœλ‹€.

www.acmicpc.net

문제

μ˜€λŠ˜μ€ μŠ€νƒ€νŠΈλ§ν¬μ— λ‹€λ‹ˆλŠ” μ‚¬λžŒλ“€μ΄ λͺ¨μ—¬μ„œ μΆ•ꡬλ₯Ό 해보렀고 ν•œλ‹€. μΆ•κ΅¬λŠ” 평일 μ˜€ν›„μ— ν•˜κ³  μ˜λ¬΄ 참석도 μ•„λ‹ˆλ‹€. 좕ꡬλ₯Ό ν•˜κΈ° μœ„ν•΄ λͺ¨μΈ μ‚¬λžŒμ€ 총 Nλͺ…이고 μ‹ κΈ°ν•˜κ²Œλ„ N은 μ§μˆ˜μ΄λ‹€. 이제 N/2λͺ…μœΌλ‘œ 이루어진 μŠ€νƒ€νŠΈ νŒ€κ³Ό 링크 νŒ€μœΌλ‘œ μ‚¬λžŒλ“€μ„ λ‚˜λˆ μ•Ό ν•œλ‹€.

BOJλ₯Ό μš΄μ˜ν•˜λŠ” νšŒμ‚¬ λ‹΅κ²Œ μ‚¬λžŒμ—κ²Œ λ²ˆν˜Έλ₯Ό 1λΆ€ν„° NκΉŒμ§€λ‘œ λ°°μ •ν–ˆκ³ , μ•„λž˜μ™€ 같은 λŠ₯λ ₯치λ₯Ό μ‘°μ‚¬ν–ˆλ‹€. λŠ₯λ ₯치 SijλŠ” i번 μ‚¬λžŒκ³Ό j번 μ‚¬λžŒμ΄ 같은 νŒ€μ— μ†ν–ˆμ„ λ•Œ, νŒ€μ— λ”ν•΄μ§€λŠ” λŠ₯λ ₯μΉ˜μ΄λ‹€. νŒ€μ˜ λŠ₯λ ₯μΉ˜λŠ” νŒ€μ— μ†ν•œ λͺ¨λ“  쌍의 λŠ₯λ ₯치 Sij의 합이닀. SijλŠ” Sji와 λ‹€λ₯Ό μˆ˜λ„ 있으며, i번 μ‚¬λžŒκ³Ό j번 μ‚¬λžŒμ΄ 같은 νŒ€μ— μ†ν–ˆμ„ λ•Œ, νŒ€μ— λ”ν•΄μ§€λŠ” λŠ₯λ ₯μΉ˜λŠ” Sij와 Sji이닀.

N=4이고, Sκ°€ μ•„λž˜μ™€ 같은 경우λ₯Ό μ‚΄νŽ΄λ³΄μž.

예λ₯Ό λ“€μ–΄, 1, 2번이 μŠ€νƒ€νŠΈ νŒ€, 3, 4번이 링크 νŒ€μ— μ†ν•œ κ²½μš°μ— 두 νŒ€μ˜ λŠ₯λ ₯μΉ˜λŠ” μ•„λž˜μ™€ κ°™λ‹€.

  • μŠ€νƒ€νŠΈ νŒ€: S12 + S21 = 1 + 4 = 5
  • 링크 νŒ€: S34 + S43 = 2 + 5 = 7

1, 3번이 μŠ€νƒ€νŠΈ νŒ€, 2, 4번이 링크 νŒ€μ— μ†ν•˜λ©΄, 두 νŒ€μ˜ λŠ₯λ ₯μΉ˜λŠ” μ•„λž˜μ™€ κ°™λ‹€.

  • μŠ€νƒ€νŠΈ νŒ€: S13 + S31 = 2 + 7 = 9
  • 링크 νŒ€: S24 + S42 = 6 + 4 = 10

좕ꡬλ₯Ό 재미있게 ν•˜κΈ° μœ„ν•΄μ„œ μŠ€νƒ€νŠΈ νŒ€μ˜ λŠ₯λ ₯μΉ˜μ™€ 링크 νŒ€μ˜ λŠ₯λ ₯치의 차이λ₯Ό μ΅œμ†Œλ‘œ ν•˜λ €κ³  ν•œλ‹€. μœ„μ˜ μ˜ˆμ œμ™€ 같은 κ²½μš°μ—λŠ” 1, 4번이 μŠ€νƒ€νŠΈ νŒ€, 2, 3번 νŒ€μ΄ 링크 νŒ€μ— μ†ν•˜λ©΄ μŠ€νƒ€νŠΈ νŒ€μ˜ λŠ₯λ ₯μΉ˜λŠ” 6, 링크 νŒ€μ˜ λŠ₯λ ₯μΉ˜λŠ” 6이 λ˜μ–΄μ„œ 차이가 0이 되고 이 값이 μ΅œμ†Œμ΄λ‹€.

μž…λ ₯

첫째 쀄에 N(4 ≤ N ≤ 20, N은 짝수)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ μ€„λΆ€ν„° N개의 쀄에 Sκ°€ μ£Όμ–΄μ§„λ‹€. 각 쀄은 N개의 수둜 이루어져 있고, i번 μ€„μ˜ j번째 μˆ˜λŠ” Sij μ΄λ‹€. SiiλŠ” 항상 0이고, λ‚˜λ¨Έμ§€ SijλŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 μŠ€νƒ€νŠΈ νŒ€κ³Ό 링크 νŒ€μ˜ λŠ₯λ ₯치의 차이의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

 

문제 ν•΄κ²°

이건 ν•™λΆ€ λ•Œ ν’€μ–΄λ³Έ 기얡이 μžˆμ—ˆλŠ”λ° 파이썬으둜 λ‹€μ‹œ ν’€λ €κ³  ν•˜λ‹ˆκΉŒ μ‘°ν•©μœΌλ‘œ 더 μ‰½κ²Œ ν’€λ¦¬λ‚˜? μƒκ°ν•΄μ„œ

μ‚½μ§ˆμ„ μ—΄μ‹¬νžˆ ν–ˆλ‹€.. μ‘°ν•©μœΌλ‘œ 해도 될 κ±° κ°™κΈ΄ ν•˜μ§€λ§Œ μ‚Όμ„± μ•Œκ³ λ¦¬μ¦˜μ€ dfsλ₯Ό μ—°μŠ΅ν•΄λ‘λ©΄ μ’‹μœΌλ‹ˆκΉŒ λ‹€μ‹œ !

μ‘°ν•©μ²˜λŸΌ Nλͺ…μ€‘μ—μ„œ 뽑은 μ„ μˆ˜λŠ” visited 처리λ₯Ό ν•˜κ³ , N//2λͺ…을 λ½‘μ•˜λ‹€λ©΄ visited된 μ„ μˆ˜, not visited μ„ μˆ˜λΌλ¦¬ 값을 더해주면 λœλ‹€.

νŒŒμ΄μ¬μ€ ν™•μ‹€νžˆ Cλ³΄λ‹€λŠ” μ½”λ“œκ°€ 보기가 κΉ”λ”ν•œ κ±° κ°™λ‹Ή πŸ₯²

 

μ‹œκ°„μ΄ˆκ³Όκ°€ 계속 λ‚˜μ„œ μ•½κ°„ μ—΄λ°›μ•˜λŠ”λ°,, visited처리 ν•  λ•Œ μΈλ±μŠ€κ°’λ„ ν•¨κ»˜ λ„˜κ²¨μ„œ 이전에 λΉ„κ΅ν•œ 이후뢀터 λΉ„κ΅ν•˜λ‹ˆκΉŒ ν†΅κ³ΌπŸ˜­

N = int(input())
visited = [False for _ in range(N)]
arr = [list(map(int, input().split())) for _ in range(N)]
minimum = 1e9

def solutions(cnt, index):
    global minimum
    if cnt == N//2:
        start, link = 0, 0

        for i in range(N):
            for j in range(N):
                if visited[i] and visited[j]:
                    start += arr[i][j]
                elif not visited[i] and not visited[j]:
                    link += arr[i][j]

        minimum = min(minimum, abs(start - link))
        return
    
    for i in range(index, N):
        if not visited[i]:
            visited[i] = True
            solutions(cnt+1, i+1)
            visited[i] = False
    
solutions(0,0)
print(minimum)
profile

πŸ‘©πŸ»‍πŸ’» 갓생 직μž₯인 λ‚¨λ°”μ˜€

@λ‚¨λ°”μ˜€