https://programmers.co.kr/learn/courses/30/lessons/17679?language=python3
코딩테스트 연습 - [1차] 프렌즈4블록
프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙
programmers.co.kr
def check_square(board):
zero = []
for i in range(len(board) - 1):
for j in range(len(board[i]) - 1):
if board[i][j] != "o" and board[i][j] == board[i + 1][j + 1] == board[i + 1][j] == board[i][j + 1]:
zero.append([i, j])
zero.append([i + 1, j + 1])
zero.append([i + 1, j])
zero.append([i, j + 1])
return zero
def move_block(board, zero):
# 역순으로 아래부터 확인한다. 이유는? 위에서 부터 확인하면 공중 부양하는 블록이 나올수 있다.
# 아래에 있는 블록부터 비어있는 곳은 내려야하므로
for i in range(len(zero) - 1, -1, -1):
# 제거된 블록의 바로위의 확인해보기 위한 값이다.
check_n = zero[i][0] - 1
# 비어있는 곳에 블록을 놓아야할 위치다
put_n = zero[i][0]
# 이제 반복문을 돌면서 확인한다.
while check_n >= 0:
# 만약에 블록이 있고 놓아야할 블록의 위치가 비어있다면? if 문 실행
if board[check_n][zero[i][1]] != "o" and board[put_n][zero[i][1]] == "o":
# 위치를 채워주는 곳이다.
board[put_n][zero[i][1]] = board[check_n][zero[i][1]]
# 이동 시킨 곳은 빈곳이 되므로 표시
board[check_n][zero[i][1]] = "o"
# 놓아야 할 곳이 채워지므로 값을 -1해주고 위에 부터 확인해준다.
put_n -= 1
# 그리고 체크해야 할 곳이 아래에서부터 위로 하나 줄었으니 -1
check_n -= 1
return board
def solution(m, n, board):
answer = 0
for i in range(len(board)):
board[i] = list(board[i])
while True:
count = 2
zero = check_square(board)
for i in range(len(zero)):
board[zero[i][0]][zero[i][1]] = "o"
count += 1
board = move_block(board, zero)
if len(zero) == 0:
break
for i in range(len(board)):
answer += board[i].count("o")
return answer
이 문제는 테스트 5만 엄청 해결이 안되서 너무 힘들었던 문제이다.
후...
여기서 확인 해보면 좋은 곳이 move_block 이다,
이 부분이 문제 였는 데 꼭 조건들을 확인해보며 체크하면 좋을거 같다.
반응형
'코딩 > 프로그래머스 lv2' 카테고리의 다른 글
[프로그래머스] 주차 요금 계산 - 파이썬 (0) | 2022.03.21 |
---|---|
[프로그래머스] [3차] 방금그곡 - 파이썬 (0) | 2022.03.08 |
[프로그래머스] 더 맵게 - 파이썬 (0) | 2022.02.28 |
[프로그래머스] 뉴스 클러스터링- 파이썬 (0) | 2022.02.21 |
[프로그래머스] 순위 검색 - 파이썬 (0) | 2022.02.06 |