728x90
반응형
https://www.acmicpc.net/problem/2210
최종 코드
import sys
def dfs(cnt, x, y, num):
global nums
if cnt == 6:
nums.add(num)
return
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<5 and 0<=ny<5:
dfs(cnt+1, nx, ny, num+board[ny][nx])
global nums
board = []
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
nums = set()
for _ in range(5):
board.append(list(sys.stdin.readline().split()))
for i in range(5):
for j in range(5):
dfs(1, j, i, board[i][j])
print(len(nums))
import sys
from collections import deque
def bfs(sx, sy):
global nums
q = deque()
q.append([sx, sy, board[sy][sx]])
while q:
x, y, num = q.popleft()
if len(num) == 6:
nums.add(num)
continue
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<5 and 0<=ny<5:
q.append([nx, ny, num+board[ny][nx]])
global nums
board = []
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
nums = set()
for _ in range(5):
board.append(sys.stdin.readline().split())
for i in range(5):
for j in range(5):
bfs(i, j)
print(len(nums))
풀이 과정
풀이 시간 14분
1. DFS
import sys
def dfs(cnt, x, y, num):
global nums
#6자리가 만들어진 경우, 집합 nums에 num을 추가
if cnt == 6:
nums.add(num)
return
#인접한 네 방향 탐색
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<5 and 0<=ny<5:
dfs(cnt+1, nx, ny, num+board[ny][nx])
global nums
board = []
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
nums = set()
for _ in range(5):
board.append(list(sys.stdin.readline().split()))
for i in range(5):
for j in range(5):
dfs(1, j, i, board[i][j])
print(len(nums))
#시간복잡도 = O(V(V+E)) = O(V^2), 공간복잡도 = O(V^2)
#V = 25, E = 4V = 100 -> 총 25(25+100) = 3125번의 연산 필요
#6자리를 만드는 경우의 수만큼 집합 자료구조 공간 할당 필요 -> DFS 호출 횟수 만큼
2. BFS
import sys
from collections import deque
def bfs(sx, sy):
global nums
q = deque()
q.append([sx, sy, board[sy][sx]])
while q:
x, y, num = q.popleft()
#6자리가 만들어진 경우, 집합 nums에 추가
if len(num) == 6:
nums.add(num)
continue
#인접한 네 방향 탐색
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<5 and 0<=ny<5:
q.append([nx, ny, num+board[ny][nx]])
global nums
board = []
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
nums = set()
for _ in range(5):
board.append(sys.stdin.readline().split())
for i in range(5):
for j in range(5):
bfs(i, j)
print(len(nums))
#시간복잡도 = O(V(V+E)) = O(V^2), 공간복잡도 = O(V^2)
#V = 25, E = 4V = 100 -> 총 25(25+100) = 3125번의 연산 필요
#6자리를 만드는 경우의 수만큼 집합 자료구조 공간 할당 필요 -> DFS 호출 횟수 만큼 공간 할당
728x90
반응형
'코테 노트 > 백준' 카테고리의 다른 글
백준 1058 친구 C++ (0) | 2021.08.26 |
---|---|
백준 3184 양 C++ (0) | 2021.08.24 |
백준 2251 물통 Python 3 (0) | 2021.08.20 |
백준 17779 게리맨더링 2 C++ (0) | 2021.08.19 |
백준 16173 점프왕 쩰리 (Small) Python3 (0) | 2021.08.19 |