본문 바로가기

PS/프로그래머스

[프로그래머스 LV 2] [1차] 프렌즈4블록 (파이썬/python)

728x90

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

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr

 

일단 삭제 후 블록이 아래로 내려오는 방법을 구현하는데 애 먹었다.

원래 행렬을 오른쪽으로 90도 돌린 행렬을 사용했다.

 

 

 

리스트는 가운데 값이 사라지면 알아서 크기가 조정된다.

그렇기 때문에 전치행렬을 사용하면 삭제시 블록 재배치 되는 과정을 따로 구현해줄 필요가 없다.

 

하지만 배열의 크기가 유지돼야 반복문 구성이 수월하기 때문에 뒤에 "0"을 붙여줘서 배열의 크기는 유지해줬다.

 

set 자료구조를 이용해서 삭제해야되는 좌표값의 중복을 알아서 제거되게 구성했다.

 

어려웠다.....

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def solution(m, n, board):
    answer = 0
    # 오른쪽으로 90도 돌린 행렬을 만들어줌
    li = [[board[i][j] for i in range(m - 1-1-1)] for j in range(n)]
    print(li)
 
    # m,n이 서로 바뀜
    while 1:
        # 지워야하는 블록 좌표는 중복되는 값을 알아서 거르게 set에 저장함
        s = set()
 
        for i in range(len(li) - 1):
            for j in range(len(li[i]) - 1):
 
                if li[i][j] != "0" and li[i][j] == li[i][j + 1== li[i + 1][j + 1== li[i + 1][j]:
                    s.add((i, j))
                    s.add((i + 1, j))
                    s.add((i, j + 1))
                    s.add((i + 1, j + 1))
 
        # 하나도 값을 삭제하지 못 했으면 반복문 탈출        
        if len(s) == 0:
            break
 
        # 삭제할 것들이 있으면 1로 마스킹해서 나중에 지워줌
        for x, y in s:
            li[x][y] = '1'
        for i in range(len(li)):
            for j in range(len(li[i]) - 1-1-1):
                # 지워야 할 것들이 있다면 지우고 0을 append 해서 배열의 크기를 유지해줌
                if li[i][j] == '1':
                    li[i].pop(j)
                    li[i].append("0")
 
        answer += len(s)
 
 
    return (answer)
cs
728x90