상세 컨텐츠

본문 제목

[코테] 프로그래머스 파이썬 Lv2. [1차] 프렌즈4블록

코테

by Graceful_IT 2024. 1. 6. 21:43

본문

같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.

블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다.

만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다.

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

처음에는 [0][0] 부터 시작하여 m-1, n-1 까지 반복문을 돌며, 해당 좌표에서 아래, 대각선아래, 오른쪽으로 사각형을 확인했다. 만약 해당 좌표가 모든 사각형에서 사라질 수 있는 조건에 해당한다면, 해당 좌표를 방문했는지 확인(visited) 후 최종 방문 블럭 수에 추가해주었다.

def rotation(x,y,chars,board,visited):
    dx=[0,1,1,0]
    dy=[1,1,0,0]
    result=0
    cnt=0
    
    for i in range(3):
        if board[x+dx[i]][y+dy[i]] == chars:
            cnt+=1
    
    if cnt==3:
        for i in range(4):
            if visited[x+dx[i]][y+dy[i]]==0:
                visited[x+dx[i]][y+dy[i]]=1
                result+=1
                
    return result

def solution(m, n, board):
    visited=[]
    for i in range(m):
        visited.append([0]*n)
        
    answer=0
    check=0
    
        
    for i in range(m-1):
        for j in range(n-1):
            check=rotation(i,j,board[i][j],board,visited)
            answer+=check
            
    
    return answer

 

하지만 다시 지워진 곳에 떨어지는 조건을 충족하지 못하여 모든 점수를 얻을 수 없었다.

 

 

참고한 최종코드는 다음과 같다. 전체 코드를 while True:로 감싼 뒤 표시된 블록을 지우고 다시 rotation 함수를 돌리는 과정이 필요했다.

def rotation(x,y,board,m,n) :
    dx=[0,1,1]
    dy=[1,0,1]
    count=0
    result=False
    for i in range(3) :
        nx=x+dx[i]
        ny=y+dy[i]
        if nx>=m or ny>=n :
            continue
        if board[x][y]==board[nx][ny] :
            count+=1
    if count==3 :
        result=True
    return result
    
def solution(m, n, board):
    answer = 0
    for i in range(m) :
        board[i]=list(board[i])
    while True :
        visited=[[0]*n for _ in range(m)]
        count=0
        
        #지워질 블록 표시하기
        for i in range(m) :
            for j in range(n) :
                if board[i][j]!='9' and rotation(i,j,board,m,n) :
                    visited[i][j]=visited[i][j+1]=visited[i+1][j]=visited[i+1][j+1]=1
                    count+=1
        
        #더이상 지워질 블록이 없으면 종료
        if count==0 :
            break
            
        #표시된 블록 지우기
        for i in range(m) :
            for j in range(n) :  
                if visited[i][j]==1 :
                    board[i][j]='9'
                    answer+=1
                    
        #블록 정리하기
        for y in range(n) :
            for i in range(m) :
                for x in range(m-1) :
                    if board[x+1][y]=='9' :
                        board[x+1][y]=board[x][y]
                        board[x][y]='9'
                        
    return answer

관련글 더보기