728x90
https://school.programmers.co.kr/learn/courses/30/lessons/60061
'''
Chapter 12. 기둥과 보 설치
build_frame의 경우 4가지 (기둥 설치, 보 설치, 기둥 삭제, 보 삭제)
접근법 1
기둥 - 설치, 삭제
보 - 설치, 삭제
나누어 진행
설치 : 설치 조건을 확인 후 True면 설치
삭제 : 삭제 후 연결된 기둥과 보를 확인 후 문제가 생기면 되돌리기
'''
def solution(n, build_frame):
bow = [[0 for _ in range(n+1)] for _ in range(n)]
gidung = [[0 for _ in range(n)] for _ in range(n+1)]
def check_gidung(x, y):
# 바닥 위 or 보의 한쪽 끝 or 또 다른 기둥 위
return y == 0 or gidung[x][y-1] or (x < n and bow[x][y]) or (x > 0 and bow[x-1][y])
def check_bow(x, y):
# 한쪽 끝이 기둥 위 or 양쪽 끝이 보와 연결
return gidung[x][y-1] or gidung[x+1][y-1] or (1 <= x < n-1 and bow[x-1][y] and bow[x+1][y])
for x, y, a, b in build_frame:
# 기둥
if a == 0:
# 기둥 설치
if b == 1:
# 설치 가능 조건인가
if check_gidung(x, y):
gidung[x][y] = 1
# 기둥 삭제
else:
# 일단 삭제
gidung[x][y] = 0
# 기둥 삭제 후 문제가 생기면 되돌리기
# 연결된 기둥 확인
# 윗기둥만
if y < n-1 and gidung[x][y+1] and not check_gidung(x, y+1):
gidung[x][y] = 1
# 연결된 보 확인
# 위로 연결된 보만
elif x < n and bow[x][y+1] and not check_bow(x, y+1):
gidung[x][y] = 1
elif x-1>=0 and bow[x-1][y+1] and not check_bow(x-1, y+1):
gidung[x][y] = 1
# 보
else:
# 보 설치
if b == 1:
# 보 설치 가능 조건인가?
if check_bow(x, y):
bow[x][y] = 1
# 보 삭제
else:
# 일단 삭제
bow[x][y] = 0
# 보 삭제 후 문제가 생기면 되돌리기
# 연결된 보 확인
if x > 0 and bow[x-1][y] and not check_bow(x-1, y):
bow[x][y] = 1
elif x + 1 < n and bow[x+1][y] and not check_bow(x+1, y):
bow[x][y] = 1
# 연결된 기둥 확인
elif y < n and gidung[x][y] and not check_gidung(x, y):
bow[x][y] = 1
elif y < n and gidung[x+1][y] and not check_gidung(x+1, y):
bow[x][y] = 1
# 설치된 기둥, 보 찾기
answer = []
for x in range(n+1):
for y in range(n+1):
if y < n and gidung[x][y]:
answer.append([x, y, 0])
if x < n and bow[x][y]:
answer.append([x, y, 1])
return answer
'''
테스트 1 〉 통과 (0.05ms, 10.2MB)
테스트 2 〉 통과 (0.05ms, 10.1MB)
테스트 3 〉 통과 (0.05ms, 10.4MB)
테스트 4 〉 통과 (0.05ms, 10.3MB)
테스트 5 〉 통과 (0.05ms, 10.4MB)
테스트 6 〉 통과 (0.04ms, 10.2MB)
테스트 7 〉 통과 (0.03ms, 10.1MB)
테스트 8 〉 통과 (0.03ms, 10.3MB)
테스트 9 〉 통과 (0.09ms, 10.1MB)
테스트 10 〉 통과 (0.78ms, 10.4MB)
테스트 11 〉 통과 (0.93ms, 10.5MB)
테스트 12 〉 통과 (3.76ms, 10.4MB)
테스트 13 〉 통과 (2.33ms, 10.5MB)
테스트 14 〉 통과 (0.94ms, 10.2MB)
테스트 15 〉 통과 (0.98ms, 10.7MB)
테스트 16 〉 통과 (2.14ms, 10.2MB)
테스트 17 〉 통과 (2.38ms, 10.6MB)
테스트 18 〉 통과 (2.38ms, 10.4MB)
테스트 19 〉 통과 (2.39ms, 10.6MB)
테스트 20 〉 통과 (2.61ms, 10.4MB)
테스트 21 〉 통과 (2.65ms, 10.5MB)
테스트 22 〉 통과 (2.36ms, 10.6MB)
테스트 23 〉 통과 (2.29ms, 10.6MB)
'''
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
[알고리즘] CCW (선분 교차 판별) (0) | 2023.05.03 |
---|---|
[프로그래머스] 외벽 점검 - Python (0) | 2023.04.09 |
이것이 취업을 위한 코딩 테스트다 CHAPTER 16 다이나믹 프로그래밍 문제 (0) | 2023.04.09 |
이것이 취업을 위한 코딩 테스트다 CHAPTER 14 정렬 문제 (0) | 2023.04.09 |
이것이 취업을 위한 코딩 테스트다 CHAPTER 13 DFS/BFS 문제 (1) | 2023.04.09 |
댓글