Skip to content

Commit ff5c9de

Browse files
Merge pull request #34 from icegosimperson/main
[3주차] 이혜원
2 parents 0cc5091 + fe52a21 commit ff5c9de

12 files changed

+366
-0
lines changed

BOJ/10001-15000번/HW_13335.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// 시간 복잡도 : n, L <= 1,000 단순 구현 고려x
2+
// 모든 트럭들이 다리를 건너는 최단시간 구하기
3+
// 사용할 자료구조 : 큐 (먼저온 트럭이 먼저 나감),
4+
import java.util.*;
5+
import java.io.*;
6+
public class HW_13335 {
7+
public static void main(String[] args) throws IOException{
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
StringTokenizer st = new StringTokenizer(br.readLine());
10+
11+
int n = Integer.parseInt(st.nextToken()); // 트럭의 수
12+
int w = Integer.parseInt(st.nextToken()); // 다리의 길이
13+
int L = Integer.parseInt(st.nextToken()); // 다리의 최대 하중
14+
15+
// 반복문을 어떻게 작성하지?
16+
st = new StringTokenizer(br.readLine());
17+
Queue<Integer> trucks = new LinkedList<>(); // 대기 중인 트럭 큐
18+
for(int i=0; i<n; i++){
19+
trucks.add(Integer.parseInt(st.nextToken())); // 입력 받음
20+
}
21+
22+
Queue<Integer> bridge = new LinkedList<>(); // 다리위 트럭들 큐
23+
for(int i=0; i<w; i++){
24+
bridge.add(0); // 처음에는 다리위에 트럭이 없기 때문에 0으로 초기화
25+
}
26+
27+
int cnt =0; // 다리 건너는 시간
28+
int weightBridge = 0; // 현재 다리 무게
29+
30+
while (!bridge.isEmpty()) { // 다리 큐가 빌 때까지 반복
31+
cnt++; // 소요 시간++
32+
weightBridge -= bridge.poll(); // 트럭이 다리에서 내릴 때 (현재 다리 무게) - (다리 위 트럭 무게)
33+
if(!trucks.isEmpty()){ // 트럭 큐가 빌 때가지 반복
34+
if(trucks.peek() + weightBridge <= L){ // (현재 트럭 무게) + (현재 다리 무게) <= (다리 하중)
35+
weightBridge += trucks.peek(); // 트럭이 다리 위에 있음 (다리 무게) + (현재 트럭 무게)
36+
bridge.add(trucks.poll()); // 트럭 무게를 다리에 추가
37+
} else{
38+
bridge.add(0); // L(다리 하중)보다 클 경우 트럭을 추가 하지않음
39+
}
40+
}
41+
}
42+
System.out.println(cnt);
43+
}
44+
}
45+

BOJ/15001-20000번/HW_15989.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import java.io.*;
2+
// 시간 복잡도 : n<=10,000, O(N)
3+
// n을 1, 2, 3의 합으로 나타내는 방법
4+
public class HW_15989 {
5+
public static void main(String[] args) throws IOException{
6+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
int dp[] = new int[10001];
8+
dp[0] =1; // 초기값 선언
9+
10+
for(int i=1; i<=3; i++) {
11+
for(int j=i; j<10001; j++) {
12+
dp[j] += dp[j-i];
13+
}
14+
}
15+
16+
int T = Integer.parseInt(br.readLine()); // 테스트 케이스 개수 T
17+
for(int i=0; i<T; i++) {
18+
int N = Integer.parseInt(br.readLine());
19+
System.out.println(dp[N]);
20+
}
21+
br.close();
22+
}
23+
}

BOJ/15001-20000번/HW_18404.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.*;
5+
6+
// 시간 복잡도 : O(V+E)
7+
// 각 상대편 말을 잡기 위한 나이트의 최소 이동 수
8+
// BFS
9+
public class HW_18404 {
10+
static int N, M, X, Y;
11+
static int[] dx = {-2, -2, -1, -1, 1, 1, 2, 2};
12+
static int[] dy = {-1, 1, -2, 2, -2, 2, -1, 1};
13+
static int[][] visited;
14+
public static void main(String[] args) throws IOException {
15+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
16+
StringTokenizer st = new StringTokenizer(br.readLine());
17+
StringBuilder sb = new StringBuilder();
18+
// 각 상대편 말을 잡기 위한 최소 이동 수
19+
N = Integer.parseInt(st.nextToken()); // N * N
20+
M = Integer.parseInt(st.nextToken()); // 상대편 말의 개수
21+
22+
st = new StringTokenizer(br.readLine());
23+
X = Integer.parseInt(st.nextToken()); // 나이트의 위치 X
24+
Y = Integer.parseInt(st.nextToken()); // 나이트의 위치 Y
25+
26+
visited = new int[N + 1][N + 1];
27+
28+
for(int i=1; i<N+1; i++){
29+
Arrays.fill(visited[i], -1); // 카운트 및 방문여부 체크를 위한 초기화
30+
}
31+
Bfs();
32+
// 상대편 말의 위치 (A, B)
33+
for(int i=0; i<M; i++){
34+
st = new StringTokenizer(br.readLine());
35+
int A = Integer.parseInt(st.nextToken());
36+
int B = Integer.parseInt(st.nextToken());
37+
sb.append(visited[A][B]).append(' ');
38+
}
39+
System.out.println(sb.toString());
40+
}
41+
private static void Bfs(){
42+
Queue<Integer> queue = new LinkedList<>();
43+
queue.add(X);
44+
queue.add(Y);
45+
visited[X][Y] = 0;
46+
47+
while(!queue.isEmpty()){
48+
int X = queue.poll();
49+
int Y = queue.poll();
50+
for(int i=0; i<8; i++){
51+
int nX = X + dx[i];
52+
int nY = Y + dy[i];
53+
if(nX < 1 || nY < 1 || nX > N || nY >N){
54+
continue;
55+
}
56+
if(visited[nX][nY] != -1) {
57+
continue;
58+
}
59+
visited[nX][nY] = visited[X][Y] + 1;
60+
queue.add(nX);
61+
queue.add(nY);
62+
}
63+
}
64+
}
65+
}
66+
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// 시간 제한 : 2초,
2+
// 버그를 고치기 위해 필요한 메모리 유실선 개수의 최솟값 출력
3+
import java.io.*;
4+
import java.util.*;
5+
public class HW_디버깅 {
6+
private static int n, m, h, answer;
7+
private static int[][] map;
8+
private static boolean finish = false; // 최소한의 가로선을 찾았는지 여부
9+
public static void main(String[] args) throws Exception {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
StringTokenizer st = new StringTokenizer(br.readLine());
12+
13+
n = Integer.parseInt(st.nextToken()); // 고객 수
14+
m = Integer.parseInt(st.nextToken()); // 취약 지점
15+
h = Integer.parseInt(st.nextToken()); // 메모리 유실선
16+
17+
map = new int[h+1][n+1]; // h x n 행렬
18+
int a, b;
19+
20+
for(int i=0; i<m; i++){
21+
st = new StringTokenizer(br.readLine()); // 독립적인 좌표 정보
22+
a = Integer.parseInt(st.nextToken()); // 취약 지점
23+
b = Integer.parseInt(st.nextToken()); // 메모리 유실이 일어난 지점
24+
map[a][b] = 1; // 사다리 오른쪽 이동 가능
25+
map[a][b+1] = 2; // 사다리 왼쪽 이동 가능 (오른쪽으로 이동한 상태이므로 2로 표현)
26+
}
27+
28+
for(int i=0; i<=3; i++){ // 필요한 선의 개수가 3보다 큰 값이거나
29+
answer = i;
30+
dfs(1, 0);
31+
if (finish) break;
32+
}
33+
System.out.println((finish) ? answer : -1); // 버그를 고치는 것이 불가능하다면 -1을 출력
34+
}
35+
36+
private static void dfs(int a, int count){
37+
if(finish) return;
38+
if(answer ==count){
39+
if(check()) finish = true;
40+
return;
41+
}
42+
for(int i=a; i<h+1; i++){
43+
for(int j=1; j<n; j++){
44+
if(map[i][j]==0 && map[i][j+1]==0){ // 가로선이 추가되지 않았으면
45+
map[i][j] =1; // 오른쪽 이동
46+
map[i][j+1] = 2; // 왼쪽 이동
47+
dfs(i, count+1); // 가로선 하나 추가 -> 재귀 호출
48+
map[i][j] = map[i][j+1] =0; // 백트래킹 : 가로선 제거
49+
}
50+
}
51+
}
52+
}
53+
54+
private static boolean check(){ // 제대로 이동할 수 있는지 확인
55+
for(int i=1; i<=n; i++){ // 모든 고객에 대해 검사
56+
int a=1, b=i;
57+
while (a <= h) { // 취약 지점의 끝까지 내려가면서 이동
58+
if (map[a][b] == 1) { // 오른쪽으로 이동하는 경우
59+
b++;
60+
} else if (map[a][b] == 2) { // 왼쪽으로 이동하는 경우
61+
b--;
62+
}
63+
a++; // 아래로 한 칸 이동
64+
}
65+
if(b!=i) return false; // 출발위치 != 도착위치
66+
}
67+
return true; // 출발위치 = 도착 위치
68+
}
69+
}
70+
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
// 시간 복잡도 : 단순 구현
2+
// m년 이후 남아있는 리브로수의 총 높이의 합
3+
import java.util.*;
4+
import java.io.*;
5+
public class Main {
6+
static int N, M;
7+
static int[][] map;
8+
static int[] dx = {0, -1, -1, -1, 0, 1, 1, 1};
9+
static int[] dy = {1, 1, 0, -1, -1, -1, 0, 1};
10+
static boolean[][] visited;
11+
static int sum; // m년 이후 남아있는 리브로수의 총 높이의 합
12+
public static void main(String[] args) throws IOException{
13+
// 여기에 코드를 작성해주세요.
14+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
15+
StringTokenizer st = new StringTokenizer(br.readLine());
16+
17+
N = Integer.parseInt(st.nextToken()); // 격자의 크기 N
18+
M = Integer.parseInt(st.nextToken()); // 리브로수를 키우는 총 년 수 m
19+
map = new int[N][N];
20+
21+
// 원소 입력 받기
22+
for(int i=0; i<N; i++){
23+
st = new StringTokenizer(br.readLine());
24+
for(int j=0; j<N; j++){
25+
map[i][j] = Integer.parseInt(st.nextToken());
26+
}
27+
}
28+
29+
visited = new boolean[N][N];
30+
// 초기 영양제 위치 (N-1, 0), (N-1, 1), (N-2, 0), (N-2, 1)
31+
visited[N-1][0] = visited[N-1][1] = visited[N-2][0] = visited[N-2][1] = true;
32+
33+
for(int i=0; i<M; i++){
34+
st = new StringTokenizer(br.readLine());
35+
int d = Integer.parseInt(st.nextToken()); // 이동 방향
36+
int p = Integer.parseInt(st.nextToken()); // 이동 칸 수
37+
38+
simulation(d-1, p%N); // 인덱스, 격좌 범위 처리
39+
}
40+
41+
sum =0;
42+
for(int i=0; i<N; i++){
43+
for(int j=0; j<N; j++){
44+
sum += map[i][j];
45+
}
46+
}
47+
System.out.println(sum);
48+
}
49+
50+
public static void simulation(int direction, int pace){
51+
boolean[][] check = new boolean[N][N];
52+
for(int i=0; i<N; i++){
53+
for(int j=0; j<N; j++){
54+
if(visited[i][j]){
55+
int nx = (i + dx[direction] * pace + N) % N;
56+
int ny = (j + dy[direction] * pace + N) % N;
57+
check[nx][ny] = true;
58+
map[nx][ny]++;
59+
}
60+
}
61+
}
62+
visited = check;
63+
64+
// 대각선 체크
65+
for(int i=0; i<N; i++){
66+
for (int j=0; j<N; j++){
67+
if(visited[i][j]){
68+
for(int d=1; d<8; d+=2){ // 대각선 방향 체크(1, 3, 5, 7)
69+
int nx = i + dx[d];
70+
int ny = j + dy[d];
71+
if(nx<0 || ny <0 || nx >=N || ny >= N){
72+
continue;
73+
}
74+
if(map[nx][ny]>0){ // 대각선에 있으면 ++
75+
map[i][j]++;
76+
}
77+
}
78+
}
79+
}
80+
}
81+
82+
// 높이가 2이상인 리브로수는 잘라냄
83+
for(int i=0; i<N; i++){
84+
for(int j=0; j<N; j++){
85+
if(visited[i][j]){
86+
visited[i][j] = false; // 기존 영양제 없앰
87+
}
88+
else if(map[i][j] >=2){ // 높이가 2이상인 리브로수는 잘라냄
89+
map[i][j] -= 2;
90+
visited[i][j] = true; // 새로운 영양제 배치
91+
}
92+
}
93+
}
94+
}
95+
}

