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

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

programmers.co.kr

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
def solution(m, n, board):
    def check(x, y):
        # 'R' 같은 문자
        k = graph[x][y]
        # '0'은 이미 부셔진 상태이므로 바로 탈출
        if k == '0':
            return
        for i in range(4):
            one, two, three = move[i]
 
            ax = x + one[0]
            ay = y + one[1]
 
            bx = x + two[0]
            by = y + two[1]
 
            cx = x + three[0]
            cy = y + three[1]
 
            if (0 <= ax < m and 0 <= ay < n) and (0 <= bx < m and 0 <= by < n) and (0 <= cx < m and 0 <= cy < n):
                if graph[ax][ay] == graph[bx][by] == graph[cx][cy] == k:
                    temp.add((x, y))
                    temp.add((ax, ay))
                    temp.add((bx, by))
                    temp.add((cx, cy))
 
    answer = 0
    graph = [list(i) for i in board]
    move = [
        [(-1-1), (-10), (0-1)],
        [(-10), (-11), (01)],
        [(0-1), (1-1), (10)],
        [(01), (10), (11)]
    ]
    print('초기 그래프')
    for i in graph:
        print(i)
    print()
 
    while True:
        temp = set()
        # 모든 좌표 check
        for i in range(m):
            for j in range(n):
                check(i, j)
 
        # 2x2 블록이 한개도 깨지지 않았다면, 더이상 부서질 블록은 없으므로 while 문 탈출
        if len(temp) == 0:
            break
 
        # temp 에 담긴 값들은 사라질 블록들이다. 모두 '0'으로 변환
        while temp:
            x, y = temp.pop()
            graph[x][y] = '0'
 
        print('블록 삭제')
        for i in graph:
            print(i)
 
        # 빈 공간('0')으로 블록들이 떨어지는 코드
        for i in range(n):
            for bottom in range(m - 10-1):
                if graph[bottom][i] == '0':
                    search = False
                    start_idx = bottom
 
                    for find in range(bottom - 1-1-1):
                        if graph[find][i] != '0':
                            search = True
                            find_idx = find
                            find_value = graph[find][i]
                            break
 
                    if search:
                        graph[start_idx][i] = find_value
                        graph[find_idx][i] = '0'
        print('빈 공간 제거')
        for i in graph:
            print(i)
        print()
 
    for i in range(m):
        for j in range(n):
            if graph[i][j] == '0':
                answer += 1
    return answer
 
 
= 6
= 6
= ["TTTANT""RRFACC""RRRFCC""TRRRAA""TTMMMF""TMMTTJ"]
print(solution(m, n, b))
cs

output:

초기 그래프
['T', 'T', 'T', 'A', 'N', 'T']
['R', 'R', 'F', 'A', 'C', 'C']
['R', 'R', 'R', 'F', 'C', 'C']
['T', 'R', 'R', 'R', 'A', 'A']
['T', 'T', 'M', 'M', 'M', 'F']
['T', 'M', 'M', 'T', 'T', 'J']

 

블록 삭제
['T', 'T', 'T', 'A', 'N', 'T']
['0', '0', 'F', 'A', '0', '0']
['0', '0', '0', 'F', '0', '0']
['T', '0', '0', 'R', 'A', 'A']
['T', 'T', 'M', 'M', 'M', 'F']
['T', 'M', 'M', 'T', 'T', 'J']
빈 공간 제거
['0', '0', '0', 'A', '0', '0']
['0', '0', '0', 'A', '0', '0']
['T', '0', 'T', 'F', 'N', 'T']
['T', 'T', 'F', 'R', 'A', 'A']
['T', 'T', 'M', 'M', 'M', 'F']
['T', 'M', 'M', 'T', 'T', 'J']

블록 삭제
['0', '0', '0', 'A', '0', '0']
['0', '0', '0', 'A', '0', '0']
['T', '0', 'T', 'F', 'N', 'T']
['0', '0', 'F', 'R', 'A', 'A']
['0', '0', 'M', 'M', 'M', 'F']
['T', 'M', 'M', 'T', 'T', 'J']
빈 공간 제거
['0', '0', '0', 'A', '0', '0']
['0', '0', '0', 'A', '0', '0']
['0', '0', 'T', 'F', 'N', 'T']
['0', '0', 'F', 'R', 'A', 'A']
['T', '0', 'M', 'M', 'M', 'F']
['T', 'M', 'M', 'T', 'T', 'J']

 

15

 

 

move 

빈칸 제거 탐색

 

'알고리즘 문제풀이 with 파이썬 > 프로그래머스' 카테고리의 다른 글

[DFS] 단어 변환  (0) 2021.10.30
[그리디, 투 포인터] 구명보트  (0) 2021.10.28
[DFS] 네트워크  (0) 2021.10.10
[완전탐색] 카펫  (0) 2021.10.09
[정렬] H_Index  (0) 2021.10.09

+ Recent posts