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 772d9c4

Browse files
authored
Merge pull request #303 from GreatAlgorithm-Study/xubin
[22주차] 배수빈
2 parents 62e00a7 + 95e760d commit 772d9c4

File tree

6 files changed

+337
-0
lines changed

6 files changed

+337
-0
lines changed

‎BOJ/1000-5000번/SB_1707.java‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.*;
5+
6+
public class SB_1707 {
7+
static int[] visited;
8+
static ArrayList<ArrayList<Integer>> adj;
9+
10+
private static boolean bfs(int node) {
11+
Deque<Integer> que = new ArrayDeque<>();
12+
que.offer(node);
13+
visited[node] = 0; // 처음은 0으로 시작
14+
15+
while (!que.isEmpty()) {
16+
int cur = que.poll();
17+
for (int nxt : adj.get(cur)) {
18+
if (visited[nxt] == -1) {
19+
visited[nxt] = visited[cur] ^ 1; // 다른 팀 배정
20+
que.offer(nxt);
21+
} else if (visited[nxt] == visited[cur]) {
22+
return false; // 같은 그룹이면 이분 그래프가 아님
23+
}
24+
}
25+
}
26+
return true;
27+
}
28+
29+
public static void main(String[] args) throws IOException {
30+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
31+
StringTokenizer st;
32+
StringBuilder sb = new StringBuilder();
33+
34+
int K = Integer.parseInt(br.readLine());
35+
while (K-- > 0) {
36+
st = new StringTokenizer(br.readLine());
37+
int V = Integer.parseInt(st.nextToken());
38+
int E = Integer.parseInt(st.nextToken());
39+
40+
adj = new ArrayList<>();
41+
for (int i = 0; i <= V; i++) {
42+
adj.add(new ArrayList<>());
43+
}
44+
45+
for (int i = 0; i < E; i++) {
46+
st = new StringTokenizer(br.readLine());
47+
int u = Integer.parseInt(st.nextToken());
48+
int v = Integer.parseInt(st.nextToken());
49+
adj.get(u).add(v);
50+
adj.get(v).add(u);
51+
}
52+
53+
visited = new int[V + 1];
54+
Arrays.fill(visited, -1);
55+
56+
boolean isBipartite = true;
57+
for (int i = 1; i <= V; i++) {
58+
if (visited[i] == -1) { // 방문하지 않은 노드가 있다면 새롭게 탐색
59+
if (!bfs(i)) {
60+
isBipartite = false;
61+
break;
62+
}
63+
}
64+
}
65+
66+
sb.append(isBipartite ? "YES\n" : "NO\n");
67+
}
68+
69+
System.out.print(sb);
70+
}
71+
}

‎BOJ/15001-20000번/SB_16724.java‎

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.StringTokenizer;
5+
6+
/**
7+
* 어느 구역에 있더라도 SAFE ZONE 들거가게 하는 SAFE ZONE의 최소 개수 구하기
8+
* => 순환 그래프의 개수 구하기
9+
*/
10+
11+
public class SB_16724 {
12+
static int N, M;
13+
static int[][] board;
14+
static int[] dx = {-1, 1, 0, 0}; // 행 이동
15+
static int[] dy = {0, 0, -1, 1}; // 열 이동
16+
static boolean[][] visited;
17+
static boolean[][] finished;
18+
static int cycle = 0;
19+
20+
private static void dfs(int x, int y) {
21+
visited[x][y] = true;
22+
23+
// 다음 좌표
24+
int d = board[x][y];
25+
int nx = x+dx[d];
26+
int ny = y+dy[d];
27+
28+
if (visited[nx][ny] && !finished[nx][ny]) { // 사이클 찾은 경우
29+
cycle++;
30+
}
31+
32+
if (!visited[nx][ny]) dfs(nx, ny); // 방문안했을 경우 다음 좌표로 이동
33+
34+
finished[x][y] = true; // 현재 노드의 dfs를 다 돌았으면 끝났음 표시
35+
}
36+
public static void main(String[] args) throws IOException {
37+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
38+
StringTokenizer st = new StringTokenizer(br.readLine());
39+
40+
N = Integer.parseInt(st.nextToken());
41+
M = Integer.parseInt(st.nextToken());
42+
43+
board = new int[N][M];
44+
visited = new boolean[N][M];
45+
finished = new boolean[N][M];
46+
for (int i = 0; i < N; i++) {
47+
String line = br.readLine();
48+
for (int j = 0; j < M; j++) {
49+
char d = line.charAt(j);
50+
switch (d){
51+
case 'U':
52+
board[i][j] = 0;
53+
break;
54+
case 'D':
55+
board[i][j] = 1;
56+
break;
57+
case 'L':
58+
board[i][j] = 2;
59+
break;
60+
case 'R':
61+
board[i][j] = 3;
62+
break;
63+
}
64+
}
65+
}
66+
67+
for (int i = 0; i < N; i++) {
68+
for (int j = 0; j < M; j++) {
69+
if (!finished[i][j]) dfs(i, j);
70+
}
71+
}
72+
73+
System.out.println(cycle);
74+
}
75+
}

