Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 49ec972

Browse files
authored
Merge pull request #301 from GreatAlgorithm-Study/dahye
[22μ£Όμ°¨] κ³ λ‹€ν˜œ
2 parents 300982a + f0e0bea commit 49ec972

File tree

7 files changed

+547
-0
lines changed

7 files changed

+547
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 이뢄 κ·Έλž˜ν”„
6+
*/
7+
8+
public class DH_1707 {
9+
static ArrayList<Integer> adj[];
10+
static boolean[] v, check;
11+
12+
public static void main(String[] args) throws Exception {
13+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
StringTokenizer st;
15+
StringBuilder sb = new StringBuilder();
16+
17+
int t = Integer.parseInt(br.readLine());
18+
19+
for(int tc = 0; tc < t; tc++) {
20+
st = new StringTokenizer(br.readLine());
21+
22+
int V = Integer.parseInt(st.nextToken()), E = Integer.parseInt(st.nextToken());
23+
v = new boolean[V + 1];
24+
25+
adj = new ArrayList[V + 1]; // μΈμ ‘λ¦¬μŠ€νŠΈ
26+
check = new boolean[V + 1]; // κ·Έλž˜ν”„κ°€ μ–΄λ–»κ²Œ λ‚˜λ‰˜λŠ”μ§€μ— λŒ€ν•œ 정보
27+
28+
for(int i = 0; i < adj.length; i++) adj[i] = new ArrayList<Integer>();
29+
30+
for(int k = 0; k < E; k++) {
31+
st = new StringTokenizer(br.readLine());
32+
33+
int a = Integer.parseInt(st.nextToken());
34+
int b = Integer.parseInt(st.nextToken());
35+
36+
adj[a].add(b);
37+
adj[b].add(a);
38+
}
39+
40+
boolean isEven = true;
41+
42+
// 첫 번째 λ…Έλ“œλΆ€ν„° λ§ˆμ§€λ§‰ λ…Έλ“œκΉŒμ§€ BFSλ₯Ό 톡해 탐색
43+
for(int i = 0; i < V + 1; i++) {
44+
if(v[i]) continue;
45+
if(!(isEven = bfs(i))) break;
46+
}
47+
48+
sb.append(isEven ? "YES" : "NO").append("\n");
49+
}
50+
51+
System.out.println(sb);
52+
}
53+
54+
static boolean bfs(int node) {
55+
56+
boolean isEven = true;
57+
58+
ArrayDeque<Integer> q = new ArrayDeque<Integer>();
59+
60+
q.add(node);
61+
v[node] = true;
62+
63+
while(!q.isEmpty()) {
64+
int current = q.poll();
65+
66+
for(int next: adj[current]) {
67+
// λ‹€μŒ λ…Έλ“œκ°€ 이미 방문된 μƒνƒœμΌ λ•Œ
68+
// κ·Έλž˜ν”„λ₯Ό μ΄λΆ„κ·Έλž˜ν”„λ‘œ λ§Œλ“€κΈ° μœ„ν•΄ λΆ„λ¦¬ν–ˆμ„ λ•Œ, λΆ„λ¦¬λ˜λŠ” κ²°κ³Όκ°€ κ°™λ‹€λ©΄ μ΄λΆ„κ·Έλž˜ν”„λ₯Ό λ§Œλ“€μ§€ λͺ»ν•¨
69+
if(v[next]) {
70+
if(check[next] == check[current]) return false;
71+
continue;
72+
}
73+
74+
// λ‹€μŒ λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄
75+
// κ·Έλž˜ν”„λ₯Ό 뢄리할 λ•Œ, ν˜„μž¬ λ…Έλ“œμ™€ μΈμ ‘ν•œ λ…Έλ“œκ°€ 같은 κ·Έλž˜ν”„μ— μ†ν•˜μ§€ μ•Šλ„λ‘ μ„€μ •ν•΄μ€Œ
76+
v[next] = true;
77+
check[next] = !check[current];
78+
q.add(next);
79+
}
80+
}
81+
return isEven;
82+
}
83+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 피리 λΆ€λŠ” μ‚¬λ‚˜μ΄
6+
*/
7+
8+
public class DH_16724 {
9+
static int N, M, cnt;
10+
static char[][] map;
11+
static int[] p;
12+
static int[] dr = {-1, 1, 0, 0}, dc = {0, 0, -1, 1};
13+
14+
public static void main(String[] args) throws Exception {
15+
initInput();
16+
initParent();
17+
18+
for(int r = 0; r < N; r++) {
19+
for(int c = 0; c < M; c++) {
20+
21+
int dir = dir(map[r][c]);
22+
int nr = r + dr[dir], nc = c + dc[dir];
23+
24+
int pos = r * M + c;
25+
int npos = nr * M + nc;
26+
27+
if(p[pos] == p[npos]) continue;
28+
union(pos, npos);
29+
}
30+
}
31+
32+
HashSet<Integer> parentSet = new HashSet<Integer>();
33+
34+
for(int p: p) parentSet.add(find(p));
35+
36+
System.out.println(parentSet.size());
37+
}
38+
39+
static void initParent() {
40+
for(int r = 0; r < N; r++) {
41+
for(int c = 0; c < M; c++) {
42+
int pos = r * M + c;
43+
p[pos] = pos;
44+
}
45+
}
46+
}
47+
48+
static void union(int a, int b) {
49+
a = find(a);
50+
b = find(b);
51+
52+
if(a != b) p[b] = a;
53+
}
54+
55+
static int find(int a) {
56+
return p[a] = p[a] == a ? a : find(p[a]);
57+
}
58+
59+
static boolean check(int r, int c) {
60+
return r >= 0 && r < N && c >= 0 && c < M;
61+
}
62+
63+
static void initInput() throws Exception {
64+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
65+
StringTokenizer st = new StringTokenizer(br.readLine());
66+
67+
N = Integer.parseInt(st.nextToken());
68+
M = Integer.parseInt(st.nextToken());
69+
70+
map = new char[N][M];
71+
p = new int[N * M];
72+
73+
for(int r = 0; r < N; r++) {
74+
String s = br.readLine();
75+
map[r] = s.toCharArray();
76+
}
77+
}
78+
79+
static int dir(char c) {
80+
if(c == 'U') return 0;
81+
if(c == 'D') return 1;
82+
if(c == 'L') return 2;
83+
else return 3;
84+
}
85+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 피리 λΆ€λŠ” μ‚¬λ‚˜μ΄
6+
* μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš° λ°œμƒν•˜λŠ”λ° ν†΅κ³Όλ˜λŠ” μ½”λ“œ
7+
*/
8+
9+
public class DH_16724WA {
10+
static int N, M, cnt;
11+
static char[][] map;
12+
static int[][] idx;
13+
static HashMap<Integer, Integer> p = new HashMap<Integer, Integer>();
14+
15+
static int[] dr = {-1, 1, 0, 0}, dc = {0, 0, -1, 1};
16+
17+
public static void main(String[] args) throws Exception {
18+
initInput();
19+
20+
idx = new int[N][M];
21+
22+
int cnt = 1;
23+
24+
for(int r = 0; r < N; r++) {
25+
for(int c = 0; c < M; c++) {
26+
if(idx[r][c] != 0) continue;
27+
28+
p.put(cnt, cnt);
29+
30+
dfs(r, c, cnt);
31+
cnt += 1;
32+
}
33+
}
34+
35+
HashSet<Integer> parentSet = new HashSet<Integer>();
36+
for(int key: p.keySet()) {
37+
parentSet.add(find(p.get(key)));
38+
}
39+
System.out.println(parentSet.size());
40+
}
41+
42+
static void dfs(int r, int c, int cnt) {
43+
44+
idx[r][c] = cnt;
45+
46+
int dir = dir(map[r][c]);
47+
int nr = r + dr[dir];
48+
int nc = c + dc[dir];
49+
50+
if(idx[nr][nc] != 0) {
51+
if(idx[nr][nc] == cnt) return;
52+
else union(cnt, idx[nr][nc]);
53+
} else dfs(nr, nc, cnt);
54+
}
55+
56+
static void union(int a, int b) {
57+
a = find(a);
58+
b = find(b);
59+
60+
if(a != b) p.put(b, a);
61+
}
62+
63+
static int find(int a) {
64+
65+
if(a == p.get(a)) return a;
66+
else {
67+
p.put(a, find(p.get(a)));
68+
return p.get(a);
69+
}
70+
}
71+
72+
static boolean check(int r, int c) {
73+
return r >= 0 && r < N && c >= 0 && c < M;
74+
}
75+
static void initInput() throws Exception {
76+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
77+
StringTokenizer st = new StringTokenizer(br.readLine());
78+
79+
N = Integer.parseInt(st.nextToken());
80+
M = Integer.parseInt(st.nextToken());
81+
82+
map = new char[N][M];
83+
84+
for(int r = 0; r < N; r++) {
85+
String s = br.readLine();
86+
map[r] = s.toCharArray();
87+
}
88+
}
89+
90+
static int dir(char c) {
91+
if(c == 'U') return 0;
92+
if(c == 'D') return 1;
93+
if(c == 'L') return 2;
94+
else return 3;
95+
}
96+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 무기 곡학
6+
*/
7+
8+
public class DH_18430 {
9+
10+
static int N, M, result;
11+
static int[][] arr;
12+
static int[][][] dir = {
13+
{{0, 0}, {0, -1}, {1, 0}},
14+
{{0, 0}, {-1, 0}, {0, -1}},
15+
{{0, 0}, {-1, 0}, {0, 1}},
16+
{{0, 0}, {0 , 1}, {1, 0}}
17+
};
18+
19+
static boolean[][] v;
20+
21+
public static void main(String[] args) throws Exception {
22+
initInput();
23+
24+
dfs(0, 0);
25+
26+
System.out.println(result);
27+
}
28+
29+
static void dfs(int pos, int sum) {
30+
31+
if(pos == N * M) {
32+
result = Math.max(result, sum);
33+
return;
34+
}
35+
36+
int r = pos / M;
37+
int c = pos % M;
38+
39+
// λ°”λ‘œ κ·Έ λ‹€μŒ 지점에 놓아주기
40+
dfs(pos + 1, sum);
41+
42+
// λΆ€λ©”λž‘μ„ 놓을 수 μžˆλ‹€λ©΄ 놓고 λ‹€μŒ μ§€μ μœΌλ‘œ 이동
43+
for(int d = 0; d < 4; d++) {
44+
45+
boolean flag = true; // λΆ€λ©”λž‘μ„ 놓을 수 μžˆλŠ”μ§€
46+
47+
int tmp = 0;
48+
49+
for(int k = 0; k < 3; k++) {
50+
int nr = r + dir[d][k][0];
51+
int nc = c + dir[d][k][1];
52+
53+
// λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κ±°λ‚˜, 이미 놓여져 μžˆλ‹€λ©΄
54+
if(!check(nr, nc) || v[nr][nc]) {
55+
flag = false;
56+
break;
57+
}
58+
}
59+
60+
if(!flag) continue;
61+
62+
for(int k = 0; k < 3; k++) {
63+
int nr = r + dir[d][k][0];
64+
int nc = c + dir[d][k][1];
65+
66+
v[nr][nc] = true;
67+
tmp += arr[nr][nc];
68+
if(k == 0) tmp += arr[nr][nc];
69+
}
70+
71+
// dfs μ§„ν–‰
72+
dfs(pos + 1, sum + tmp);
73+
74+
// 원상볡ꡬ
75+
for(int k = 0; k < 3; k++) {
76+
int nr = r + dir[d][k][0];
77+
int nc = c + dir[d][k][1];
78+
79+
v[nr][nc] = false;
80+
}
81+
}
82+
}
83+
84+
static boolean check(int r, int c) {
85+
return r >= 0 && r < N && c >= 0 && c < M;
86+
}
87+
88+
static void initInput() throws Exception {
89+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
90+
StringTokenizer st = new StringTokenizer(br.readLine());
91+
92+
N = Integer.parseInt(st.nextToken());
93+
M = Integer.parseInt(st.nextToken());
94+
95+
arr = new int[N][M];
96+
v = new boolean[N][M];
97+
98+
for(int r = 0; r < N; r++) {
99+
st = new StringTokenizer(br.readLine());
100+
101+
for(int c = 0; c < M; c++) arr[r][c] = Integer.parseInt(st.nextToken());
102+
}
103+
}
104+
}

0 commit comments

Comments
(0)

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /