[ 프로그래머스 / PYTHON ] 프렌즈 4블록

yujeongkwon·2022년 5월 5일
0

프로그래머스 / PYTHON

목록 보기
24/77

현재 구현이 약하다는 걸 느끼게 해준 문제

문제

프렌즈 4블록
같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임
입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.

내코드 & 생각 과정

처음에 4개사각형 되는거 보고 그 주위 같은 글자있으면 더해주기 -> 사각형만 포함해서 안됨 -> 다시 새로 하다가 모르겠어서 다른 사람 거 쪼꿈 봤움
==> 인덱스 저장하고 set 시키기 (이 처리가 막혔었음, extend도 처음 봄)

블록을 지우고 그만큼 내릴 때를 구현하기 힘들 것 같다고 생각함
입력해주는 대로 가로로 배열을 저장하는게 아니라 세로를 기준으로 배열을 저장해주고 각 행들을 뒤집어줌
==> 하나의 배열(블록)을 지우면 자동으로 위에 있던 블록들이 내려오는 효과

  • 왼쪽을 기준으로(가로기준으로는 아래)해야 del 했을 때 자동으로 내려오는 거처럼 되는데, 배열만들 때 오른쪽이 가로를 기준으로 했을 때 아래가 돼서 뒤집어줘야 왼쪽이 가로를 기준으로 했을 때 아래가 됨
  • 인덱스 지워줄 때(del할 때)도 큰 인덱스들을 먼저 지워줘야 작은 인덱스들을 지워줄 때 영향이 안감.
def solution(m, n, board):
    li = [[] for i in range(n)]
    answer = 0
	#배열 세로를 기준으로 들어 주기
    for i in range(n):
        for j in range(m):
            board[j] = list(board[j])
            li[i].append(board[j][i])

    for i in range(n):
        li[i] = li[i][::-1]
 #개수 세기
    while 1:
        index = []
        for i in range(n):
            for j in range(len(li[i])):
                try:
                    if li[i][j] == li[i+1][j] == li[i+1][j+1] == li[i][j+1]:
                        index.extend([(i,j),(i+1,j),(i,j+1),(i+1,j+1)])
                except: continue
# 중복 개수 지우고 블록 터트리기
        index = list(set(index))
        index.sort()
        for i,j in index[::-1]:
            del li[i][j]
        answer += len(index)
        if  len(index)==0:    break
    return answer
profile
인생 살자.

0개의 댓글