로직
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;
}
}
'Algorithm > Practice' 카테고리의 다른 글
Programmers - 택배 배달과 수거하기 with JAVA (0) | 2023.07.16 |
---|---|
Programmers - 순위 검색 with JAVA (V) (0) | 2023.07.15 |
Programmers - 리코쳇 로봇 with JAVA (0) | 2023.07.10 |
Programmers - 표편집 with JAVA (V) (0) | 2023.07.09 |
Programmers - 풍선 터트리기 with JAVA (0) | 2023.07.07 |