문제
https://programmers.co.kr/learn/courses/30/lessons/60061
풀이
설치조건은 직접 작성하고 삭제의 경우 해당 아이템을 삭제하고
해당 아이템 주변의 설치물 즉, 설치 조건이 깨질 수 있는 설치물의 ispossible함수를 돌려 삭제가불가를 판단하려했다.
가능하긴 할텐데 조건문이 너무 많이 들어감
이게 맞는 풀이인지 의심가서 다른사람걸 찾아봤더니
그냥 설치와 삭제를 하고 그 상황이 가능한지를 모든 아이템에 대해서 확인해보는 방식으로들 풀었다.
def isPossible(result, item):
x, y, a = item
if a == 0: #기둥
if y == 0:
return True
for r in result:
if r == [x, y-1, 1] or r == [x, y-1 , 0]:
return True
else: #보
right, left = False
for r in result:
if r == [x, y-1, 0] or r == [x+1, y-1, 0]: #한쪽 끝이 기둥 위
return True
if r == [x-1, y, 1]: #왼쪽 보
left = True
if r == [x+1, y, 1]: #오른쪽 보
right = True
if right and left:
return True
def solution(n, build_frame):
answer = [[]]
print(grid)
for x, y, a, op in build_frame:
item = [x, y, a]
if op: #설치
if isPossible(answer, item):
answer += item
else:
answer.remove(item)
if isPossible(answer, []): #해당 아이템 삭제시 설치조건이 깨질만한 아이템들을 ispossible함수로 확인해보려함
answer -= item
return answer
그래서 원래 작성하던 코드는 접고 일반적인 방식으로 다시 풀었다.
def isPossible(result):
for r in result:
x, y, a = r
if a == 0: #기둥
if y == 0 or [x, y-1, 0] in result or [x-1, y, 1] in result or [x, y, 1] in result:
continue
return False
else: #보
if [x, y-1, 0] in result or [x+1, y-1, 0] in result or ([x-1, y, 1] in result and [x+1, y, 1] in result):
continue
return False
return True
def solution(n, build_frame):
answer = []
for x, y, a, op in build_frame:
item = [x, y, a]
if op == 1: #설치
answer.append(item)
if not isPossible(answer):
answer.remove(item)
else:
answer.remove(item)
if not isPossible(answer):
answer.append(item)
answer.sort()
return answer
전부체크하는게 먹힐줄은,,, 몰랐다.. 근데 이 편이 훨씬 간단하기는 함
'알고리즘 스터디 2021.07~' 카테고리의 다른 글
[프로그래머스] 2021 카카오 블라인드 - 광고 삽입 파이썬 (0) | 2021.11.13 |
---|---|
[프로그래머스] 2021 카카오 블라인드 - 합승 택시 요금 파이썬 (0) | 2021.11.01 |
[프로그래머스] 2020 카카오 블라인드 - 외벽 점검 (0) | 2021.09.12 |
[프로그래머스] 2019 카카오 블라인드 - 블록 게임 (0) | 2021.08.29 |
[프로그래머스] 2020 카카오 블라인드 - 괄호 변환 (0) | 2021.08.22 |