-
[백준] 15683 - 감시Algorithm 문제 2019. 7. 22. 21:10
https://www.acmicpc.net/problem/15683
백준 문제집 중 '삼성 sw 역량 테스트 기출문제'에 포함된 문제
해당 문제집은 거의 대부분 Brute-Force 문제인 듯.
재귀를 이용하여 모든 경우를 계산하였다.
pypy2로 컴파일 했음에도 제한시간이 아슬아슬했다. 더 좋은 방법이 있을 듯
<Python 코드>
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354import sysimport copylines = sys.stdin.readlines()n, m = tuple(map(int, lines[0].split()))room = [list(map(int, line.split())) for line in lines[1:]]cctv_list = []dy, dx = [-1, 0, 1, 0], [0, 1, 0, -1] # 상, 우, 하, 좌def recu(depth, sight_list):if depth == len(cctv_list):tmp_room = copy.deepcopy(room)for sight in sight_list:d, y, x = sightwhile(True):if y < 0 or y >= n or x < 0 or x >= m or room[y][x] == 6:breaktmp_room[y][x] = '#'y, x = y + dy[d], x + dx[d]re = 0for l in tmp_room:for p in l:if p == 0:re += 1return recctv = cctv_list[depth]case = []if cctv[0] == 1:for d in range(4):case.append([(d, cctv[1], cctv[2])])elif cctv[0] == 2:for d in range(2):case.append([(d, cctv[1], cctv[2]), (d+2, cctv[1], cctv[2])])elif cctv[0] == 3:for d in range(4):case.append([(d, cctv[1], cctv[2]), ((d+1)%4, cctv[1], cctv[2])])elif cctv[0] == 4:for d in range(4):case.append([(d, cctv[1], cctv[2]), ((d+1)%4, cctv[1], cctv[2]), ((d+2)%4, cctv[1], cctv[2])])elif cctv[0] == 5:case.append([(0, cctv[1], cctv[2]), (1, cctv[1], cctv[2]), (2, cctv[1], cctv[2]), (3, cctv[1], cctv[2])])re = 100for c in case:re = min(re, recu(depth+1, sight_list + c))return refor i in range(n):for j in range(m):if 1<=room[i][j]<=5:cctv_list.append((room[i][j], i, j))sys.stdout.write(str(recu(0, [])))cs 'Algorithm 문제' 카테고리의 다른 글
[백준] 17143 - 낚시왕 (0) 2019.07.25 [백준] 16234 - 인구 이동 (0) 2019.07.23 [백준] 14889 - 스타트와 링크 (0) 2019.07.17 [백준] 14500 - 테트로미노 (0) 2019.07.15 [백준] 13460 - 구슬 탈출 2 (0) 2019.07.13