티스토리 뷰

https://programmers.co.kr/learn/courses/30/lessons/17679?language=python3 

 

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

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

programmers.co.kr

 

애니팡처럼 2x2 같은 모양의 캐릭터가 있으면 블록을 지우는 게임 입니다.

알고리즘은 다음과 같습니다.

  1.   모양이 같은 블록을 지우고 위에 있던 블록들이 아래로 떨어져야 하는데 이부분을 구현하기 위해서는 리스트를 회전 시켜 주는게 좋습니다. list(map(list,zip(*board)))  코드를 쓰면 리스트를 회전시킨것처럼 만들 수 있습니다.
  2.  블록을 하나씩 순회하며 옆, 아래, 대각선 방향이 같은지 확인하고, 같으면 좌표를 set에 넣어서 좌표가 중복되지 않게 보관합니다. | 연산자는  set에서 합집합을 의미합니다.
  3. set에 있는 좌표들에 '0' 을 찍어서 지운 블록들을 표시합니다.
  4. 지운 블록의 수만큼  '_' 블록을 리스트에 추가 해주고 뒤에 기존에 남아있던 블록들을 순서대로 붙입니다. 이렇게 하면 남은 블록들이 아래로 떨어지는 효과가 있습니다. 여기서 1번에서 리스트를 회전 시킨 이유가 나왔습니다. 회전을 시키지않는다면 블록들을 붙이기가 어려웠을 것입니다.
  5.  찾은 좌표들을 메인함수에 반환하여 answer에 더하고 찾은 좌표가 없을때까지 다시 반복합니다. 

 

def find_pop(m, n, board):
    find_set = set()
    for y in range(n-1):
        for x in range(m-1):
            if (board[y][x] == board[y][x+1] == 
                board[y+1][x] == board[y+1][x+1] != '_'):
                find_set |= set([(y,x),(y,x+1),(y+1,x),(y+1,x+1)]) # 2
    for y, x in find_set:
        board[y][x] = '0' # 3
    for y in range(n):
        board[y] = (['_' for i in range(board[y].count('0'))]
            + [z for z in board[y] if z != '0']) # 4
    return len(find_set) # 5
                
def solution(m, n, board):
    answer = 0
    
    b = list(map(list,zip(*board))) # 1
    while True:
        x = find_pop(m,n,b)
        if x == 0:
            return answer
        else:
            answer += x
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함