본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[프로그래머스] 기둥과 보 설치 - Python

by chaemj97 2023. 4. 9.
728x90

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

 

프로그래머스

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

programmers.co.kr


'''
    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
반응형

댓글