풀이
카카오 기출문제답게, 구현문제이다. 풀이해보면 알겠지만 로직이 어렵거나 한 부분은 없다. 심지어 예외처리도 문제에서 많이 해주고 있기 때문에 간단하다면 간단하다!!
나는 각각 보와 기둥일 때, 그리고 설치 / 삭제를 나누어 생각하여 총 4가지의 함수를 만들었다.
보 설치 / 삭제, 기둥 설치 / 삭제 함수를 만들고
해당하는 경우마다 함수를 호출하여 설치 / 삭제가 가능한지 판별하였다.
로직은 문제에 명시된 것을 코드로 옮기는 느낌이라 코드를 보면서 이해하는게 더 편할 것 같다.
코드
def solution(n, build_frame):
global pil_graph, bo_graph
answer = []
pil_graph = [[0] * (n + 1) for _ in range(n + 1)]
bo_graph = [[0] * (n + 1) for _ in range(n + 1)]
for i in range(len(build_frame)):
x, y, is_bo, is_install = build_frame[i]
if is_install:
if is_bo:
if bo_install(x, y):
bo_graph[x][y] = 1
answer.append([x, y, 1])
else:
if pil_install(x, y):
pil_graph[x][y] = 1
answer.append([x, y, 0])
else:
if is_bo:
if bo_remove(x, y):
answer.remove([x, y, 1])
else:
if pil_remove(x, y):
answer.remove([x, y, 0])
answer.sort(key=lambda x:(x[0], x[1], x[2]))
return answer
def bo_install(x, y):
if pil_graph[x][y - 1] == 1 or pil_graph[x + 1][y - 1]:
return True
if bo_graph[x - 1][y] == 1 and bo_graph[x + 1][y] == 1:
return True
return False
def pil_install(x, y):
if y == 0:
return True
if pil_graph[x][y - 1] == 1:
return True
if bo_graph[x][y] == 1:
return True
if bo_graph[x - 1][y] == 1:
return True
return False
def bo_remove(x, y):
bo_graph[x][y] = 0
answer = True
if bo_graph[x - 1][y] == 1:
if not bo_install(x - 1, y):
answer = False
if bo_graph[x + 1][y] == 1:
if not bo_install(x + 1, y):
answer = False
if pil_graph[x][y] == 1:
if not pil_install(x, y):
answer = False
if pil_graph[x + 1][y] == 1:
if not pil_install(x + 1, y):
answer = False
if not answer:
bo_graph[x][y] = 1
return answer
return answer
def pil_remove(x, y):
pil_graph[x][y] = 0
answer = True
if bo_graph[x][y + 1] == 1:
if not bo_install(x, y + 1):
answer = False
if bo_graph[x - 1][y + 1] == 1:
if not bo_install(x - 1, y + 1):
answer = False
if pil_graph[x][y + 1] == 1:
if not pil_install(x, y + 1):
answer = False
if not answer:
pil_graph[x][y] = 1
return answer
return answer
'프로그래머가 되자!!!! > 알고리즘 공부!' 카테고리의 다른 글
[BOJ]11728. 배열합치기 (python) (0) | 2021.10.12 |
---|---|
[BOJ] 9935. 문자열폭발 (python) (0) | 2021.10.08 |
[BOJ] 16234. 인구이동 (python) (0) | 2021.10.05 |
[BOJ] 10851. 숫자카드 (python) (0) | 2021.10.02 |
[BOJ] 1269. 대칭차집합 (python) (0) | 2021.09.27 |