Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions cadetbluee/week12/problem_14889_success.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import sys
input=sys.stdin.readline
N=int(input())
arr=[list(map(int,input().split())) for _ in range(N)]
idx=[0]*N
visited=[0]*(N)
min_gap=1e9
def recur(i,idx):
global min_gap
if i==N//2:

sum_1=0
sum_2=0
for i in range(N):
for j in range(N):
if visited[i] and visited[j]:
sum_1+=arr[i][j]
elif not visited[i] and not visited[j]:
sum_2+=arr[i][j]

min_gap=min(min_gap,abs(sum_2-sum_1))

return
for j in range(idx,N):
if visited[j]:
continue
visited[j]=1
recur(i+1,j+1)
visited[j]=0

recur(0,0)
print(min_gap)
Empty file.
72 changes: 72 additions & 0 deletions cadetbluee/week12/problem_19237_success.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
from copy import deepcopy
n, m, k = map(int,input().split())
board = [[int(x) for x in input().split()] for _ in range(n)]
smell = [[[0,-1]]*n for _ in range(n)]

shark_dir = list(map(int,input().split()))
for i in range(m):
shark_dir[i] = [shark_dir[i]]
for _ in range(4):
shark_dir[i].append(list(map(int,input().split())))

cnt = 0
dir = [(-1,0),(1,0),(0,-1),(0,1)]
temp = 0
while True:
if temp == m-1 :
print(cnt)
break
if cnt >= 1000:
print('-1')
break

for i in range(n):
for j in range(n):
if board[i][j] != 0:
smell[i][j] = [k,board[i][j]]

new_board = deepcopy(board)
for i in range(n):
for j in range(n):
if board[i][j] != 0:
d, up, down, left, right = shark_dir[board[i][j]-1]
dir_arr = [up, down, left, right]
flag = 0
for p in range(4):
dx, dy = dir[dir_arr[d-1][p] - 1]

if -1 < i+dx < n and -1 < j+dy < n and smell[i+dx][j+dy] == [0,-1]:

if new_board[i+dx][j+dy] == 0:
new_board[i+dx][j+dy] = board[i][j]
new_board[i][j] = 0

else:
if new_board[i+dx][j+dy] > board[i][j]:
new_board[i+dx][j+dy] = board[i][j]
temp += 1
new_board[i][j] = 0
shark_dir[board[i][j]-1][0] = dir_arr[d-1][p]
flag = 1
break
else:

for p in range(4):
dx, dy = dir[dir_arr[d-1][p] - 1]

if -1 < i+dx < n and -1 < j+dy < n and smell[i+dx][j+dy][1] == board[i][j]:
new_board[i+dx][j+dy] = board[i][j]
new_board[i][j] = 0
shark_dir[board[i][j]-1][0] = dir_arr[d-1][p]
break

board = deepcopy(new_board)

for i in range(n):
for j in range(n):
if smell[i][j][1] != -1:
smell[i][j][0] -= 1
if smell[i][j][0] == 0:
smell[i][j] = [0,-1]

cnt += 1
46 changes: 46 additions & 0 deletions cadetbluee/week14/problem_14502_fail.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import copy
N,M=map(int,input().split())
arr=[list(map(int,input().split()))for _ in range(N)]
def check(arr):
stack=[]
for i in range(N):
for j in range(M):
if arr[i][j]==2:
stack.append((i,j))
temp=copy.deepcopy(arr)
while stack:
i,j=stack.pop()
for d in [(0,1),(0,-1),(1,0),(-1,0)]:
ni=i+d[0]
nj=j+d[1]
if 0<=ni<N and 0<=nj<M and arr[ni][nj]==0:
temp[ni][nj]=2
stack.append((ni,nj))
cnt=0
for i in range(N):
for j in range(M):
if temp[i][j]==0:
cnt+=1

return cnt
possibilities=[]
for i in range(N):
for j in range(M):
if arr[i][j]==0:
possibilities.append((i,j))
visited=[0]*len(possibilities)
max_poss=0
def recur(i):
global max_poss
if i==3:
max_poss=max(max_poss,check(arr))
print(arr)
return
for idx,(r,c) in enumerate(possibilities):
if arr[r][c]==0:
arr[r][c]=1
recur(i+1)
arr[r][c]=0

