[パートナー]実装、柱と梁の設定



Q12. ビーム取り付け


🐣質問する


ジョルディは、柱と梁を使って壁面構造を自動的に構築するロボットをシミュレートするプログラムを作成したいと思っています.
このプログラムでは、2 D仮想壁面に柱と梁を使用して、柱とビューの長さが1のセグメントとして表されるフレーム構造をインストールできます.次のルールがあります.
  • 柱は、底部、梁の一端、または他の柱に配置する必要があります.
  • 梁の一端は柱に位置するか、両端は他の梁と同時に接続しなければならない.
  • 段、底部は壁面の底部の地面を指す.
  • 二次元壁面はn x nサイズの正射メッシュであり、各メッシュサイズは1 x 1である.
  • の最初の壁面は空です.
  • 柱と梁は、グリッドの交点にまたがることなく、グリッドの各エッジに取り付けることができます.
    2 D配列build frameにパラメータが付与されている場合、壁面サイズn、柱、梁をインストールまたは削除する操作を含み、すべてのコマンドを実行した後に構造の状態に戻ります.
    プログラマリンク|https://programmers.co.kr/learn/courses/30/lessons/60061
  • 🐥に答える


    作業する構造物をリストに保存し、条件に従って最終リストを並べ替えて出力すればよい.柱や梁を取り付けたり削除したりする操作を1つずつ取り出し、追加やイジェクトの有無を判断します.
    構造が機能するかどうかを判断するために、個別の関数を定義します.
    :柱であれば、柱作業のすべての条件を満たさなければ失敗し、一つ満たされれば本物に戻ります.もしあなたが見たら、もしあなたがすべての保証仕事が成立した条件を満たさなければ、あなたは失敗して、1つを満たすだけで、あなたは本当に戻ります.
    ビルドフレームから構造物操作情報を1つずつ抽出し,各操作の可能性を判断し,操作情報リストを更新する.
    :インストール後、情報を追加し、操作性を確認します.仕事ができなければ、popを減らします.逆に、削除すると、メッセージがポップアップされ、操作性がチェックされます.仕事ができない場合は、追加して再追加します.

    🐓コード#コード#

    def checking(result):
        for build in result:
            x, y, a = build # 가로, 세로, 구조물
            # 기둥
            if a==0:
                # 바닥 위에 있지 않고, 보의 한쪽 끝 부분 위에 있지도 않고, 다른 기둥 위에도 없을 때
                if y!=0 and [x-1, y, 1] not in result and [x,y,1] not in result and [x,y-1, 0] not in result:
                    return False
            # 보
            elif a==1:
                # 어느 한 쪽 끝 부분도 기둥 위에 있지 않고, 양쪽 끝 부분이 다른 보와 연결되어 있지도 않을 때
                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):
        result = [] # 설치할 구조물
        
        for frame in build_frame:
            # x, y : 기둥과 보의 교차점 좌표 [가로 좌표, 세로 좌표] 
            # a : 구조물의 종류 (0은 기둥, 1은 보)
            # b : 설치 or 삭제 (0은 삭제, 1은 설치)
            x, y, a, b = frame
            
            # 설치
            if b==1:
                result.append([x,y,a])
                # 설치할 수 없으면 다시 삭제
                if not checking(result):
                    result.pop()
            # 삭제
            elif [x,y,a] in result:
                result.pop(result.index([x,y,a]))
                # 삭제할 수 없으면 다시 추가
                if not checking(result):
                    result.append([x,y,a])
                    
        # 1. x좌표 기준으로 오름차순
        # 2. x좌표가 같을 경우 y좌표 기준으로 오름차순
        # 3. x,y좌표가 모두 같은 경우 기둥이 보보다 앞에 오도록. (기둥은 0, 보는 1이므로 오름차순)
        return sorted(result, key=lambda x:(x[0],x[1],x[2]))

    ⭐2022.04.06


    勉強しているうちに、解くときにリストを使うとは思わなかったので、ずっとうろうろしていました.Python List万歳~~