Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- 15552
- 카카오 클라우드 스쿨
- 9020
- python
- 알고리즘
- 11053
- boj
- java
- 11054
- Java #백준 #코딩테스트
- 2447
- 7568
- 백준
- kakaocloud
- Spring #Java #Spring Boot #@BeforeEach #@AfterEach
- 24479
- 1110
- Java #오븐시계 #백준
- sequelize
- 카카오클라우드스쿨
- Java #코딩테스트
- kakaocloudschool
- 코딩테스트
- Spring
- Spring #Spring Boot #Java
- 파이썬
- Spring #Java #Spring Boot
- SpringTokenizer
- node
- Spring #Java #Spring Boot #싱글톤
Archives
- Today
- Total
YoungSoo
백준 - 스타트와 링크(14889번 파이썬 풀이) 본문

백트래킹에서의 마지막 문제였는데 백트래킹 알고리즘은 정말 어려웠다. 먼저 틀린 예제를 보자.
import sys
input = sys.stdin.readline
def dfs(a):
global result
if len(s) == n//2:
lt, st = 0, 0
for i in range(1, n+1):
for j in range(1, n+1):
if i not in s and j not in s:
lt += arr[i-1][j-1]
elif i in s and j in s:
st += arr[i-1][j-1]
result= min(result, abs(lt-st))
return
for i in range(a, n+1):
if i not in s:
s.append(i)
dfs(i)
s.pop()
n=int(input())
arr=[list(map(int, input().split())) for _ in range(n)]
s=[]
result=int(1e9)
dfs(1)
print(result)
이 코드는 시간초과가 나와서 틀렸는데 그 이유는 앞 문제임 N과 M 문제에서 사용했던 방식처럼 모든 숫자를 순회하며
계산하는 방식으로 풀어서 시간초과가 나왔다.
이것을 해결하기 위해서는 전체를 순회하기보다는 4개의 숫자가 팀이 되었는지 안 되었는지를 따지고 풀면 시간초과가 안 뜬다. 밑에 코드를 보자
import sys
input = sys.stdin.readline
def dfs(a, idx):
global result
if a == n//2:
lt, st = 0, 0
for i in range(n):
for j in range(n):
if visited[i] and visited[j]:
lt += arr[i][j]
elif not visited[i] and not visited[j]:
st += arr[i][j]
result= min(result, abs(lt-st))
return
for i in range(idx, n):
if not visited[i]:
visited[i] = True
dfs(a+1, i+1)
visited[i] = False
n=int(input())
arr=[list(map(int, input().split())) for _ in range(n)]
visited = [False for _ in range(n)]
result=int(1e9)
dfs(0, 0)
print(result)
알고리즘 자체는 위에 코드와 비슷하지만 위에 코드는 배열을 선언해 모든 경우의 수를 대입하는 반면에 이 알고리즘은
팀에 소속된 선수와 안 된 선수를 구분하기 위해서 boolean 배열을 통해 해결해 주었다.
'코딩테스트' 카테고리의 다른 글
| 백준 - 구간 합 구하기5(11660 파이썬 풀이) (2) | 2023.01.12 |
|---|---|
| 백준 - 가장 긴 증가하는 부분 수열, 가장 긴 바이오닉 부분 수열(11053, 11054 파이썬 풀이) (0) | 2023.01.05 |
| 알고리즘 - 백트래킹(Backreacking) (0) | 2022.12.25 |
| 백준 - 조합 0의 개수(2004 파이썬 풀이) (0) | 2022.12.23 |
| 백준 - 검열(2981 파이썬 풀이) (0) | 2022.12.21 |