프렌즈4블록 Pgs#17679
프렌즈4블록 PGs#17679
Python 코드 보기
def scan(m,n,board):
delPoints = []
for i in range(m-1):
for j in range(n-1):
if board[i][j] == ' ':
continue
elif board[i][j] == board [i+1][j+1] and board[i][j] == board[i][j+1] and board[i][j] == board[i+1][j]:
delPoints.append([i,j,board[i][j]])
return delPoints
def delBoard(delPoint,board):
cnt = 0
for i in range(0,4):
if board[delPoint[0]+i//2][delPoint[1]+i%2] == delPoint[2]:
cnt += 1
board[delPoint[0]] = board[delPoint[0]][0:delPoint[1]] + ' ' + board[delPoint[0]][delPoint[1]+2:]
board[delPoint[0]+1] = board[delPoint[0]+1][0:delPoint[1]] + ' ' + board[delPoint[0]+1][delPoint[1]+2:]
return cnt
def pullDown(m, n, board):
for i in range(m-1,0,-1):
for j in range(0,n):
if board[i][j] == ' ':
target = i-1
while target > 0:
if board[target][j] == ' ':
target -= 1
else:
break
board[i] = board[i][0:j] + board[target][j] + board[i][j+1:]
board[target] = board[target][0:j] + ' ' + board[target][j+1:]
def solution(m, n, board):
answer = 0
while True:
delPoints = scan(m,n,board)
if delPoints == []:
break
for delPoint in delPoints:
answer += delBoard(delPoint,board)
pullDown(m,n,board)
return answer
☝ 입력 형식
- 입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다. (2 ≦ n, m ≦ 30)
- board는 길이 n인 문자열 m개의 배열로 주어진다.
- 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.
🤞 출력 형식
- 입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.
🤟 구현 방법
1. 2x2씩 삭제할 블록 검색
- 해당 블록을 찾기 위해,
scan()
이라는 함수를 구현하여 사용하였다. - 2x2블록의 (0,0)부분, 즉 좌측 상단을 기준점으로 하여 삭제할 점의 좌표와, 언어를
delPoints
라는 리스트에 저장하였다.
2. 삭제할 블록 삭제
- 블록 삭제는 여러번 일어나기 때문에,
scan()
으로 찾은delPoints
를 각각delBoard()
라는 함수에 넣는 방식으로 구현하였다. - 삭제되는 영역이 중복 될 수 있기 때문에, 해당 영역이 이미 삭제되어 있는지 아닌지 확인하는 절차가 필요했다.
사실 내가 구현한 방식은 삭제할 때 마다
answer
을 올리는 방식은 아니다.삭제 할 블록의 수를
cnt
에 저장하고, 해당 블록의 영역을' '
로 치환 한 후,answer += cnt
로 추가하는 방식이다.
3. 끌어내리기
- 빈 칸을 찾으면, 위에서 끌어내릴 블록을 찾는 함수
pullDown()
을 구현하였다.
댓글남기기