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
'IT관련정보 > 카카오 코딩테스트 1차(2017년)' 카테고리의 다른 글
7. 추석 트래픽(난이도: 상) - Python3.6.1 (0) | 2018.10.06 |
---|---|
5. 뉴스 클러스터링(난이도: 중) - Python3.6.1 (0) | 2018.10.06 |
4. 셔틀버스(난이도: 중) - Python3.6.1 (0) | 2018.10.06 |
3. 캐시(난이도: 하) - Python3.6.1 (0) | 2018.10.06 |
2. 다트 게임(난이도: 하) - Python3.6.1 (0) | 2018.09.29 |