삼성 코테 빈출 알고리즘 정리
최근에는 3차원 BFS가 나오는 등 난이도가 더 괴랄해지고 있다. (그래서 탈락)
def snail_in2out_cc(board):
dx = (0, 1, 0, -1)
dy = (-1, 0, 1, 0)
x, y = n//2, n//2
step = 1
cnt = 0
d = 0
while check((x, y)):
for i range(step):
x += dx[d]
y += dy[d]
do_something()
cnt += 1
if cnt == 2:
d = (d + 1) % 4
step += 1
def snail_out2in_c(board):
dx = (0, 1, 0, -1)
dy = (1, 0, -1, 0)
x, y = 0, 0
step = n
cnt = 0
d = 0
while (x, y) != (n//2, n//2):
for i in range(step):
x += dx[d]
y += dy[d]
if not check((x, y)):
break
do_something()
cnt += 1
if not check((x, y)) or cnt == 2:
cnt = 0
step -=1
d = (d + 1) % 4
# 연쇄는 단일인 경우 그 위치의 갯수를 표현하여서 이동후 거기 여러개인지 while [][]==2 로 한다
# 여러개가 영향 받을 수 있는 경우에는 bfs로 가능한 놈들 다 찾아야함
def gravity(board):
n = len(board)
for j in range(n): # 각 열에 대해
for i in range(n-2, -1, -1): # 아래에서 두 번째 행부터 위로
idx = i
while idx < n-1 and board[idx][j] > 0 and board[idx+1][j] == 0:
board[idx][j], board[idx+1][j] = board[idx+1][j], board[idx][j]
idx += 1
# 일부분만 떼 와서 쓴다
def rotateR(board):
nBoard = [row[:] for row in board]
for i in range(len(board)):
for j in range(len(board)):
nBoard[i][j] = nBoard[n-1-j][i]
return nBoard
def rotateL(board):
nBoard = [row[:] for row in board]
for i in range(len(board)):
for j in range(len(board)):
nBoard[i][j] = nBoard[j][n-1-i]
return nBoard
# 주사위는 외우지 말고 그냥 한번씩 이동시키면서 인덱스의 변화를 관찰하고 이를 한번만 구현하면 된다
def diceRotate(dice, d):
nDice = [row[:] for row in dice]
if d == 2:
for i in range(4):
if i == 3:
nDice[i][1] = dice[0][1]
else:
nDice[i][1] = dice[i+1][1]
elif d == 0:
for i in range(4):
if i == 0:
nDice[i][1] = dice[3][1]
else:
nDice[i][1] = dice[i-1][1]
elif d == 1:
nDice[1][0] = dice[1][1]
nDice[3][1] = dice[1][0]
nDice[1][2] = dice[3][1]
nDice[1][1] = dice[1][2]
elif d == 3:
nDice[1][0] = dice[3][1]
nDice[3][1] = dice[1][2]
nDice[1][2] = dice[1][1]
nDice[1][1] = dice[1][0]
return nDice