Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[22주차] 고다혜 #301

Merged
merged 6 commits into from
Feb 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 83 additions & 0 deletions BOJ/1000-5000번/DH_1707.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import java.io.*;
import java.util.*;

/*
* 이분 그래프
*/

public class DH_1707 {
static ArrayList<Integer> adj[];
static boolean[] v, check;

public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();

int t = Integer.parseInt(br.readLine());

for(int tc = 0; tc < t; tc++) {
st = new StringTokenizer(br.readLine());

int V = Integer.parseInt(st.nextToken()), E = Integer.parseInt(st.nextToken());
v = new boolean[V + 1];

adj = new ArrayList[V + 1]; // 인접리스트
check = new boolean[V + 1]; // 그래프가 어떻게 나뉘는지에 대한 정보

for(int i = 0; i < adj.length; i++) adj[i] = new ArrayList<Integer>();

for(int k = 0; k < E; k++) {
st = new StringTokenizer(br.readLine());

int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());

adj[a].add(b);
adj[b].add(a);
}

boolean isEven = true;

// 첫 번째 노드부터 마지막 노드까지 BFS를 통해 탐색
for(int i = 0; i < V + 1; i++) {
if(v[i]) continue;
if(!(isEven = bfs(i))) break;
}

sb.append(isEven ? "YES" : "NO").append("\n");
}

System.out.println(sb);
}

static boolean bfs(int node) {

boolean isEven = true;

ArrayDeque<Integer> q = new ArrayDeque<Integer>();

q.add(node);
v[node] = true;

while(!q.isEmpty()) {
int current = q.poll();

for(int next: adj[current]) {
// 다음 노드가 이미 방문된 상태일 때
// 그래프를 이분그래프로 만들기 위해 분리했을 때, 분리되는 결과가 같다면 이분그래프를 만들지 못함
if(v[next]) {
if(check[next] == check[current]) return false;
continue;
}

// 다음 노드를 방문하지 않았다면
// 그래프를 분리할 때, 현재 노드와 인접한 노드가 같은 그래프에 속하지 않도록 설정해줌
v[next] = true;
check[next] = !check[current];
q.add(next);
}
}
return isEven;
}
}
85 changes: 85 additions & 0 deletions BOJ/15001-20000번/DH_16724.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import java.io.*;
import java.util.*;

/*
* 피리 부는 사나이
*/

public class DH_16724 {
static int N, M, cnt;
static char[][] map;
static int[] p;
static int[] dr = {-1, 1, 0, 0}, dc = {0, 0, -1, 1};

public static void main(String[] args) throws Exception {
initInput();
initParent();

for(int r = 0; r < N; r++) {
for(int c = 0; c < M; c++) {

int dir = dir(map[r][c]);
int nr = r + dr[dir], nc = c + dc[dir];

int pos = r * M + c;
int npos = nr * M + nc;

if(p[pos] == p[npos]) continue;
union(pos, npos);
}
}

HashSet<Integer> parentSet = new HashSet<Integer>();

for(int p: p) parentSet.add(find(p));

System.out.println(parentSet.size());
}

static void initParent() {
for(int r = 0; r < N; r++) {
for(int c = 0; c < M; c++) {
int pos = r * M + c;
p[pos] = pos;
}
}
}

static void union(int a, int b) {
a = find(a);
b = find(b);

if(a != b) p[b] = a;
}

static int find(int a) {
return p[a] = p[a] == a ? a : find(p[a]);
}

static boolean check(int r, int c) {
return r >= 0 && r < N && c >= 0 && c < M;
}

static void initInput() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());

map = new char[N][M];
p = new int[N * M];

for(int r = 0; r < N; r++) {
String s = br.readLine();
map[r] = s.toCharArray();
}
}

static int dir(char c) {
if(c == 'U') return 0;
if(c == 'D') return 1;
if(c == 'L') return 2;
else return 3;
}
}
96 changes: 96 additions & 0 deletions BOJ/15001-20000번/DH_16724WA.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import java.io.*;
import java.util.*;

/*
* 피리 부는 사나이
* 스택 오버플로우 발생하는데 통과되는 코드
*/

