상세 컨텐츠

본문 제목

[프로그래머스Lv.3] 기둥과 보 설치(파이썬)

알고리즘 공부

by Tabris4547 2023. 3. 1. 14:35

본문

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/60061

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

초기 문제접근

 

1. 설치,삭제할 때마다, 해당 지점이 조건을 만족하는지 본다

2. 조건 구현해서 프로그래밍하자

 

 

막힌 이유

 

1. 조건을 잘못 잡은 거 같다

2. 추가,삭제 조건을 수행하면서 누락된 케이스가 존재했다.

 

개선한 풀이

 

1. 추가,삭제 후, 해당 board가 가능한지 반복한다

 

개선된 풀이로 진행할 경우, 코드가 더 깔끔해집니다.

현재 추가한 보드의 상태를 쭉 보면서

설치,삭제가 가능한지 보고

안된다면 되돌리기를 해주는 방식입니다.

 

(초기 방식대로 설치,삭제할때마다 조건을 고려했는데

따로따로 구현하려니 코드가 복잡해져서

결국 이 방법을 택했습니다.)

def possible(result):
    for x, y, a in result:
        # 기둥을 판별
        # 기둥이 안되는 경우
        if a == 0:
            if y != 0 and (x, y - 1, 0) not in result and \
                    (x - 1, y, 1) not in result and (x, y, 1) not in result:
                return False
        # 보를 판별
        # 보가 안되는 경우
        else:
            if (x, y - 1, 0) not in result and (x + 1, y - 1, 0) not in result and \
                    not ((x - 1, y, 1) in result and (x + 1, y, 1) in result):
                return False

    return True


def solution(n, build_frame):
    answer = []

    # 하나씩 넣고 가능한지 안한지 계속 판별해준다
    for x, y, a, b in build_frame:

        now = (x, y, a)
        # 설치
        if b == 1:
            answer.append(now)
            if not possible(answer):
                ind = answer.index(now)
                answer.pop(ind)

        # 삭제
        else:
            if not now in answer:
                continue
            ind = answer.index(now)
            answer.pop(ind)
            if not possible(answer):
                answer.append(now)

    #     board=[[[0,0]for _ in range(n+1)]for _ in range(n+1)]

    #     for y,x,a,b in build_frame:

    #         #설치하는 케이스
    #         if b==1:
    #             if a==0:
    #                 #바닥위, 보의 한쪽끝위, 다른 기둥 위
    #                 if x==0 or board[x][y][1]==1 or board[x][y][0]==1:
    #                     board[x][y][0]=1
    #                     board[x+1][y][0]=1
    #                     answer.append([y,x,a])

    #             elif a==1:
    #                 #왼쪽기준, 기둥위나 보의 연장
    #                 if board[x][y][0]==1 or board[x][y][1]==1:

    #                     board[x][y][1]=1
    #                     board[x][y+1][1]=1
    #                     answer.append([y,x,a])
    #                 #오른쪽기준, 기둥위나 보의 연장
    #                 elif y<n and (board[x][y+1][1]==1 or board[x][y+1][0]==1):
    #                     board[x][y][1]=1
    #                     board[x][y+1][1]=1
    #                     answer.append([y,x,a])

    #         #삭제하는 케이스
    #         if b==0:
    #             if not [y,x,a] in answer:
    #                 continue
    #             #보나 기둥을 삭제할 때, 다른 보와 기둥이 존재할 수 없다면 넘김
    #             if a==0:
    #                 #지우는 기둥위에 다른 기둥이 있거나 보가 있는가
    #                 #다른 기둥이 있는가
    #                 if x>=n-1:
    #                     continue
    #                 if board[x+2][y][0]==1:
    #                     continue
    #                 #기둥위에 보가 있을때, 그 보가 기둥이 2개밖에 없으면 못지움
    #                 elif (y>0 and y<=n) and(not (board[x+1][y][1] and board[x+1][y-1][1]) and (board[x+1][y][1] and board[x+1][y+1][1])):

    #                     continue      
    #                 board[x][y][0]=0
    #                 board[x+1][y][0]=0

    #                 ind=answer.index([y,x,a])
    #                 answer.pop(ind)
    #             elif a==1:
    #                 #지우는 보 기준, 다른 보와 이어져있는가 혹은 그 위에 다른 기둥이 있는가
    #                 if (y>0 and board[x][y-1][1]) or (y<n and board[x][y+1][1]) or board[x][y][0] or board[x][y+1][0]:
    #                     continue
    #                 board[x][y][1]=0
    #                 board[x][y+1][1]=0
    #                 ind=answer.index([y,x,a])
    #                 answer.pop(ind)
    #     answer.sort()

    answer.sort()
    return answer

 

728x90

관련글 더보기

댓글 영역