[2021 카카오 채용연계형 인턴십] 거리두기 확인하기
[2021 카카오 채용연계형 인턴십] 거리두기 확인하기
🙋♂️ 들어가며
이번 문제는 조건문이 까다로운 문제였다.
1
2
3
4
5
(1,1) (1,3)
(2,2)
(3,1) (3,3)
대각선일 경우에 중앙을 cr, cc로 간주하고
사방에 있는 4개의 좌표들이 각각 nr, nc라고 하자.
이때 min, max를 사용하면 무조건 반례가 생긴다.
cr, cc, nr, nc를 사용해서 조건문으로 풀어야한다.
✅ 코드
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.Arrays;
class Solution {
static int[] dr = {1,-1,0,0};
static int[] dc = {0,0,-1,1};
static int[] dr_diag = {-1, -1, 1, 1};
static int[] dc_diag = {-1, 1, -1, 1};
static int row, col;
public int[] solution(String[][] places) {
int[] answer = new int[places.length];
for (int t = 0; t < places.length; t++) {
row = places[0].length;
col = places[0][0].length();
char[][] arr = new char[row][col];
// 1. 배열 생성
for (int r = 0; r < row; r++) {
arr[r] = places[t][r].toCharArray();
}
// 2. 탐색
boolean flag = false;
for (int r = 0; r < row; r++) {
for (int c = 0; c < col; c++) {
if (arr[r][c] == 'P') {
boolean is_detected = detector(r, c, arr);
if (is_detected) {
flag = true;
break;
}
}
// 2-1. 방역수칙 어긴놈 적발시 -> 탐색종료
if (flag) break;
}
// 2-2. 방역수칙 어긴놈 적발시 -> 탐색 종료
if (flag) break;
}
// 결과
if (flag) answer[t] = 0;
else if (!flag) answer[t] = 1;
}
return answer;
}
// 3. 함수 (탐색)
static boolean detector(int or, int oc, char[][] arr) {
// 3-1. 동서남북
boolean is_partition;
for (int d = 0; d < 4; d++) {
is_partition = false;
int cr = or;
int cc = oc;
for (int x = 0; x < 2; x++) {
int nr = cr + dr[d];
int nc = cc + dc[d];
// 범위 밖 -> 볼 필요없으니 break
if (nr < 0 || nr >= row || nc < 0 || nc >= col) break;
// 범위 내
// 파티션이 있다면?
if (arr[nr][nc] == 'X') {
is_partition = true;
}
// 사람이라면?
else if (arr[nr][nc] == 'P') {
// 파티션 없다면
// 방역수칙 어긴놈 검거
if (!is_partition) {
return true;
}
}
// 좌표 갱신
cr = nr;
cc = nc;
}
}
// 3-2. 대각선
for (int d = 0; d < dr_diag.length; d++) {
int nr = or + dr_diag[d];
int nc = oc + dc_diag[d];
// 범위 밖 -> skip
if (nr < 0 || nr >= row || nc < 0 || nc >= col) continue;
// 만약 다음 좌표가 사람이면
if (arr[nr][nc] == 'P') {
// 양쪽이 파티션이 아닐때 -> 거리두기수칙 위반
if (arr[nr][oc] != 'X' || arr[or][nc] != 'X') return true;
}
}
return false;
}
}
This post is licensed under CC BY 4.0 by the author.