public class DH_16724WA {
static int N, M, cnt;
static char[][] map;
static int[][] idx;
static HashMap<Integer, Integer> p = new HashMap<Integer, Integer>();

static int[] dr = {-1, 1, 0, 0}, dc = {0, 0, -1, 1};

public static void main(String[] args) throws Exception {
initInput();

idx = new int[N][M];

int cnt = 1;

for(int r = 0; r < N; r++) {
for(int c = 0; c < M; c++) {
if(idx[r][c] != 0) continue;

p.put(cnt, cnt);

dfs(r, c, cnt);
cnt += 1;
}
}

HashSet<Integer> parentSet = new HashSet<Integer>();
for(int key: p.keySet()) {
parentSet.add(find(p.get(key)));
}
System.out.println(parentSet.size());
}

static void dfs(int r, int c, int cnt) {

idx[r][c] = cnt;

int dir = dir(map[r][c]);
int nr = r + dr[dir];
int nc = c + dc[dir];

if(idx[nr][nc] != 0) {
if(idx[nr][nc] == cnt) return;
else union(cnt, idx[nr][nc]);
} else dfs(nr, nc, cnt);
}

static void union(int a, int b) {
a = find(a);
b = find(b);

if(a != b) p.put(b, a);
}

static int find(int a) {

if(a == p.get(a)) return a;
else {
p.put(a, find(p.get(a)));
return p.get(a);
}
}

static boolean check(int r, int c) {
return r >= 0 && r < N && c >= 0 && c < M;
}
static void initInput() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());

map = new char[N][M];

for(int r = 0; r < N; r++) {
String s = br.readLine();
map[r] = s.toCharArray();
}
}

static int dir(char c) {
if(c == 'U') return 0;
if(c == 'D') return 1;
if(c == 'L') return 2;
else return 3;
}
}
104 changes: 104 additions & 0 deletions BOJ/15001-20000번/DH_18430.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import java.io.*;
import java.util.*;

/*
* 무기 공학
*/

public class DH_18430 {

static int N, M, result;
static int[][] arr;
static int[][][] dir = {
{{0, 0}, {0, -1}, {1, 0}},
{{0, 0}, {-1, 0}, {0, -1}},
{{0, 0}, {-1, 0}, {0, 1}},
{{0, 0}, {0 , 1}, {1, 0}}
};

static boolean[][] v;

public static void main(String[] args) throws Exception {
initInput();

dfs(0, 0);

System.out.println(result);
}

static void dfs(int pos, int sum) {

if(pos == N * M) {
result = Math.max(result, sum);
return;
}

int r = pos / M;
int c = pos % M;

// 바로 그 다음 지점에 놓아주기
dfs(pos + 1, sum);

// 부메랑을 놓을 수 있다면 놓고 다음 지점으로 이동
for(int d = 0; d < 4; d++) {

boolean flag = true; // 부메랑을 놓을 수 있는지

int tmp = 0;

for(int k = 0; k < 3; k++) {
int nr = r + dir[d][k][0];
int nc = c + dir[d][k][1];

// 범위를 벗어나거나, 이미 놓여져 있다면
if(!check(nr, nc) || v[nr][nc]) {
flag = false;
break;
}
}

if(!flag) continue;

for(int k = 0; k < 3; k++) {
int nr = r + dir[d][k][0];
int nc = c + dir[d][k][1];

v[nr][nc] = true;
tmp += arr[nr][nc];
if(k == 0) tmp += arr[nr][nc];
}

// dfs 진행
dfs(pos + 1, sum + tmp);

// 원상복구
for(int k = 0; k < 3; k++) {
int nr = r + dir[d][k][0];
int nc = c + dir[d][k][1];

v[nr][nc] = false;
}
}
}

static boolean check(int r, int c) {
return r >= 0 && r < N && c >= 0 && c < M;
}

static void initInput() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());

arr = new int[N][M];
v = new boolean[N][M];

for(int r = 0; r < N; r++) {
st = new StringTokenizer(br.readLine());

for(int c = 0; c < M; c++) arr[r][c] = Integer.parseInt(st.nextToken());
}
}
}
Loading