For Programmer

SWEA 4613 파이썬 문제풀이(러시아 국기 같은 깃발) 본문

코팅테스트/백준 문제 모음

SWEA 4613 파이썬 문제풀이(러시아 국기 같은 깃발)

유지광이 2022. 2. 11. 20:21
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWQl9TIK8qoDFAXj 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


이 문제 처음에 어떻게 접근해야 할지 몰라서 계속 고민하다 결국 답을 봤다. 답은 단순히 완전탐색으로 모든 경우를 조사하는 거였다. 반복문 안의 반복문안의 반복문.... 힌트를 보아도 구현을 할 줄 몰랐는데 답을 보니 이해가 되었다. 이 문제덕분에 반복문 내 반복문 방식의 접근 방법에 대해서 더 학습할 수 있었다.

 

T = int(input())

for order in range(1, T + 1):
    N, M = map(int, input().split())
    russia = [list(map(str, input())) for _ in range(N)]
    result = N * M  # 바꿔야되는 횟수 저장(초기값을 최대값으로 저장)
    one_count = 0  # W로 만들기위해 칠해야 하는 개수
    for w in range(0, N - 2):  # 맨마지막 B,R을 칠해야하는 2개의 행 전까지 반복문을 돈다.
        for k1 in range(0, M):  # 가로로 M까지돈다.
            if russia[w][k1] != 'W':  # 만약 W가 아니라면
                one_count += 1  # 지워야 되는 횟수 +1
        two_count = 0  # B로 만들기위해 칠해야 하는 개수
        if result <= one_count:  # 만약 저장되어있는 횟수보다 이미 크다면
            break  # 탈출
        for b in range(1 + w, N - 1):  # 위에서 칠한 행(W) 그 다음부터 마지막R을 칠해야하는 행을 제외한 행까지 돈다.
            for k2 in range(0, M):  # 가로로 M까지 돈다.
                if russia[b][k2] != 'B':  # 만약 B가 아니라면
                    two_count += 1  # 칠해야하는 횟수 +1
            if result <= one_count + two_count:  # 만약 이미 두개의 합이 저장되어있는 값보다 크거나 같다면
                break  # 탈출
            three_count = 0  # R로 만들기위해 칠해야 하는 개수
            for r in range(1 + b, N):  # 위에서 칠한 행(B) 그 다음부터 마지막 행까지 돈다.
                for k3 in range(0, M):  # 가로로 M까지 돈다.
                    if russia[r][k3] != 'R':  # 만약 R이 아니라면
                        three_count += 1  # 횟수 +1
            if result > (one_count + two_count + three_count):  # 다 돌고나서 만약 셋의 합이 저장되어있는 횟수보다 작다면
                result = (one_count + two_count + three_count)  # 그 값을 최솟값으로 변경

    print(f'#{order} {result}')

 

728x90
Comments