난이도 : D4
문제번호 : 4613
문제 주소 및 출처입니다.
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
1. 문제 설명
2016년은 삼성전자가 러시아 현지법인을 설립한지 20주년이 된 해이다. 이를 기념해서 당신은 러시아 국기를 만들기로 했다.
이렇게 러시아 국기 같은 깃발을 만들기 위해서 새로 칠해야 하는 칸의 개수의 최솟값을 구하여라. 첫 번째 예제이다. 왼쪽에 있는 그림이 입력이다. 중간에 있는 그림에 X가 적힌 칸들을 새롭게 색칠하여 오른쪽에 있는 그림과 같은 깃발을 만들면 최적이다. |
입력
첫 번째 줄에 테스트 케이스의 수 T가 주어진다. |
출력
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 러시아 국기 같은 깃발을 만들기 위해서 새로 칠해야 하는 칸의 개수의 최솟값을 구하여 T 줄에 걸쳐서 출력한다. |
예시
입력 | 출력 |
2 4 5 WRWRW BWRWB WRWRW RWBWR 6 14 WWWWWWWWWWWWWW WWRRWWBBBBBBWW WRRRWWWBWWWWRB WWBWBWWWBWRRRR WBWBBWWWBBWRRW WWWWWWWWWWWWWW |
#1 11 #2 44 |
2. 문제풀이
dfs를 이용하여 모든 경우의 수를 탐색하였다. |
3. 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#D4 4613 러시아 국기 같은 깃발
targets = ['W', 'B', 'R']
def dfs(idx, color, _sum):
global result
#가치지기
if result <= _sum : return
#결과 더하기
if idx >= N-1:
result = _sum
return
#다음색상까지, 넘어온게 흰색이라면 흰색, 파랑만
#인덱스때문에 최댓값은 3으로 설정
for i in range(color, min(3, color+2)):
temp = 0
#마지막줄까지 왔는데 컬러가 흰색이라면 다음으로 넘어가기
if idx >= N-2 and i == 0: continue
for j in Flag[idx]:
#색상이 다른것들 카운트
if j != targets[i]: temp += 1
dfs(idx+1, i, _sum + temp)
#제일 윗줄과 아랫줄 체크하기
def init():
global result
for i in Flag[0]:
if i != 'W': result += 1
for i in Flag[N-1]:
if i != 'R': result += 1
for t in range(1, int(input()) + 1):
#입력받기
N, M = map(int, input().split())
Flag = [list(input()) for _ in range(N)]
#최종 결과값
result = 987654
#갯수 체크하기
dfs(1, 0, 0)
#제일 위와 아래줄 체크하기
init()
print('#{} {}'.format(t, result))
|
'코딩테스트 > SWExpertAcademy' 카테고리의 다른 글
최소 신장 트리 Python(SW Expert Academy, SWEA) (0) | 2020.06.21 |
---|---|
연산 Python(SW Expert Academy, SWEA) (0) | 2020.06.20 |
자기방으로 돌아가기 Python(SW Expert Academy, SWEA) (0) | 2020.06.18 |
가능한 시험 점수 Python(SW Expert Academy, SWEA) (0) | 2020.06.17 |
최솟값으로 이동하기 Python(SW Expert Academy, SWEA) (0) | 2020.06.16 |
댓글