Programmers/Level4/HW_43236.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// 시간 복잡도 : N=100,000, O(N^2) 불가
2+
// O(100,000 log100,000) = O(M logN)
3+
// 사용할 자료구조 : 이분 탐색
4+
5+
import java.io.*;
6+
import java.util.Arrays;
7+
import java.util.StringTokenizer;
8+
9+
public class HW_43236 {
10+
public static void main(String[] args) throws IOException{
11+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
12+
int N = Integer.parseInt(br.readLine());
13+
int[] nArr = new int[N];
14+
15+
StringTokenizer st = new StringTokenizer(br.readLine());
16+
for(int i=0; i<N; i++){
17+
nArr[i] = Integer.parseInt(st.nextToken());
18+
}
19+
20+
Arrays.sort(nArr);// 오름차순 정렬 O(nlog n)
21+
22+
int M = Integer.parseInt(br.readLine());
23+
st = new StringTokenizer(br.readLine());
24+
for(int i=0; i<M; i++){
25+
int target = Integer.parseInt(st.nextToken());
26+
int start = 0;
27+
int end = N -1;
28+
boolean find = false;
29+
while(start <= end){
30+
int mid = (start + end) / 2;
31+
int midIndex = nArr[mid];
32+
if(midIndex > target){
33+
end = mid -1;
34+
}
35+
else if(midIndex < target){
36+
start = mid + 1;
37+
}
38+
else{
39+
find = true;
40+
break;
41+
}
42+
}
43+
if(find){
44+
System.out.println(1);
45+
}
46+
else System.out.println(0);
47+
}
48+
49+
// low, high, target을 mArr 원소로
50+
}
51+
}
52+

0 commit comments

Comments
 (0)