Coding Test/프로그래머스(Python)
[프로그래머스/Python] Level 2_[1차] 프렌즈4블록 (2018 KAKAO BLIND RECRUITMENT)
syunze
2023. 10. 26. 20:46
📌문제 유형
2018 KAKAO BLIND RECRUITMENT
📌문제
📌나의 문제풀이
- dfs 함수에서 4개가 같은 블록인지 확인 -> 같은 블록인 경우, 좌표 넣기
- 같은 블록이 터지면, 남아있는 블록 내리기
def dfs(x,y,m,n,new_board):
dx = [0,1,1]
dy = [1,0,1]
flag = 0
for k in range(3):
nx = x + dx[k]
ny = y + dy[k]
if 0 <= nx < m and 0 <= ny < n:
if new_board[x][y] == new_board[nx][ny]:
continue
else:
flag = 1
break
else:
flag = 1
break
if flag == 0:
return [(x,y), (x+1,y), (x,y+1), (x+1,y+1)]
else:
return []
def solution(m, n, board):
answer = 0
new_board = []
for k in range(len(board)):
new_board.append(list(board[k]))
while True:
list_ = []
for i in range(len(new_board)):
for j in range(len(new_board[0])):
if new_board[i][j] != '.':
check = dfs(i,j,m,n,new_board)
if check != []:
list_.extend(check)
list_ = list(set(list_))
if len(list_) == 0:
break
else:
answer += len(list_)
for a,b in list_:
new_board[a][b] = ''
# 돌려서 지우기
new_board = list(zip(*new_board))
new = []
for l in range(len(new_board)):
tmp = []
for t in range(len(new_board[l])):
if new_board[l][t] != '':
tmp.append(new_board[l][t])
tmp_n = ['.' for _ in range(len(new_board[l]) - len(tmp))]
tmp_n.extend(tmp)
new.append(tmp_n)
new_board = list(map(list,zip(*new)))
return answer
📌다른 사람의 문제풀이
def pang(m, n, board):
t_board = []
for x in range(m):
t_board.append([])
for y in range(n):
t_board[x].append(board[x][y])
flag = False
for x in range(m-1):
for y in range(n-1):
if len(set([board[x][y], board[x][y+1], board[x+1][y], board[x+1][y+1]])) == 1:
if board[x][y] != '0':
flag = True
t_board[x][y] = '0'
t_board[x][y+1] = '0'
t_board[x+1][y] = '0'
t_board[x+1][y+1] = '0'
return flag, t_board
def restruct(m, n, board):
re_board = [''] * m
for x in range(n):
ys = ''.join([board[y][x] for y in range(m)]).replace('0','').zfill(m)
for y in range(m):
re_board[y] += ys[y]
return re_board
def get_num(m, n, board):
cnt = 0
for x in range(m):
for y in range(n):
if board[x][y] == '0':
cnt += 1
return cnt
def solution(m, n, board):
flag = True
while flag:
flag, board = pang(m, n, board)
board = restruct(m, n, board)
return get_num(m, n, board)
📌리뷰
- 행렬 돌리기 : board = list(map(list,zip(*new)))
728x90