코딩테스트 연습 - [1차] 프렌즈4블록 | 프로그래머스 (programmers.co.kr)

문제설명은 위의링크에서 읽고 진행하는것을 추천합니다.

일단. 이 문제를 풀려면 최소 3개의 파트와 기능이 구현되어야한다고 생각되었다.

1번으로 Check!
보드의 인덱스에 따라 그녀석을 왼쪽위로하는 4칸을 터트릴 수 있는지 확인해야한다. 
Stride개념 (칸 건너뛰기) 을 줘서 풀면 안되는데, 그 이유는 6칸이 터져야하는데, 이걸 한칸건너뛰는 방식으로 갈 경우, 4칸만 터지고 넘어갈 것이라 그러하다.

2번으로 breaking!
찾았으면 터트려야한다. 
난 이부분을 check함수에 if문 분기를 달리하여 재활용했다. 그 이유는 어짜피 체크에서도 4칸을 뒤져봐야하고, 터트릴때고 4칸을 돌아야하기때문데, 굳이 새로운함수를 만들 필요가 없다고 생각했다.
그리하여 breaking이라는 파라미터를 줘서, 이게 체크용도로 쓰는것인지, 터트리는 용도로 쓰는것인지 조건에 따라 분기시켰다. 

3번으로 clead!
터트렸으면, 위에있는녀석들이 아래로 떨어지는것을 구현해야했다. 
사실상 코딩할때 가장 고민되었던 부분이며, 좀 더 효율적으로 짜고싶다는 욕심으로 이미 비어버린 보드row,col은 지워버릴까..도했지만, 그러면 m,n을 다시 계산해주면서 해야하는데, 그게 사실 너무 귀찮아서 다시 이터레이션을 돌도록 만들어버렸다.
만들땐 각 column마다 아래로 내려끌도록하였으며, 그 함수안에 Queue 개념을 사용했고, 맨 아랫층부터 시작하는형태로 iteration을 돌렸다.

def solution(m,n,board):
    answer=0
    bd=[[i for i in row] for row in board]
    while True:
        bklist=[]
        for i in range(m-1): # 맨오른쪽과, 맨아랫라인은 체크할 필요가 없음 
            for j in range(n-1):
                tf,_=check(bd,i,j,m,n,0)
                if tf: # check
                    bklist.append([i,j])
        if bklist :
            for i,j in bklist:
                answer += check(bd,i,j,m,n,1)[1]
            for col in range(n):
                clearbd(bd,m,col)
        else:
            break
    return answer

def check(bd,i,j,m,n,breaking):
    if bd[i][j]==0 and breaking!=1: return False, 0
    adx=[0,0,1,1]
    ady=[0,1,0,1]
    bkcnt=0
    for dx,dy in zip(adx,ady):
        x=i+dx
        y=j+dy
        if breaking:
            if bd[x][y]==0 : pass
            else: 
                bd[x][y] = 0
                bkcnt+=1
        elif x<m and y<n:
            if bd[x][y] != bd[i][j]: 
                return False, bkcnt
    return True, bkcnt

def clearbd(bd,m,col):
    tmp=[]
    tog=1
    for row in range(m-1,-1,-1):
        if bd[row][col]!=0:
            tmp.append(bd[row][col])
            bd[row][col]=0
    for row in range(m-1 , m-len(tmp)-1 , -1):
        bd[row][col] = tmp.pop(0)
# m,n,board = 4,5,["CCBDE", "AAADE", "AAABF", "CCBBF"]#14
m,n,board = 6,6,["TTTANT", "RRFACC", "RRRFCC", "TRRRAA", "TTMMMF", "TMMTTJ"]#15
solution(m,n,board)

 

 

 

+ Recent posts