[프로그래머스/python] 프렌즈4블록

2022. 8. 15. 21:50알고리즘/프로그래머스

반응형

[프로그래머스/python] 프렌즈4블록

프렌즈4블록

2018 KAKAO BLIND RECRUITMENT

문제

 

프로그래머스

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

programmers.co.kr

풀이

  1. 블럭 터뜨리기
    • 모든 블럭을 돌아가면서 주변 3개의 블럭이 같은지 체크를 진행합니다.
    • 체크된 블럭의 경우 집합에 추가를 하고 모든 블럭을 다 돌면 집합의 블럭의 좌표를 'b' 로 만듭니다.
  2. 블럭 떨어뜨리기
    • 블럭의 세로 순환을 돌며 밑에서부터 체크를 합니다.
    • 블럭의 밑에서 부터 올라가면서 'b'를 만나게 된다면 그 위에 블럭과 교체를 진행합니다.
  3. 위 과정을 반복
    • 터뜨릴 좌표가 저장된 집합에 아무것도 없다면 마칩니다.

풀이코드


def solution(m, n, board):
    answer = 0
    lis = []
    dx =[1,1,0]
    dy =[1,0,1]
    for boar in board:
        tmp = list(boar)
        lis.append(tmp) 
    count = 0
    while(True):
        stack = set([])
        for x in range(m):# 터뜨릴 블록 찾기
            for y in range(n):
                check = lis[x][y]
                if check =='b':
                    continue
                if 0<=x+1<m and 0<=y+1<n:
                    check_count=0
                    for i in range(3):
                        X = x+dx[i]
                        Y = y+dy[i]
                        if lis[X][Y]==check:
                            check_count+=1
                        else:
                            break
                    if check_count == 3:
                        stack.add((x,y))
                        stack.add((x+1,y))
                        stack.add((x,y+1))
                        stack.add((x+1,y+1))
        if stack:# 터뜨릴 블록이 없다면 return
            count+=len(stack)
            pass
        else:
            break  
        for stac in list(stack): # 블록 터뜨리기
            x,y = stac[0],stac[1]
            lis[x][y] = 'b'

        for y in range(n):# 블록 떨어뜨리기
            tmp = []
            for x in range(m):
                if lis[x][y] =='b':
                    for i in range(x,0,-1):
                        lis[i][y] = lis[i-1][y]
                        lis[i-1][y] = 'b'
                else:
                    continue    
    return count

가장 인기 많은 코드


def solution(m, n, board):
    x = board
    x2 =[]

    for i in x: 
        x1 = []
        for i2 in i:
            x1.append(i2)
        x2.append(x1)

    point = 1
    while point != 0:
        list = []
        point = 0
        for i in range(m - 1):
            for j in range(n - 1):
                if x2[i][j] == x2[i][j + 1] == x2[i + 1][j] == x2[i + 1][j + 1] != '팡!':
                    list.append([i, j])
                    point += 1

        for i2 in list:
            i, j = i2[0], i2[1]
            x2[i][j], x2[i][j + 1], x2[i + 1][j], x2[i + 1][j + 1] = '팡!', '팡!', '팡!', '팡!'

        for i3 in range(m):
            for i in range(m - 1):
                for j in range(n):
                    if x2[i + 1][j] == '팡!':
                        x2[i + 1][j], x2[i][j] = x2[i][j], '팡!'

    cnt = 0
    for i in x2:
        cnt += i.count('팡!')
    return cnt

반응형