소스 코드

def find(idx, color, temp_sum):
    global res

    # 탈출조건1
    # 현재까지의 합이 res보다 크면 더 확인할 필요 없음
    if temp_sum > res:
        return

    # 탈출조건2
    # idx의 값이 n-1일 때, 현재까지의 합과 res의 값을 비교
    # res보다 작으면 교체
    if idx == n-1:
        if temp_sum < res:
            res = temp_sum
        return

    # 흰색과 빨간색으로만 이루어진 국기를 방지하기위해
    # n-2를 기준으로 나눠서 확인
    # n-2 전까지는 관계없음
    if idx < n-2:
        for w in range(color,3):
            find(idx+1, w, temp_sum+cnt_board[idx][w])

    # n-2일 때에는
    # 파란색을 칠했는지 칠하지 않았는지를 기준으로 나눠서 확인
    # 칠하지 않았다면 파란색을 칠해준다
    else:
        if color >= 1:
            for w in range(color, 3):
                find(idx + 1, w, temp_sum + cnt_board[idx][w])

        else:
            find(idx+1, 1, temp_sum + cnt_board[idx][1])

    return


T = int(input())

for tc in range(1,1+T):

    # n줄 m개의 문자
    n,m = map(int,input().split())

    # 초기 국기의 색들
    board = [list(input()) for _ in range(n)]

    # 흰, 파, 빨 순서로 몇 개씩 필요한지 저장
    cnt_board = [[0 for _ in range(3)] for _ in range(n)]

    for q in range(n):
        # 흰
        cnt_board[q][0] = m-board[q].count('W')
        # 파
        cnt_board[q][1] = m-board[q].count('B')
        # 빨
        cnt_board[q][2] = m-board[q].count('R')

    # 결과 값
    res = 99999999

    # idx(현재위치), color(현재 색), 현재까지의 합(첫 줄과 마지막 줄의 합, 흰,빨로 고정)
    find(1,0,cnt_board[0][0] + cnt_board[-1][2])

    print('#{} {}'.format(tc,res))

 


해결 방법

1. 첫 번째 줄의 색과 마지막 줄의 색은 각각 흰, 빨로 고정됨

 

2. 고정 후 색을 칠할 때 고민해야할 조건은

1) 색을 칠할 때 '흰-> 파-> 빨' 의 순서를 지켜야 한다는 점

2) 파란색을 반드시 한 줄 이상 가져야 한다는 점

 

이 두 가지 조건을 지키면서 문제 해결


느낀 점

 

 

ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.