Skip to content

Commit 94cb80b

Browse files
authoredOct 9, 2020
Update 6.java
1 parent fd705d2 commit 94cb80b

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed
 

‎12/6.java

+143
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import java.util.*;
2+
3+
class Node implements Comparable<Node> {
4+
5+
private int x;
6+
private int y;
7+
private int stuff;
8+
9+
public Node(int x, int y, int stuff) {
10+
this.x = x;
11+
this.y = y;
12+
this.stuff = stuff;
13+
}
14+
15+
public int getX() {
16+
return this.x;
17+
}
18+
19+
public int getY() {
20+
return this.y;
21+
}
22+
23+
public int getStuff() {
24+
return this.stuff;
25+
}
26+
27+
// 정렬 기준 설정 (x, y, stuff 순서대로 오름차순)
28+
@Override
29+
public int compareTo(Node other) {
30+
if (this.x == other.x && this.y == other.y) {
31+
return Integer.compare(this.stuff, other.stuff);
32+
}
33+
if (this.x == other.x) {
34+
return Integer.compare(this.y, other.y);
35+
}
36+
return Integer.compare(this.x, other.x);
37+
}
38+
}
39+
40+
class Solution {
41+
42+
// 현재 설치된 구조물이 '가능한' 구조물인지 확인하는 함수
43+
public boolean possible(ArrayList<ArrayList<Integer>> answer) {
44+
for (int i = 0; i < answer.size(); i++) {
45+
int x = answer.get(i).get(0);
46+
int y = answer.get(i).get(1);
47+
int stuff = answer.get(i).get(2);
48+
if (stuff == 0) { // 설치된 것이 '기둥'인 경우
49+
boolean check = false;
50+
// '바닥 위'라면 정상
51+
if (y == 0) check = true;
52+
// '보의 한 쪽 끝 부분 위' 혹은 '다른 기둥 위'라면 정상
53+
for (int j = 0; j < answer.size(); j++) {
54+
if (x - 1 == answer.get(j).get(0) && y == answer.get(j).get(1) && 1 == answer.get(j).get(2)) {
55+
check = true;
56+
}
57+
if (x == answer.get(j).get(0) && y == answer.get(j).get(1) && 1 == answer.get(j).get(2)) {
58+
check = true;
59+
}
60+
if (x == answer.get(j).get(0) && y - 1 == answer.get(j).get(1) && 0 == answer.get(j).get(2)) {
61+
check = true;
62+
}
63+
}
64+
if (!check) return false; // 아니라면 거짓(False) 반환
65+
}
66+
else if (stuff == 1) { // 설치된 것이 '보'인 경우
67+
boolean check = false;
68+
boolean left = false;
69+
boolean right = false;
70+
// '한쪽 끝부분이 기둥 위' 혹은 '양쪽 끝부분이 다른 보와 동시에 연결'이라면 정상
71+
for (int j = 0; j < answer.size(); j++) {
72+
if (x == answer.get(j).get(0) && y - 1 == answer.get(j).get(1) && 0 == answer.get(j).get(2)) {
73+
check = true;
74+
}
75+
if (x + 1 == answer.get(j).get(0) && y - 1 == answer.get(j).get(1) && 0 == answer.get(j).get(2)) {
76+
check = true;
77+
}
78+
if (x - 1 == answer.get(j).get(0) && y == answer.get(j).get(1) && 1 == answer.get(j).get(2)) {
79+
left = true;
80+
}
81+
if (x + 1 == answer.get(j).get(0) && y == answer.get(j).get(1) && 1 == answer.get(j).get(2)) {
82+
right = true;
83+
}
84+
}
85+
if (left && right) check = true;
86+
if (!check) return false; // 아니라면 거짓(False) 반환
87+
}
88+
}
89+
return true;
90+
}
91+
92+
public int[][] solution(int n, int[][] build_frame) {
93+
ArrayList<ArrayList<Integer>> answer = new ArrayList<ArrayList<Integer>>();
94+
// 작업(frame)의 개수는 최대 1,000개
95+
for (int i = 0; i < build_frame.length; i++) {
96+
int x = build_frame[i][0];
97+
int y = build_frame[i][1];
98+
int stuff = build_frame[i][2];
99+
int operate = build_frame[i][3];
100+
if (operate == 0) { // 삭제하는 경우
101+
// 일단 삭제를 해 본 뒤에
102+
int index = 0;
103+
for (int j = 0; j < answer.size(); j++) {
104+
if (x == answer.get(j).get(0) && y == answer.get(j).get(1) && stuff == answer.get(j).get(2)) {
105+
index = j;
106+
}
107+
}
108+
ArrayList<Integer> erased = answer.get(index);
109+
answer.remove(index);
110+
if (!possible(answer)) { // 가능한 구조물인지 확인
111+
answer.add(erased); // 가능한 구조물이 아니라면 다시 설치
112+
}
113+
}
114+
if (operate == 1) { // 설치하는 경우
115+
// 일단 설치를 해 본 뒤에
116+
ArrayList<Integer> inserted = new ArrayList<Integer>();
117+
inserted.add(x);
118+
inserted.add(y);
119+
inserted.add(stuff);
120+
answer.add(inserted);
121+
if (!possible(answer)) { // 가능한 구조물인지 확인
122+
answer.remove(answer.size() - 1); // 가능한 구조물이 아니라면 다시 제거
123+
}
124+
}
125+
}
126+
127+
// 정렬 수행
128+
ArrayList<Node> ans = new ArrayList<Node>();
129+
for (int i = 0; i < answer.size(); i++) {
130+
ans.add(new Node(answer.get(i).get(0), answer.get(i).get(1), answer.get(i).get(2)));
131+
}
132+
Collections.sort(ans);
133+
134+
// 배열로 바꾸어 반환
135+
int[][] res = new int[ans.size()][3];
136+
for (int i = 0; i < ans.size(); i++) {
137+
res[i][0] = ans.get(i).getX();
138+
res[i][1] = ans.get(i).getY();
139+
res[i][2] = ans.get(i).getStuff();
140+
}
141+
return res;
142+
}
143+
}

0 commit comments

Comments
 (0)