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 90f5175

Browse files
authored
Merge pull request #180 from icegosimperson/main
[13주차] 이혜원
2 parents 89266f1 + 732e309 commit 90f5175

File tree

8 files changed

+402
-0
lines changed

8 files changed

+402
-0
lines changed

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

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import java.util.*;
2+
import java.io.*;
3+
4+
// 미로를 탈출하는데 드는 이동 횟수의 최솟값을 출력
5+
6+
public class HW_1194 {
7+
static int N, M;
8+
static char[][] board;
9+
static boolean[][][] visited; // 방문
10+
static int[] dx = {0, 1, 0, -1};
11+
static int[] dy = {1, 0, -1, 0};
12+
static class Node{
13+
int x, y, key, step;
14+
public Node(int x, int y, int key, int step) {
15+
this.x = x;
16+
this.y = y;
17+
this.key = key;
18+
this.step = step;
19+
}
20+
}
21+
22+
public static void main(String[] args) throws IOException {
23+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
24+
StringTokenizer st = new StringTokenizer(br.readLine());
25+
26+
N = Integer.parseInt(st.nextToken());
27+
M = Integer.parseInt(st.nextToken());
28+
29+
board = new char[N][M];
30+
visited = new boolean[N][M][64];
31+
32+
int startX = 0, startY = 0;
33+
for(int i=0; i<N; i++){
34+
String input = br.readLine();
35+
for(int j=0; j<M; j++){
36+
board[i][j] = input.charAt(j);
37+
if(board[i][j]=='0'){ // 시작 위치
38+
startX = i;
39+
startY = j;
40+
}
41+
}
42+
}
43+
int ans = bfs(startX, startY);
44+
System.out.println(ans);
45+
}
46+
static int bfs(int x, int y){
47+
Queue<Node> queue = new LinkedList<>();
48+
queue.add(new Node(x, y, 0, 0));
49+
visited[x][y][0] = true;
50+
board[x][y] = '.'; // 빈칸: 이동 가능
51+
52+
while(!queue.isEmpty()){
53+
Node cur = queue.poll();
54+
if(board[cur.x][cur.y]=='1'){
55+
return cur.step;
56+
}
57+
for(int i=0; i<4; i++){
58+
int nx = cur.x + dx[i];
59+
int ny = cur.y + dy[i];
60+
int nkey = cur.key;
61+
62+
if(!isValid(nx,ny) || visited[nx][ny][nkey] || board[nx][ny]=='#') {
63+
continue;
64+
}
65+
66+
if ('a' <= board[nx][ny] && board[nx][ny] <= 'f') {
67+
nkey |= (1 << (board[nx][ny] - 'a')); // 새로운 열쇠 획득
68+
}
69+
70+
if ('A' <= board[nx][ny]&& board[nx][ny] <= 'F') {
71+
if ((nkey & (1 << (board[nx][ny] - 'A'))) == 0) {
72+
continue; // 열쇠 없으면 이동 불가
73+
}
74+
}
75+
76+
if (!visited[nx][ny][nkey]) { // 새 열쇠 상태로 방문
77+
queue.add(new Node(nx, ny, nkey, cur.step + 1));
78+
visited[nx][ny][nkey] = true;
79+
}
80+
}
81+
}
82+
return -1;
83+
}
84+
static boolean isValid(int nx, int ny){
85+
return 0<=nx && nx<N && 0<=ny && ny <M;
86+
}
87+
}

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import java.io.*;
2+
import java.util.StringTokenizer;
3+
4+
public class HW_1749 {
5+
public static void main(String[] args) throws IOException {
6+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
StringTokenizer st = new StringTokenizer(br.readLine());
8+
int N = Integer.parseInt(st.nextToken());
9+
int M = Integer.parseInt(st.nextToken());
10+
11+
int[][] board = new int[N+1][M+1];
12+
int[][] dp = new int[N+1][M+1];
13+
for(int i=1; i<=N; i++){
14+
st = new StringTokenizer(br.readLine());
15+
for(int j=1; j<=M; j++){
16+
board[i][j] = Integer.parseInt(st.nextToken());
17+
}
18+
}
19+
20+
for(int i=1; i<=N; i++){
21+
for(int j=1; j<=M; j++){
22+
dp[i][j] = board[i][j] + dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1];
23+
}
24+
}
25+
26+
int max = Integer.MIN_VALUE;
27+
for(int i=1; i<=N; i++){
28+
for(int j=1; j<=M; j++){
29+
for(int r=1; r<=i; r++){ // (r1, c1) ~ (r2, c2)
30+
for(int c=1; c<=j; c++){
31+
max = Math.max(max, dp[i][j]-dp[r-1][j] - dp[i][c-1] + dp[r-1][c-1]);
32+
}
33+
}
34+
}
35+
}
36+
System.out.println(max);
37+
}
38+
}