‎BOJ/15001-20000번/SB_18430.java‎

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.StringTokenizer;
5+
6+
public class SB_18430 {
7+
static int N,M;
8+
static int[][] board;
9+
static int[][] wings = {
10+
{0, -1, 1, 0},
11+
{-1, 0, 0, -1},
12+
{-1, 0, 0, 1},
13+
{0, 1, 1, 0}
14+
};
15+
static int ans = 0;
16+
17+
private static void dfs(int x, int y, int val, boolean[][] visited) {
18+
if(x==N) { // 모든 칸 탐색
19+
ans = Math.max(ans, val);
20+
return;
21+
}
22+
23+
int nx = (y+1 == M) ? x+1 : x; // 다음 위치, 다음 행으로 이동 or 열로 이동
24+
int ny = (y+1 == M) ? 0 : y+1;
25+
26+
if (visited[x][y]){
27+
dfs(nx, ny, val, visited);
28+
return;
29+
}
30+
31+
visited[x][y] = true;
32+
for (int[] w : wings){
33+
int lx = x + w[0]; // 날개 좌표
34+
int ly = y + w[1];
35+
int rx = x + w[2];
36+
int ry = y + w[3];
37+
38+
if (!isValid(lx, ly) || !isValid(rx, ry) || visited[lx][ly] || visited[rx][ry]) continue;
39+
40+
visited[lx][ly] = true;
41+
visited[rx][ry] = true;
42+
43+
int curVal = val + board[x][y]*2 + board[lx][ly] + board[rx][ry];
44+
dfs(nx, ny, curVal, visited);
45+
visited[lx][ly] = false;
46+
visited[rx][ry] = false;
47+
}
48+
visited[x][y] = false;
49+
50+
// 부메랑 안만드는 경우
51+
dfs(nx, ny, val, visited);
52+
53+
}
54+
55+
private static boolean isValid(int x, int y){
56+
return 0<=x && x<N && 0<=y && y<M;
57+
}
58+
59+
public static void main(String[] args) throws IOException {
60+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
61+
StringTokenizer st = new StringTokenizer(br.readLine());
62+
63+
N = Integer.parseInt(st.nextToken());
64+
M = Integer.parseInt(st.nextToken());
65+
66+
board = new int[N][M];
67+
for (int i = 0; i < N; i++) {
68+
st = new StringTokenizer(br.readLine());
69+
for (int j = 0; j < M; j++) {
70+
board[i][j] = Integer.parseInt(st.nextToken());
71+
}
72+
}
73+
74+
boolean[][] visited = new boolean[N][M];
75+
dfs(0, 0, 0, visited);
76+
System.out.println(ans);
77+
}
78+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import java.util.StringTokenizer;
7+
8+
public class SB_병원_거리_최소화하기 {
9+
static int N, M;
10+
static int[][] board;
11+
static List<Node> people = new ArrayList<>();
12+
static List<Node> hospital = new ArrayList<>();
13+
static List<List<Integer>> combi = new ArrayList<>();
14+
static int ans = Integer.MAX_VALUE;
15+
16+
private static void dfs(int start, List<Integer> tmp) {
17+
if (tmp.size() == M) {
18+
combi.add(new ArrayList<>(tmp));
19+
return;
20+
}
21+
22+
for (int i = start; i < hospital.size(); i++) {
23+
tmp.add(i);
24+
dfs(i + 1, tmp);
25+
tmp.remove(tmp.size() - 1);
26+
}
27+
}
28+
public static void main(String[] args) throws IOException {
29+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
30+
StringTokenizer st = new StringTokenizer(br.readLine());
31+
32+
N = Integer.parseInt(st.nextToken());
33+
M = Integer.parseInt(st.nextToken());
34+
35+
board = new int[N][N];
36+
for (int i = 0; i < N; i++) {
37+
st = new StringTokenizer(br.readLine());
38+
for (int j = 0; j < N; j++) {
39+
board[i][j] = Integer.parseInt(st.nextToken());
40+
if (board[i][j]==1) people.add(new Node(i, j));
41+
else if (board[i][j]==2) hospital.add(new Node(i, j));
42+
}
43+
}
44+
45+
// 병원 선택 조합 생성
46+
dfs(0, new ArrayList<Integer>());
47+
48+
// 각 사람별 최소 병원 구간 구하기
49+
for (List<Integer> lst: combi) {
50+
int tmp = 0;
51+
for (Node p : people) {
52+
int mn = Integer.MAX_VALUE;
53+
for (Integer i : lst) { // 각 사람이 병원을 돌며, 최소 병원길이 찾기
54+
Node h = hospital.get(i);
55+
int dist = Math.abs(h.x - p.x) + Math.abs(h.y - p.y);
56+
mn = Math.min(mn, dist);
57+
}
58+
tmp += mn; // 최소 병원길이 더해주기
59+
if (tmp >= ans) break;
60+
}
61+
ans = Math.min(ans, tmp);
62+
}
63+
64+
System.out.println(ans);
65+
}
66+
static class Node{
67+
int x, y;
68+
69+
public Node(int x, int y) {
70+
this.x = x;
71+
this.y = y;
72+
}
73+
}
74+
}

‎Programmers/Level3/SB_67258.java‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import java.util.*;
2+
3+
class SB_67258 {
4+
public int[] solution(String[] gems) {
5+
Set<String> set = new HashSet<>(Arrays.asList(gems));
6+
HashMap<String, Integer> map = new HashMap<>();
7+
int N = set.size();
8+
int mn = Integer.MAX_VALUE;
9+
int[] ans = new int[2];
10+
11+
int start = 0;
12+
for (int end = 0; end < gems.length; end++) {
13+
map.put(gems[end], map.getOrDefault(gems[end], 0) + 1); // 하나씩 보석 먹어나가기
14+
while (map.size()==N) { // 먹은 보석의 개수가 전체 보석일때 동안
15+
if (end-start < mn) { // 현재 길이가 짧다면 답 업데이트
16+
mn = end-start;
17+
ans[0] = start;
18+
ans[1] = end;
19+
}
20+
map.put(gems[start], map.getOrDefault(gems[start], 0) - 1);
21+
if (map.get(gems[start])==0) map.remove(gems[start]); // 보석뺐을때 0 되면 그 보석 못먹은거니까 빼기
22+
start++;
23+
}
24+
}
25+
ans[0]++;
26+
ans[1]++;
27+
return ans;
28+
}
29+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
SELECT
2+
YEAR(o.SALES_DATE) AS YEAR,
3+
MONTH(o.SALES_DATE) AS MONTH,
4+
u.GENDER,
5+
COUNT(DISTINCT o.USER_ID) AS USERS
6+
FROM USER_INFO u
7+
JOIN ONLINE_SALE o ON u.USER_ID = o.USER_ID
8+
GROUP BY YEAR, MONTH, GENDER
9+
HAVING GENDER IS NOT NULL
10+
ORDER BY YEAR, MONTH, GENDER;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /