[BaekJoon] 15683번 : κ°μ‹œ

Updated:

15683번 : κ°μ‹œ


λ„ˆλ¬΄λ‚˜ λ‹Ήμ—°ν•˜κ²Œ κ°μ‹œ λ²”μœ„κ°€ 넓은 CCTV 순으둜 κ°μ‹œν•  수 μžˆλŠ” μ΅œλŒ€ λ²”μœ„λ₯Ό κ°μ‹œν•΄κ°€λ©° 계산을 ν–ˆλŠ”λ° λ°”λ‘œ ν‹€λ Έλ‹€.

무쑰건 μ΅œλŒ€ λ²”μœ„λ₯Ό κ°μ‹œν•˜λŠ” 게 μ˜³μ€ 방법이 μ•„λ‹ˆμ—ˆλ˜ 것이닀.

κ²°κ΅­ CCTVκ°€ κ°μ‹œν•  수 μžˆλŠ” λͺ¨λ“  경우λ₯Ό λ”°μ Έ 그쀑 μ‚¬κ°μ§€λŒ€κ°€ μ΅œμ†ŒμΌ λ•Œλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.

λ§Œμ•½ 1번, 2번 CCTVκ°€ 각각 ν•œ λŒ€μ”© μžˆμ—ˆλ‹€κ³  ν•˜λ©΄ 총 8 κ°€μ§€μ˜ κ²½μš°κ°€ λ‚˜μ˜¨λ‹€.

1번이 μœ„μͺ½μ„ κ°μ‹œν•˜λ©° 2번이 쒌 우, 상 ν•˜ 인 경우

1번이 였λ₯Έμͺ½μ„ κ°μ‹œν•˜λ©° 2번이 쒌 우, 상 ν•˜ 인 경우

1번이 μ•„λž˜μͺ½μ„ κ°μ‹œν•˜λ©° 2번이 쒌 우, 상 ν•˜ 인 경우

1번이 μ™Όμͺ½μ„ κ°μ‹œν•˜λ©° 2번이 쒌 우, 상 ν•˜ 인 경우

그런데.. 풀이 방법은 μ•Œμ•˜λŠ”λ° 이걸 μ½”λ“œλ‘œ λ°”κΎΈμžλ‹ˆ λ„μ €νžˆ λͺ¨λ₯΄κ² μ–΄μ„œ λ‹€λ₯Έ μ‚¬λžŒμ˜ μ½”λ“œλ₯Ό μ°Έκ³ ν–ˆλ‹€

https://qrlagusdn.tistory.com/150

λ‚΄κ°€ μƒκ°ν–ˆλ˜ 풀이 방법을 μ½”λ“œλ‘œ λ³΄λ‹ˆ 배울 점이 정말 많이 μžˆμ—ˆλ‹€.

특히 CCTVκ°€ λ°”λΌλ³΄λŠ” λͺ¨λ“  경우λ₯Ό μž¬κ·€λ‘œ ν•΄κ²°ν•œ 뢀뢄이 인상 κΉŠμ—ˆλ‹€.

μ²˜μŒμ—” 이해가 μ•ˆκ°€ 디버깅을 μ—„μ²­ ν–ˆλ‹€..

배운 게 많이 μžˆλŠ” λ¬Έμ œμ˜€λ‹€ μ‹œκ°„μ΄ μ§€λ‚˜κ³  λ‹€μ‹œ κΌ­ ν’€μ–΄μ•Ό ν•  문제 1μˆœμœ„μ΄λ‹€.


import copy
from collections import Counter

#  상, ν•˜, 쒌, 우
dir_i = [-1, 1, 0, 0]
dir_j = [0, 0, -1, 1]
detection_dir = [0, [[0], [1], [2], [3]], [[0, 1], [2, 3]], [[1, 2], [1, 3], [0, 2], [0, 3]],
	  [[0, 1, 2], [0, 1, 3], [0, 2, 3], [1, 2, 3]], [[0, 1, 2, 3]]]

MIN = float("INF")


def solution(cctv_idx, office, cctv_list):
	global MIN

	if cctv_idx == len(cctv_list):
		detection_area = Counter(sum(office, []))[0]
		MIN = min(MIN, detection_area)
		return

	cctv_num, cctv_i, cctv_j = cctv_list[cctv_idx]
	for cctv_dir in detection_dir[cctv_num]:
		tmp_office = copy.deepcopy(office)
		for i in cctv_dir:
			visit_i = cctv_i + dir_i[i]
			visit_j = cctv_j + dir_j[i]
			while 0 <= visit_i < n and 0 <= visit_j < m:
				if tmp_office[visit_i][visit_j] == 6:
					break
				elif tmp_office[visit_i][visit_j] == 0:
					tmp_office[visit_i][visit_j] = 9
				visit_i += dir_i[i]
				visit_j += dir_j[i]
		solution(cctv_idx + 1, tmp_office, cctv_list)


if __name__ == "__main__":
	n, m = map(int, input().rsplit())
	office = [list(map(int, input().rsplit())) for _ in range(n)]
	cctv_list = []
	for i in range(n):
		for j in range(m):
			if office[i][j] not in [0, 6]:
				cctv_list.append([office[i][j], i, j])

	solution(0, office, cctv_list)
	print(MIN)



Categories:

Updated:

Leave a comment