알고리즘 스터디 2021.07~

[프로그래머스] 2020 카카오 블라인드 - 기둥과 보 설치 파이썬

문제

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

 


풀이

설치조건은 직접 작성하고 삭제의 경우 해당 아이템을 삭제하고

해당 아이템 주변의 설치물 즉, 설치 조건이 깨질 수 있는 설치물의 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

전부체크하는게 먹힐줄은,,, 몰랐다.. 근데 이 편이 훨씬 간단하기는 함