https://programmers.co.kr/learn/courses/30/lessons/60061
코딩테스트 연습 - 기둥과 보 설치
5 [[1,0,0,1],[1,1,1,1],[2,1,0,1],[2,2,1,1],[5,0,0,1],[5,1,0,1],[4,2,1,1],[3,2,1,1]] [[1,0,0],[1,1,1],[2,1,0],[2,2,1],[3,2,1],[4,2,1],[5,0,0],[5,1,0]] 5 [[0,0,0,1],[2,0,0,1],[4,0,0,1],[0,1,1,1],[1,1,1,1],[2,1,1,1],[3,1,1,1],[2,0,0,0],[1,1,1,0],[2,2,0,1]] [[
programmers.co.kr
각 작업을 기존의 구조물에 적용시키고, 건축물이 규칙을 만족하지 않는다면 작업을 취소하는 순서로 진행합니다.
* solution
- 작업이 수행될 때마다 기존에 존재하는 구조물에 적용시키고 유효성을 확인합니다
- 유효하지 않다면 작업을 취소합니다
- 문제 요구사항에 따라 x좌표, y좌표 순서대로 우선순위를 정하여 정렬합니다
* is_valid
- 기둥인 경우, 아래 4개의 조건 중 하나를 만족해야 합니다
1. 바닥인 경우
2. 보가 왼쪽에 존재하는 경우
3. 보가 현재 위치에 존재하는 경
4. 기둥이 아래에 존재하는 경우
- 보인 경우, 아래의 3개 조건을 만족해야 합니다
1. 기둥이 우측에 존재하는 경우
2. 기둥이 아래에 존재하는 경우
3. 양쪽에 보가 존재하는 경우
def is_valid(lst):
for l in lst:
x, y, a = l
# pillar
if a == 0:
# floor
if not y:
continue
# beam left
if (x - 1, y, 1) in lst:
continue
# beam here
if (x, y, 1) in lst:
continue
# pillar below
if (x, y - 1, 0) in lst:
continue
break
# beam
else:
# pillar right
if (x + 1, y - 1, 0) in lst:
continue
# pillar below
if (x, y - 1, 0) in lst:
continue
# between beam
if (x - 1, y, 1) in lst and (x + 1, y, 1) in lst:
continue
break
else:
return True
return False
def solution(n, build_frame):
answer = []
for build in build_frame:
x, y, a, b = build
if b:
# installation valid
answer.append((x, y, a))
if not is_valid(answer):
answer.remove((x, y, a))
else:
# demolition valid
answer.remove((x, y, a))
if not is_valid(answer):
answer.append((x, y, a))
answer.sort(key=lambda x: (x[0], x[1], x[2]))
return answer
'알고리즘' 카테고리의 다른 글
[BOJ] 18405번: 경쟁적 전염 (파이썬) (0) | 2022.04.16 |
---|---|
[BOJ] 18352번: 특정 거리의 도시 찾기 (파이썬) (0) | 2022.04.16 |
[BOJ] 3190번: 뱀 (파이썬) (0) | 2022.04.16 |
[프로그래머스] 문자열 압축 (파이썬) (0) | 2022.04.16 |