## 접근.
1. 블록을 이루고 있는 4개 정사각형의 위치를 가지고 있는 자료구조를 만든다.
2. 블록들중에서, 없어질 수 있는 블록들 후보에 대해서 인덱스 자료구조를 만든다.
* |__, __|, ㅗ, _|, |_ 이렇게 총 5가지이다.
3. 후보들이 검은 블록으로 지워지는지 확인하기 위해서는, 상대적으로 위에 위치한 블록들중에 지울 수 있는 건 모두 지워야 확인이 가능하다. 즉, 지워지는지 체크하기 위해서 후보들을 정렬할 필요가 있다. 가장 나중에 입력된 1 X 1 정사각형을 기준으로 내림차순 정렬을 한다.
* 가장 나중에 입력된 1 X 1 정사각형이 모든 블록에서 행(ROW)이 가장 작다. 가장 낮은 위치의 1 X 1 정사각형을 사용해야, 지워질 수 있는 블록들을 모두 사라진 상태에서 속이 꽉 채워진 직사각형을 만들 수 있는지 확인이 가능하다.
## 해설코드(Java).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
import java.util.*;
import java.io.*;
import java.lang.*;
class Solution {
class Item{
int r, c;
Item(int r, int c){
this.r = r;
this.c = c;
}
}
public int solution(int[][] board) {
int answer = 0;
ArrayList<ArrayList<Item>> aList = new ArrayList<>();
ArrayList<Integer> canList = new ArrayList<>();
for(int i = 0; i < 201; i++)
aList.add(new ArrayList<Item>());
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board.length; j++){
if(board[i][j] != 0)
aList.get(board[i][j]).add(new Item(i, j));
}
}
for(int i = 0 ; i < aList.size(); i++){
ArrayList<Item> aListList = aList.get(i);
if(aListList.size() != 4)
continue;
Item i1 = aListList.get(0);
Item i2 = aListList.get(1);
Item i3 = aListList.get(2);
Item i4 = aListList.get(3);
if(i2.r == i3.r && i3.r == i4.r && i2.c + 1 == i3.c && i3.c + 1 == i4.c && i1.r + 1 == i2.r){
if(i1.c == i2.c){
//|___
canList.add(i);
}else if(i1.c == i4.c){
//___|
canList.add(i);
}else if(i1.c == i3.c){
// ㅗ
canList.add(i);
}
}else if(i1.c == i2.c && i2.c == i4.c && i1.r + 1 == i2.r && i2.r + 1 == i4.r
&& i3.r == i4.r && i3.c + 1 == i4.c){
//_|
canList.add(i);
}else if(i1.c == i2.c && i2.c == i3.c && i1.r + 1 == i2.r && i2.r + 1 == i3.r
&& i3.r == i4.r && i3.c + 1 == i4.c){
// |_
canList.add(i);
}
}
Collections.sort(canList, new Comparator<Integer>(){
public int compare(Integer i1, Integer i2){
Item item1 = aList.get(i1).get(3);
Item item2 = aList.get(i2).get(3);
if(item1.r == item2.r){
return Integer.compare(item1.c, item2.c);
}else
return Integer.compare(item1.r, item2.r);
}
});
for(int i : canList){
ArrayList<Item> list = aList.get(i);
boolean flag = true;
int firstC = list.get(0).c;
for(int j = 1; j < list.size(); j++){
int r = list.get(j).r;
int c = list.get(j).c;
if(c == firstC)
continue;
while(r >= 0){
if(board[r][c] != 0 && board[r][c] != i) {
flag = false;
break;
}
r -= 1;
}
}
if(flag) {
for(Item item : list)
board[item.r][item.c] = 0;
answer += 1;
}
//System.out.println(i);
}
return answer;
}
}
|
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[2019 카카오 개발자 겨울 인턴십] 불량 사용자 (0) | 2020.08.31 |
---|---|
[2019 카카오 개발자 겨울 인턴십] 튜플(Java, 깊은 복사, 문자열 처리) (0) | 2020.08.29 |
[2019 KAKAO BLIND RECRUITMENT] 길 찾기 게임(Java, 간단한 코드) (0) | 2020.08.27 |
[2019 KAKAO BLIND RECRUITMENT] 무지의 먹방 라이브(Java) (0) | 2020.08.27 |
[2020 KAKAO BLIND RECRUITMENT] 기둥과 보 설치(Java, 간단한코드) (0) | 2020.08.25 |