JLOG

[Python] 코드업 #2605 : 캔디팡 풀이 본문

Algorithm/알고리즘 풀이

[Python] 코드업 #2605 : 캔디팡 풀이

정정선선 2020. 5. 19. 14:42
# import parameter
size    = 7       # candy 판의 사이즈
pop     = 0       # candy pop한 개수
pop_check = False # candy Pop이 되었는지 check
candies = []

# 7줄 candy 판 입력 받음
for i in range(size): #{
    candy_line = input().split(" ")
    candies.append(candy_line)
#}

# 이번 블록이 색깔, 조건이 맞는지 확인
def check_color(w, h, color, history) : #{
    if w < 0 or h < 0 or w >= size or h >= size : #{
        return -1
    #}
    for his in history : 
      if his[0] == w and his[1] == h : 
        return -1

    if candies[w][h] == color : #{
        return 1    
    #}
    else : return -1
#}

# 재귀함수를 이용해서 기준 블록부터 탐색해 확인해준다.
def check_same_color(w, h, history, num) : #{
    global candies, pop, pop_check

	# 현재 블록 컬러색깔
    color = candies[w][h]
    
    # 컬러가 0 이면 이미 check 된 것
    if color == '0' : return 0

	# pop 조건에 맞으면 0으로 바꿔주기 위해서
    # 탐색 했던 루트를 돌아가지 않기 위해 좌표를 저장해준다.
    history.append([w,h])

	# check_color로 현재 블록이 pop 조건에 맞는지 확인해준다.
    result = [check_color(w - 1, h, color, history[:-1]), check_color(w + 1, h,  color, history[:-1]), check_color(w, h - 1, color, history[:-1]), check_color(w, h + 1, color, history[:-1])]

	# 조건이 맞다면, 해당 블록으로 이동해 다시 탐색한다.
    if result[0] == 1 : check_same_color(w - 1, h, history, num+1) # up
    if result[1] == 1 : check_same_color(w + 1, h, history, num+1) # down
    if result[2] == 1 : check_same_color(w, h - 1, history, num+1) # left
    if result[3] == 1 : check_same_color(w, h + 1, history, num+1) # right
    

	# 모든 블록이 조건에 맞지 않다면 candy pop의 조건을 충족했는지 확인한다.
    elif result == [-1, -1, -1, -1] : #{
        if num >= 2 : #{
            pop_check = True # 조건을 충족했으면 pop_check = True로 변경한다.
            
            # pop을 체크한 것을 확인하기 위해 색깔을 0으로 변경해준다.
            for his in history : #{ 
                candies[his[0]][his[1]] = '0'
        #}
    #}
#}


#----------------------------------------------------------------------
# MAIN
#----------------------------------------------------------------------
# 모든 판을 돌면서 candy pop이 되는지 확인한다.
for w in range(size) : #{
    for h in range(size) : #{
        pop_check = False
        check_same_color(w, h, [], 0)
        if pop_check == True : pop += 1 
            
    #}
#}

print(pop)

 

이해가 안된다는 말이 있어서 추가 설명을 작성해본다.

헷갈리는 부분 있으면 댓글 주세요

Comments