난이도 : D4
문제번호 : 4613
문제 주소 및 출처입니다.
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
목차
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 |
댓글