[プログラマー-ココア]柱と梁


質問する


質問リンク
支柱とビームを取り付け、取り外し、結果を返します.
柱.
  • の下は地ですか?
  • ステップの上に存在しますか?
  • の下に柱がありますか?
  • 3つの場合に表示および設定できます.
    に見える
  • の下に柱がありますか?
  • 両頭から新聞が届きましたか?
  • 2つの状況に応じて設定できます.

    解答中の質問


    フレーム数は最大1000であり,この場合,時間的複雑度はO(n^3)に達することができる.しかし問題は、よく観察すると問題があるかもしれないので、やってみなかったことです.そのため、削除され、影響を受ける可能性のあるすべての建物に近づくかどうかを決めたが、これは解決できないようだ.
    また、ビームの取り付けと取り外しの際、柱に接続されているビームを調べたところ、演算によって保証されている点を見逃したようです.
    # 문제
    # https://programmers.co.kr/learn/courses/30/lessons/60061
    
    # 현재 설치된 구조물이 '가능한' 구조물인지 확인하는 함수
    def possible(answer):
        for x, y, stuff in answer:
            if stuff == 0: # 설치된 것이 '기둥'인 경우
                # '바닥 위' 혹은 '보의 한쪽 끝부분 위'혹은 '다른 기둥 위'라면 정상
                if y == 0 or [x - 1, y, 1] in answer or [x, y, 1] in answer or [x, y - 1, 0] in answer:
                    continue
                return False # 아니라면 False
            elif stuff == 1: # 설치된 것이 '보'인 경우
                # '한쪽 끝부분이 기둥 위' 혹은 '양쪽 끝부분이 다른 보와 동시에 연결'이라면 정상
                if [x, y - 1, 0] in answer or [x + 1, y - 1, 0] in answer or([x - 1, y, 1] in answer and [x + 1, y, 1] in answer):
                    continue
                return False # 아니라면 False
        return True
    
    def solution(n, build_frame):
        answer = []
        for frame in build_frame: # 작업(frame)의 개수는 최대 1,000개
            x, y, stuff, operate = frame
            if operate == 0: # 삭제하는 경우
                answer.remove([x, y, stuff]) # 일단 삭제 연산을 진행
                if not possible(answer): # 가능한 구조물인지 확인
                    answer.append([x, y, stuff]) # 불가능하면 다시 넣어주기
    
            if operate == 1 : # 설치하는 경우
                answer.append([x, y, stuff]) # 일단 설치해본 다음에
                if not possible(answer): # 가능한 구조물인지 확인
                    answer.remove([x, y, stuff]) # 가능한 구조물이 아니라면 제거
        return sorted(answer) # 정렬된 결과를 반환
    このドキュメントは、「コードテストです.ロビンフッドです」と学習し、自分で整理したドキュメントです.