‎BOJ/5001-10000번/HW_8979.java‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import java.io.*;
2+
import java.util.StringTokenizer;
3+
4+
public class HW_8979 {
5+
public static void main(String[] args) throws IOException {
6+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
StringTokenizer st = new StringTokenizer(br.readLine());
8+
int N = Integer.parseInt(st.nextToken()); // 국가의 수
9+
int K = Integer.parseInt(st.nextToken()); // 등수를 알고 싶은 국가
10+
11+
int[][] board = new int[N+1][3];
12+
13+
for(int i=1; i<=N; i++){
14+
st = new StringTokenizer(br.readLine());
15+
int index = Integer.parseInt(st.nextToken());
16+
board[index][0]= Integer.parseInt(st.nextToken()); // gold
17+
board[index][1] = Integer.parseInt(st.nextToken()); // silver
18+
board[index][2] = Integer.parseInt(st.nextToken()); // bronze
19+
}
20+
21+
int rnk = 1;
22+
for(int i=1; i<=N; i++){
23+
if(i==K) continue; // 자기 자신 건너뛰기
24+
if(board[i][0] > board[K][0]){
25+
rnk++;
26+
} else if(board[i][0] == board[K][0] && board[i][1] > board[K][1]){
27+
rnk++;
28+
} else if(board[i][0] == board[K][0] && board[i][1] == board[K][1] &&board[i][2] > board[K][2]){
29+
rnk++;
30+
}
31+
}
32+
33+
System.out.println(rnk);
34+
}
35+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import java.util.*;
2+
import java.io.*;
3+
4+
public class HW_술래잡기_체스 {
5+
static int[] dx = {-1, -1, 0, 1, 1, 1, 0, -1};
6+
static int[] dy = {0, -1, -1, -1, 0, 1, 1, 1};
7+
static int ans = 0;
8+
9+
static class Node {
10+
int p, d;
11+
Node(int p, int d) {
12+
this.p = p;
13+
this.d = d;
14+
}
15+
}
16+
17+
public static void main(String[] args) throws IOException {
18+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
19+
StringTokenizer st;
20+
21+
Node[][] board = new Node[4][4];
22+
for (int i = 0; i < 4; i++) {
23+
st = new StringTokenizer(br.readLine());
24+
for (int j = 0; j < 4; j++) {
25+
int p = Integer.parseInt(st.nextToken());
26+
int d = Integer.parseInt(st.nextToken()) - 1;
27+
board[i][j] = new Node(p, d);
28+
}
29+
}
30+
31+
int initScore = board[0][0].p;
32+
int initDir = board[0][0].d;
33+
34+
board[0][0] = new Node(0, initDir); // 술래말 초기화
35+
36+
dfs(board, 0, 0, initScore);
37+
System.out.println(ans);
38+
}
39+
40+
static void dfs(Node[][] board, int x, int y, int score) {
41+
ans = Math.max(ans, score); // 점수 갱신
42+
43+
Node[][] copyBoard = copy(board);
44+
find(copyBoard);
45+
46+
Node cur = copyBoard[x][y];
47+
int dir = cur.d;
48+
49+
int nx = x + dx[dir];
50+
int ny = y + dy[dir];
51+
52+
// 도둑말 이동
53+
while (isValid(nx, ny)) {
54+
if (copyBoard[nx][ny] != null) { // 도둑말이 있는 칸만 이동
55+
Node caught = copyBoard[nx][ny];
56+
copyBoard[x][y] = null; // 술래말이 원래 있던 칸 비우기
57+
copyBoard[nx][ny] = new Node(0, caught.d); // 술래말 이동
58+
59+
dfs(copyBoard, nx, ny, score + caught.p); // 재귀
60+
61+
copyBoard[nx][ny] = caught;
62+
copyBoard[x][y] = cur;
63+
}
64+
nx += dx[dir];
65+
ny += dy[dir];
66+
}
67+
}
68+
69+
static void find(Node[][] board) {
70+
for (int k = 1; k <= 16; k++) { // 도둑말 번호 순서대로 탐색
71+
boolean visited = false; // 방문 처리
72+
for (int i = 0; i < 4; i++) {
73+
for (int j = 0; j < 4; j++) {
74+
if (board[i][j] != null && board[i][j].p == k) {
75+
move(board, i, j);
76+
visited = true;
77+
break;
78+
}
79+
}
80+
if(visited) break;
81+
}
82+
}
83+
}
84+
85+
static void move(Node[][] board, int x, int y) {
86+
Node cur = board[x][y];
87+
int d = cur.d;
88+
89+
for (int i = 0; i < 8; i++) {
90+
int nx = x + dx[d];
91+
int ny = y + dy[d];
92+
93+
// 술래말이 있는 칸이나 경계를 벗어나면 이동 불가
94+
if (isValid(nx, ny) && (board[nx][ny] == null || board[nx][ny].p != 0)) {
95+
Node temp = board[nx][ny];
96+
board[nx][ny] = new Node(cur.p, d); // 새 위치로 이동
97+
board[x][y] = temp; // 기존 위치 업데이트
98+
return;
99+
}
100+
d = (d + 1) % 8; // 반시계 방향 45도 회전
101+
}
102+
}
103+
104+
static boolean isValid(int nx, int ny) {
105+
return 0 <= nx && nx < 4 && 0 <= ny && ny < 4;
106+
}
107+
108+
static Node[][] copy(Node[][] board) {
109+
Node[][] tempBoard = new Node[4][4];
110+
for (int i = 0; i < 4; i++) {
111+
for (int j = 0; j < 4; j++) {
112+
if (board[i][j] != null) {
113+
tempBoard[i][j] = new Node(board[i][j].p, board[i][j].d);
114+
}
115+
}
116+
}
117+
return tempBoard;
118+
}
119+
}

‎Programmers/Level2/HW_250135.java‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
class HW_250135 {
2+
public int solution(int h1, int m1, int s1, int h2, int m2, int s2) {
3+
int cnt = 0;
4+
5+
double start = h1 * 3600 + m1 * 60 + s1;
6+
double end = h2 * 3600 + m2 * 60 + s2;
7+
8+
int halfDay = 12 * 3600;
9+
if (start == 0 || start == halfDay)
10+
cnt++;
11+
12+
while (start < end) {
13+
double h = (start / 120) % 360; // 시침
14+
double m = (start / 10) % 360; // 분침
15+
double s = (start * 6) % 360; // 초침
16+
17+
// 다음 시간의 각도 계산
18+
double nextH = ((start + 1) / 120) % 360;
19+
double nextM = ((start + 1) / 10) % 360;
20+
double nextS = ((start + 1) * 6) % 360;
21+
22+
// 360도 -> 0도
23+
if (nextH == 0.0) {
24+
nextH = 360.0;
25+
}
26+
if (nextM == 0.0){
27+
nextM = 360.0;
28+
}
29+
30+
if (nextS == 0.0) {
31+
nextS = 360.0;
32+
}
33+
34+
if (s < h && nextH <= nextS) // 초침 == 시침
35+
cnt++;
36+
37+
if (s < m && nextM <= nextS) // 초침==분침
38+
cnt++;
39+
40+
if (nextH == nextS && nextM == nextS) // 시침,분침==초침
41+
cnt--;
42+
43+
start++;
44+
}
45+
return cnt;
46+
}
47+
}

‎Programmers/Level3/HW_150367.java‎

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import java.util.*;
2+
3+
class HW_150367 {
4+
public int[] solution(long[] numbers) {
5+
int[] result = new int[numbers.length];
6+
7+
for (int i = 0; i < numbers.length; i++) {
8+
String binary = Long.toBinaryString(numbers[i]); // 숫자를 이진수로 변환
9+
String fullBinary = extend(binary); // 포화 이진트리로 확장
10+
result[i] = isValidTree(fullBinary) ? 1 : 0; // 트리 검증
11+
}
12+
return result;
13+
}
14+
15+
// 이진수를 포화 이진트리 형태로 확장
16+
private String extend(String binary) {
17+
int length = binary.length();
18+
int height = 0;
19+
20+
// 포화 이진트리의 노드 개수 계산
21+
while ((1 << height) - 1 < length) {
22+
height++;
23+
}
24+
25+
int fullLength = (1 << height) - 1; // 포화 이진트리 노드 개수
26+
StringBuilder sb = new StringBuilder();
27+
for (int i = 0; i < fullLength - length; i++) {
28+
sb.append("0"); // 앞쪽에 더미 노드 추가
29+
}
30+
sb.append(binary);
31+
return sb.toString();
32+
}
33+
34+
// 트리 검증
35+
private boolean isValidTree(String binary) {
36+
return isValidSubtree(binary, 0, binary.length() - 1);
37+
}
38+
39+
// 서브트리 검증
40+
private boolean isValidSubtree(String binary, int start, int end) {
41+
if (start > end) { // 범위를 벗어나면 유효함
42+
return true;
43+
}
44+
45+
int mid = (start + end) / 2; // 현재 루트 노드
46+
char root = binary.charAt(mid);
47+
48+
// 왼쪽과 오른쪽 서브트리
49+
boolean leftValid = isValidSubtree(binary, start, mid - 1);
50+
boolean rightValid = isValidSubtree(binary, mid + 1, end);
51+
52+
// 루트가 0인데 자식이 1인 경우 규칙 위반
53+
if (root == '0') {
54+
for (int i = start; i <= end; i++) {
55+
if (binary.charAt(i) == '1') {
56+
return false;
57+
}
58+
}
59+
}
60+
return leftValid && rightValid; // 왼쪽, 오른쪽 서브트리 모두 유효 -> 전체 트리 유효
61+
}
62+
}

0 commit comments

Comments
(0)

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