본문 바로가기
코딩/이코테-파이썬

구현: 기둥과 보 설치 (python)

by 철없는민물장어 2022. 8. 31.
728x90

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

 

프로그래머스

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

programmers.co.kr


기둥이 조건에 맞는지 확인하고 True,False로 리턴하는 함수 1개

보가 조건에 맞는지 확인하고 True,False로 리턴하는 함수 1개를 우선 만들었다

 

기둥 설치시 조건확인함수를 돌려 True일 때 설치했다

기둥 삭제시 기둥을 우선 삭제한 다음, 남은 기둥과 보에 대해 조건확인을 싹 다 돌려 하나라도 False를 반환하는 경우 기둥을 다시 추가하여 기둥삭제 명령을 무시하도록 했다

 

보 설치시 조건확인함수를 돌려 True일 때 설치했다

보 삭제시 해당 보를 우선 삭제한 다음, 남아있는 기둥과 보에 대해 조건확인을 싹 다 돌려 하나라도 False를 반환하는 경우 보를 다시 리스트에 추가하여 보 삭제 명령을 무시하도록 했다

 

build_frame=[[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]] #기둥/보 설치 작업 순서
#[x,y,a,b] x,y=설치 또는 삭제할 교차점의 좌표, a=0:기둥,1:보 , b=0:삭제,1:설치
#보는 오른쪽으로설치, 기둥은 위로 설치
#return 형식은 [x,y,a] 2차원리스트
def pillars(x,y,result): #기둥이 조건에 맞는지 확인하는 함수. x,y좌표, result리스트를 받아 True,False로 리턴
    if y==0 or ([x-1,y,1] in result) or ([x,y,1] in result) or ([x,y-1,0] in result): #바닥 위거나, 보의 한쪽 끝이거나, 다른 기둥 위
        return True
    else:
        return False

def beam(x,y,result): #보가 조건에 맞는지 확인하는 함수. x,y좌표, result 리스트를 받아 True,False로 리턴
    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): #한쪽 끝부분이 기둥 위에 있거나, 양쪽이 다른 보와 동시에 연결된 경우
        return True
    else:
        return False 

n=5
result=[]
for i in build_frame:
    x,y,a,b=i
    if a==0: #설치 또는 삭제 대상이 기둥인 경우
        if b==1: #설치하는 경우
            if pillars(x,y,result): #설치가능한 경우
                result.append([x,y,a])
                # print(x,y,a,"기둥 설치 완")
            # else:
            #      print(x,y,a,"기둥 설치 불가능")
        elif b==0: #삭제하는 경우
            result.remove([x,y,a]) #일단 빼고 난 후
            for i in result:
                x2,y2,a2=i
                if a2==0: #기둥인 경우
                    if pillars(x2,y2,result)==False:
                        #설치 불가능한 경우임
                        result.append([x,y,a])
                        break
                elif a2==1: #보인 경우
                    if beam(x2,y2,result)==False:
                        #설치 불가능한 경우임
                        result.append([x,y,a])
                        break
           

    elif a==1: #보의 경우
        if b==1: #설치하는 경우
            if beam(x,y,result): #설치가능한 경우
                result.append([x,y,a])
                # print(x,y,a,"보 설치 완")
            # else:
            #     print(x,y,a,"보 설치불가능")
        elif b==0: #삭제하는 경우
            result.remove([x,y,a]) #일단 삭제 한 후
            # print(x,y,a,"일단삭제해봄")
            for i in result:
                x2,y2,a2=i
                if a2==0:
                    if pillars(x2,y2,result)==False:
                        result.append([x,y,a])
                        # print(x,y,a,"보 삭제 불가능")
                        break
                elif a2==1:
                    if beam(x2,y2,result)==False:
                        result.append([x,y,a])
                        # print(x,y,a,"보 삭제 불가능")
                        break
            
        
result.sort()
print(result)

 

728x90

'코딩 > 이코테-파이썬' 카테고리의 다른 글

이코테 구현: 자물쇠와 열쇠  (0) 2022.08.29
이코테: 구현 - 자물쇠와 열쇠  (0) 2022.08.29
문자열 압축  (0) 2022.08.28
무지의 먹방라이브  (2) 2022.08.24
알고리즘 기출문제: 그리디2  (1) 2022.08.17

댓글