본문 바로가기

IT관련정보/카카오 코딩테스트 1차(2017년)

6. 프렌즈4블록(난이도: 상) - Python3.6.1

 

 

1.풀이방법


4개의 블록을 찾아서 제거하면 된다. 하지만 바로 제거하면 다음블록에서 4개의 블록이 안지워질수도 있으므로(라이언 A블록 6개 참조) 모든블럭을 스캔후에 지워야한다.

순서로 보면

1.지워야 할 블록 스캔

2.지울 블록이 없을경우 지운블록갯수 반환, 지울 블록이 있을경우 다음으로 이동

3.블록삭제하면서 삭제할때마다 카운트 증가

4.블록재정렬

5.이후 계속 반복

라고 보면된다.


2.코드


def Question6(m,n,board):

    arr = [[board[m][n] for n in range(n)] for m in range(m)] #1

    count = 0 #2


    while True: #3

        removeList = set('') #4

        

        for height in range(m-1): #5

            for width in range(n-1):

                if arr[height][width] == arr[height][width+1] == arr[height+1][width] == arr[height+1][width+1] != '':

                    removeList.add(str(height)+'/'+str(width))

                    removeList.add(str(height)+'/'+str(width+1))

                    removeList.add(str(height+1)+'/'+str(width))

                    removeList.add(str(height+1)+'/'+str(width+1))


        if len(removeList) == 0: #6

            return count


        for removeCount in removeList: #7

            splitData = removeCount.split('/')

            height = int(splitData[0])

            width = int(splitData[1])

            arr[height][width] = ''

            count += 1


        for width in range(n-1): #8

            for height in range(m-1):

                if arr[height+1][width] == '':

                    arr[height][width],arr[height+1][width] = arr[height+1][width],arr[height][width]


3.코드설명


#1 입력된 배치를 2차원 배열로 만든다. 

#2 지운블럭갯수 변수(count) 초기화

#3 무한 반복으로 돌린다.

#4 지울블럭위치 다중집합(중복허용x)로 초기화

#5 지울 블록을 스캔한다. 좌표 저장

#6 지울 블록이 없을경우 지워진 블록갯수를 반환한다.

#7 좌표가 저장된 블럭을 제거하면서 제거카운트를 증가시킨다.

#8 블록을 재정렬해준다.


4.결과


>>> Question6(4,5,['CCBDE', 'AAADE', 'AAABF', 'CCBBF'])

14

>>> Question6(6,6,['TTTANT', 'RRFACC', 'RRRFCC', 'TRRRAA', 'TTMMMF', 'TMMTTJ'])

15