recur(0)
print(max_poss)
64 changes: 64 additions & 0 deletions cadetbluee/week14/problem_17141_success.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
from collections import deque
from itertools import combinations

dr = [0,1,0,-1]
dc = [1,0,-1,0]
N,M = map(int,input().split())

grid = [list(map(int,input().split())) for _ in range(N)]


wall = []

virus_sub = []

for r in range(N) :
for c in range(N) :
if grid[r][c] == 1 :
wall.append((r,c))

elif grid[r][c] == 2 :
virus_sub.append((r,c))
grid[r][c] = 0

res = 10e9

for virus in combinations(virus_sub,M) :

visited = [[0]*N for _ in range(N)]

v = deque(virus[:])

for r,c in virus :
grid[r][c] = 2
visited[r][c] = 1

cnt = M+len(wall)
while v :
cr,cc = v.popleft()

for d in range(4) :
nr = cr + dr[d]
nc = cc + dc[d]

if 0<=nr<N and 0<=nc<N and not visited[nr][nc] and grid[nr][nc] == 0 :
visited[nr][nc] = visited[cr][cc] + 1
v.append((nr,nc))
cnt += 1

if N**2 - cnt == 0:
tmp = 0
for r in range(N) :
tmp = max(max(visited[r]),tmp)

if tmp<res :
res = tmp
break

for r,c in virus :
grid[r][c] = 0

if res>=10e9 :
print(-1)
else :
print(res-1)
95 changes: 95 additions & 0 deletions cadetbluee/week14/problem_17142_fail.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import sys
from collections import deque

# BFS로 바이러스 퍼트리는 함수
def bfs(viruses):
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

que = deque()
isVisited = [[-1 for _ in range(N)] for _ in range(N)]

for virus in viruses:
que.append([virus[0], virus[1]])
isVisited[virus[0]][virus[1]] = 0

total_time = 0
while que:
now = que.popleft()

nowX = now[0]
nowY = now[1]
nowTime = isVisited[nowX][nowY]

for t in range(4):
nx = nowX + dx[t]
ny = nowY + dy[t]
# 범위 체크
if nx < 0 or ny < 0 or nx >= N or ny >= N:
continue
# 빈 자리 and 아직 방문 안한 자리
if board[nx][ny] == 0 and isVisited[nx][ny] == -1:
que.append([nx, ny])
isVisited[nx][ny] = nowTime + 1
# 여기만 걸린 시간 갱신
total_time = max(total_time, nowTime + 1)
# 비활성 바이러스 자리 and 아직 방문 안한 자리
elif board[nx][ny] == 2 and isVisited[nx][ny] == -1:
que.append([nx, ny])
isVisited[nx][ny] = nowTime + 1

# 벽 제외하고 바이러스가 퍼지지 못한 구역이 있는지 확인
w_cnt = 0
for i in range(N):
for j in range(N):
if isVisited[i][j] == -1:
w_cnt += 1

if w_cnt != wall_cnt:
return 1e9

return total_time

# 활성화시킬 바이러스 위치를 조합으로 구하는 함수
def find_case(depth, start):
global min_
# 조합 완성
if depth == M:
# 바이러스 놓을 위치를 M개 고르면 BFS로 퍼트리기
min_ = min(min_, bfs(viruses))

return

for i in range(start, len(virus_pos)):
viruses.append(virus_pos[i])

find_case(depth + 1, i + 1)

viruses.pop()


N, M = map(int, sys.stdin.readline().split())

board = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]


wall_cnt = 0
# 바이러스 위치를 배열에 저장
virus_pos = []
for i in range(N):
for j in range(N):
if board[i][j] == 2:
virus_pos.append([i, j])
elif board[i][j] == 1:
wall_cnt += 1

min_ = 1e9
# 바이러스 3개 고르는 경우
viruses = []

find_case(0, 0)

if min_ != 1e9:
print(min_)
else:
print(-1)