본문 바로가기

Algorithm/Practice

Programmers - 기둥 과 보 설치 with JAVA

 

로직

1. 설치 연산시 -> 우선 설치 후, 모든 구조물이 괜찮은지 확인 -> 괜찮지 않다면 삭제

2. 삭제 연산시 -> 우선 삭제 후, 모든 구조물이 괜찮은지 확인 -> 괜찮지 않다면 설치

 

모든 구조물이 괜찮은가?

1. 기둥 : 땅 위에 있거나 보 위에 있거나 기둥 위에 있으면 괜찮다.

2. 보 : 기둥 위에 있거나 양쪽으로 보가 연결되어 있으면 괜찮다.

 

 

 

 

코드

import java.util.*;
class Solution {
    public List<List<Integer>> solution(int n, int[][] build_frame) {
        List<List<Integer>> answer = new ArrayList<>();
        for(int[] frame : build_frame){
            int x = frame[0];
            int y = frame[1];
            int stuff = frame[2];
            int operation = frame[3];
            // 삭제
            if(operation == 0){
            	// 우선 삭제
                answer.remove(Arrays.asList(x, y, stuff));
                // 안 괜찮으면 다시 설치
                if(!possible(answer)){
                    answer.add(Arrays.asList(x, y, stuff));
                }
            }
            // 설치
            if(operation == 1){
            	// 우선 설치
                answer.add(Arrays.asList(x, y, stuff));
                // 안 괜찮으면 다시 삭제
                if(!possible(answer)){
                    answer.remove(Arrays.asList(x, y, stuff));
                }
            }
        }
        Collections.sort(answer, Comparator.comparing(
                             (List<Integer> arr) -> arr.get(0))
                        .thenComparing(arr -> arr.get(1))
                        .thenComparing(arr -> arr.get(2)));
        return answer;
    }
    // 현재 설치된 기둥이나 보 전체가 괜찮은지 확인
    public static boolean possible(List<List<Integer>> answer){
        for(List<Integer> now : answer){
            int x = now.get(0);
            int y = now.get(1);
            int stuff = now.get(2);
            // 기둥
            if(stuff == 0){
            	// 기둥이 바닥에 있으면 괜찮다.
                if(y == 0){
                    continue;
                }
                // 기둥이 보 위에 있으면 괜찮다.
                if(answer.contains(Arrays.asList(x-1, y, 1))){
                    continue;
                }
                // 기둥이 보 위에 있으면 괜찮다.
                if(answer.contains(Arrays.asList(x, y, 1))){
                    continue;
                }
                // 기둥이 기둥 위에 있으면 괜찮다.
                if(answer.contains(Arrays.asList(x, y-1, 0))){
                    continue;
                }
                return false;
            }
            // 보
            if(stuff == 1){
            	// 보가 기둥 위에 있으면 괜찮다.
                if(answer.contains(Arrays.asList(x, y-1, 0))){
                    continue;
                }
            	// 보가 기둥 위에 있으면 괜찮다.
                if(answer.contains(Arrays.asList(x+1, y-1, 0))){
                    continue;
                }
                // 보가 양쪽 보 위에 있으면 괜찮다.
                if(answer.contains(Arrays.asList(x-1, y, 1))){
                    if(answer.contains(Arrays.asList(x+1, y, 1))){
                        continue;
                    }
                }
                return false;
            }
        }
        return true;
    }
}

 

 

연습 코드

import java.util.*;
class Solution {
    public List<List<Integer>> solution(int n, int[][] build_frame) {
        List<List<Integer>> answer = new ArrayList<>();
        for(int[] frame : build_frame){
            int x = frame[0];
            int y = frame[1];
            int a = frame[2];
            int b = frame[3];
            // 삭제
            if(b == 0){
                answer.remove(Arrays.asList(x, y, a));
                if(!check(answer)){
                    answer.add(Arrays.asList(x, y, a));
                }
            }
            // 설치
            if(b == 1){
                answer.add(Arrays.asList(x, y, a));   
                if(!check(answer)){
                    answer.remove(Arrays.asList(x, y, a));
                }
            }
        }
        // 정렬
        Collections.sort(answer, Comparator
                         .comparing((List<Integer> arr) -> arr.get(0))
                         .thenComparing(arr -> arr.get(1))
                         .thenComparing(arr -> arr.get(2)));
        return answer;
    }
    public static boolean check(List<List<Integer>> answer){
        for(List<Integer> now : answer){
            int x = now.get(0);
            int y = now.get(1);
            int a = now.get(2);
            // 기둥
            if(a == 0){
                // 바닥 위
                if(y == 0){
                    continue;
                }
                // 기둥 위
                if(answer.contains(Arrays.asList(x, y-1, 0))){
                    continue;
                }
                // 보 위
                if(answer.contains(Arrays.asList(x-1, y, 1))){
                    continue;
                }
                // 보 위
                if(answer.contains(Arrays.asList(x, y, 1))){
                    continue;
                }
            }
            // 보
            if(a == 1){
                // 기둥 위
                if(answer.contains(Arrays.asList(x, y-1, 0))){
                    continue;
                }
                // 기둥 위
                if(answer.contains(Arrays.asList(x+1, y-1, 0))){
                    continue;
                }
                // 양쪽 보 위
                if(answer.contains(Arrays.asList(x-1, y, 1)) 
                   && answer.contains(Arrays.asList(x+1, y, 1))){
                    continue;
                }
            }
            return false;
        }
        return true;
    }
}