구현 문제 풀이
💙 백준 골드1 달이 차오른다, 가자.
문제번호 | 언어 | 메모리 | 시간 |
---|
1194 | Python 3 | - KB | - ms |
- 3차원 visited 사용 DFS + 비트마스킹
- DFS 종료문 : 1을 발견한 경우 Return
- Deque를 사용하여, depth가 작은 순서대로 순차적으로 append하면서 index 순서대로 pop
- 2차원 visited 배열을 사용한다면, 키를 가지고 다시 같은 위치에 돌아오지 못하므로, key값을 가지고 3차원 배열로 visited 배열을 만든다
- 그러나 2차원 visited 배열에 비트마스킹 값을 넣어주면서 해당 키를 가지고 온 적이 있냐를 확인하는 식으로 처리함 (어차피 key를 버리진 못해서 | (OR) 계산 후 같은 값이면 이미 같은 상태로 온 적이 있다는 것이기 때문에 이런식으로 계산함)
- 비트마스킹이 생소할 경우, 아래 링크 참조해서 공부해보기
비트마스킹 개념 https://travelbeeee.tistory.com/451
from collections import deque
import sys
input = sys.stdin.readline
def solve():
n,m = map(int,input().split())
board = [list(input().rstrip()) for _ in range(n)]
visit = [[-1]*m for _ in range(n)]
key = {'a':1,'b':2,'c':4,'d':8,'e':16,'f':32}
door = {'A':1,'B':2,'C':4,'D':8,'E':16,'F':32}
move = [(0,1),(1,0),(0,-1),(-1,0)]
q = deque()
for i in range(n):
for j in range(m):
if board[i][j] == '0':
q.append((i,j,0,0))
visit[i][j] = 0
board[i][j] = '.'
break
else:
continue
break
while q:
x,y,cnt,bit = q.popleft()
for a,b in move:
dx=x+a; dy=y+b
if dx>=n or 0>dx or dy>=m or 0>dy or board[dx][dy] == "#":
continue
if not visit[dx][dy] == -1 and visit[dx][dy] | bit == visit[dx][dy]:
continue
visit[dx][dy] = bit
if visit[dx][dy] == -1:
visit[dx][dy] = 0
if board[dx][dy] == '.':
q.append((dx,dy,cnt+1,bit))
continue
if board[dx][dy] == '1':
print(cnt+1)
sys.exit()
k = key.get(board[dx][dy])
if k != None:
q.append((dx,dy,cnt+1,bit|k))
continue
d = door.get(board[dx][dy])
if d | bit == bit:
q.append((dx,dy,cnt+1,bit))
print(-1)
solve()
df
문제번호 | 언어 | 메모리 | 시간 |
---|
1194 | Python 3 | - KB | - ms |
def permutation(arr, cnt):
result = []
def permute(c, index):
if len(c) == cnt:
result.append(c)
return
for idx, data in enumerate(arr):
if idx not in index:
permute(c + [data], index + [idx])
permute([], [])
def rotate(arr):
n = len(arr)
new = [0 * n for _ in range(n)]
for i in range(n):
for j in range(n):
new[i][j] = arr[n-j-1][i]
return new
def bomb(a1, a2, a3, c1, c2, c3):
kiln = [0 * 5 for i in range(5)]
startIdx = [(0,0), (0,1), (1,0), (1,1)]
for x1, y1 in range(startIdx):
k1, color =
for x2, y2 in range(startIdx):
for x3, y3 in range(startIdx):
n = int(input())
met = []
effect = []
for _ in range(n):
met.append([list(map(int, input().split())) for _ in range(4)])
effect.append([list(map(int, input().split())) for _ in range(4)])
result = 0
com = [i for i in range(n)]
for selectMets in permutation(com, 3):
met1, met2, met3 = met[selectMets[0]], met[selectMets[1]], met[selectMets[2]]
eff1, eff2, eff3 = effect[selectMets[0]], effect[selectMets[1]], effect[selectMets[2]]
for i in range(4):
met1 = rotate(met1)
eff1 = rotate(eff1)
for j in range(4):
met2 = rotate(met2)
eff2 = rotate(eff2)
for k in range(4):
met3 = rotate(met3)
eff3 = rotate(eff3)
bomb(met1, met2, met3, eff1, eff2, eff3)