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
- BFS
- DFS
- 재귀
- JS
- 백준
- DFS활용
- 알고리즘
- 자료구조
- 그리디
- react
- 백준알고리즘
- DP
- 코테
- 코딩테스트실력진단
- 파이썬
- react-query
- 코드트리
- django
- 블챌
- 문자열
- 구현
- 그리디알고리즘
- socket.io
- 스택자료구조
- 스택
- 완전탐색
- 코딩테스트
- Express
- DFS기초
- CSS
Archives
- Today
- Total
꾸준하게 거북이처럼
백준 15661번 링크와 스타트 본문
15661번: 링크와 스타트
첫째 줄에 N(4 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 S가 주어진다. 각 줄은 N개의 수로 이루어져 있고, i번 줄의 j번째 수는 Sij 이다. Sii는 항상 0이고, 나머지 Sij는 1보다 크거나 같고, 100
www.acmicpc.net
처음에 python3로 코드를 제출하고 시간 초과가 나와다가, pypy로 제출하니 통과가 되었다. 그후로 왜 .. 어떻게 하면 python3로 통과할 수 있으려나 찾아보았다. 결론적으로는 if else문을 줄이고, for 중복문 중간에 if조건을 걸어서 통과할 수 있었다.
처음 코드 : pypy 통과
import sys
input = sys.stdin.readline
n = int(input())
s = []
ch = [0] * n
ans = 100000000
for _ in range(n):
s.append(list(map(int,input().split())))
def dfs(depth, L, index):
global ans
if L == depth:
star = 0
link = 0
for i in range(n):
for j in range(i + 1, n):
if ch[i] == 1 and ch[j] == 1:
star += s[i][j] + s[j][i]
elif ch[i] == 0 and ch[j] == 0:
link += s[i][j] + s[j][i]
if depth == 1:
ans = min(ans, link)
else:
ans = min(ans, abs(star - link))
else:
for i in range(index, n):
if ch[i] == 0:
ch[i] = 1
dfs(depth , L + 1, i + 1)
ch[i] = 0
for d in range(1, n//2 + 1):
dfs(d, 0, 0)
print(ans)
수정한 코드: python3 통과
import sys
input = sys.stdin.readline
n = int(input())
s = []
ch = [0] * n
ans = 100000000
for _ in range(n):
s.append(list(map(int,input().split())))
def dfs(depth, L, index):
global ans
if L == depth:
star = 0
link = 0
for i in range(n):
if ch[i] == 1:
for j in range(i + 1, n):
if ch[j] == 1:
star += s[i][j] + s[j][i]
else:
for j in range(i + 1, n):
if ch[j] == 0:
link += s[i][j] + s[j][i]
ans = min(ans, abs(star - link))
if ans == 0:
return
return
for i in range(index, n):
if ch[i] == 0:
ch[i] = 1
dfs(depth , L + 1, i + 1)
ch[i] = 0
for d in range(n//2,0,-1):
dfs(d, 0, 0)
if ans == 0:
break
print(ans)
큰 차이는, for 문 중복을 바로 시작하지 않고 중간에 If 문을 넣어줘서, 조금이라도 연산 횟수를 줄이는 것 같다.
'Algorithm 문제 & 공부 > 완전탐색' 카테고리의 다른 글
백준 애너그램 파이썬 (0) | 2023.04.30 |
---|---|
프로그래머스 광물캐기 python (0) | 2023.04.20 |
백준 14889번 파이썬 - 스타트와 링크 (1) | 2022.09.30 |
백준 14501 파이썬 - 퇴사 (1) | 2022.09.30 |
백준 파이썬 1759번 (0) | 2022.09.18 |
Comments