eaz_coding

[Programmers] 프렌즈4블록 본문

eaz_algorithm

[Programmers] 프렌즈4블록

eaz_silver 2024. 5. 16. 16:24

문제

요약

블록이 2x2 형태로 4개가 붙어 있을 경우 사라지면서 점수를 얻는다.

블록이 사라진 자리는 위의 블록이 아래로 내려와 채우게 된다.

사라지는 블록 개수를 구하는 문제

 

출처

https://school.programmers.co.kr/learn/courses/30/lessons/17679

 

프로그래머스

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

programmers.co.kr


풀이

지우는 방향을 오른쪽으로 돌리는게 풀이의 첫 단추인 것 같다.

보통 배열의 크기를 줄 때, 행을 n, 열을 m으로 주는 데

반대로 m,n으로 주길래 어색했는데 오른쪽으로 돌리라고 반대로 줬나보다.

 

2x2블록이 완성된 데에서 바로 지워버릴까 했는데

그러면 2x3이나 약간 겹쳐있는 부분을 못찾기 때문에 다 찾은 뒤에 지우는 방식으로 했다.

 

그리고 앞에서부터 블록을 지워 그 뒤의 블록이 앞으로 오게 되면 지우지 말아야 할 블록을 지우기 때문에

열을 내림차순하여 맨 뒤 블록부터 지워줬다.

def solution(m, n, board):
    answer = 0
    # 배열로 만들기
    arr = [list(board[i]) for i in range(m)]
    # 오른쪽으로 돌리기
    arr = list(map(list, zip(*arr[::-1])))
    
    # 지워지는 블록이 있는지 확인하는 용도
    check = True
    # 2x2에서 오른쪽 상단에서 비교
    directions = [(0,-1), (1,-1), (1,0)]
    
    while check:
        check = False
        tmp = set()
        for i in range(n-1):
            for j in range(m-1, 0, -1):
            	# 이미 지워진 곳은 확인 X
                if arr[i][j] != '':
                    for di, dj in directions:
                        if arr[i+di][j+dj] != arr[i][j]:                          
                            break
                    else:
                    	# 지워지는 블록 있음.
                        check = True
                        tmp.add((i, j))
                        for di, dj in directions:
                            tmp.add((i+di, j+dj))
        
        # 블록의 위, 오른쪽부터 지워가기
        for i, j in sorted(list(tmp), key = lambda x:(x[0], -x[1])):
            arr[i] = arr[i][:j] + arr[i][j+1:] + [""]
            answer += 1
        
    return answer

'eaz_algorithm' 카테고리의 다른 글

[Programmers] 큰 수 만들기  (0) 2024.05.23
[Programmers] 숫자 변환하기  (0) 2024.05.17
[Programmers] 예상 대진표  (0) 2024.04.17
[Programmers] 단어 변환  (0) 2024.03.29
[Programmers] 전화번호 목록  (0) 2024.03.28