Skip to content

Commit 368073c

Browse files
authored
Merge pull request #1 from KodaHye/main
[1주차] 고다혜
2 parents 4de59da + 1076216 commit 368073c

File tree

10 files changed

+476
-0
lines changed

10 files changed

+476
-0
lines changed

BOJ/1000-10000번/DH_2531.java

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
public class DH_2531 {
2+
static int N, d, k, c, arr[], eat[];
3+
4+
// 투포인터
5+
// * 조건
6+
// - s ~ e 거리가 k보다 작다면 e += 1
7+
// - s ~ e 거리가 k보다 크거나 같다면 s += 1;
8+
// - s ~ e 거리가 k랑 같다면 초밥 종류의 개수 찾기
9+
static void solution() {
10+
int s = 0, e = 0;
11+
int result = 0;
12+
13+
eat[arr[s]]++;
14+
15+
while(s <= e && s < N) {
16+
if(e - s + 1 < k) {
17+
e++;
18+
int tmpE = e % N;
19+
eat[arr[tmpE]]++;
20+
} else {
21+
eat[arr[s]]--;
22+
s++;
23+
}
24+
25+
if(e - s + 1 == k) result = Math.max(result, getCnt());
26+
}
27+
28+
System.out.println(result);
29+
}
30+
31+
static int getCnt() {
32+
int result = 0;
33+
for(int e: eat) {
34+
if(e == 0) continue;
35+
result += 1;
36+
}
37+
38+
if(eat[c] == 0) result += 1;
39+
return result;
40+
}
41+
42+
public static void main(String[] args) throws Exception {
43+
44+
N = read(); d = read(); k = read(); c = read();
45+
46+
arr = new int[N];
47+
eat = new int[d + 1]; // 초밥의 가지수
48+
49+
for(int i = 0; i < N; i++) arr[i] = read();
50+
51+
solution();
52+
}
53+
54+
static int read() throws Exception {
55+
int c, n = System.in.read() & 15;
56+
while((c = System.in.read()) >= 48)
57+
n = (n << 3) + (n << 1) + (c & 15);
58+
return n;
59+
}
60+
}

BOJ/1000-10000번/DH_3020.java

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import java.util.*;
2+
3+
public class DH_3020 {
4+
// arr1: 석순, arr2: 종유석
5+
static int N, H, min, cnt, arr1[], arr2[];
6+
7+
static void solution() {
8+
9+
// 개똥벌레가 날아다니는 위치를 1부터 H까지 설정하면서
10+
// 부딪히는 석순과 종유석의 개수를 구함
11+
for(int i = 1; i < H + 1; i++) {
12+
// tmp: 높이가 i일 때, 개똥벌레가 부딪히는 (석순 + 종유석) 개수
13+
int tmp = getCnt(arr1, i) + getCnt(arr2, H - i + 1);
14+
15+
if(min == tmp) cnt++;
16+
else if(min > tmp) {
17+
min = tmp;
18+
cnt = 1;
19+
}
20+
}
21+
}
22+
23+
// 정렬된 석순, 종유석에 대해 높이 기준 큰 것들의 개수 구함 (깨질 수 있는 높이)
24+
static int getCnt(int arr[], int height) {
25+
int s = 0, e = arr.length;
26+
27+
while(s < e) {
28+
int m = (s + e) / 2;
29+
30+
if(arr[m] >= height) e = m;
31+
else if(arr[m] < height) s = m + 1;
32+
}
33+
34+
return arr.length - e;
35+
}
36+
public static void main(String[] args) throws Exception {
37+
N = read();
38+
H = read();
39+
40+
arr1 = new int[N >> 1]; // 석순
41+
arr2 = new int[N >> 1]; // 종유석
42+
43+
min = Integer.MAX_VALUE;
44+
45+
for(int i = 0; i < N >> 1; i++) {
46+
int a = read(), b = read();
47+
arr1[i] = a; arr2[i] = b;
48+
}
49+
50+
// 석순과 종유석을 오름차순으로 정렬
51+
Arrays.sort(arr1);
52+
Arrays.sort(arr2);
53+
54+
solution();
55+
System.out.print(min + " " + cnt);
56+
}
57+
58+
59+
static int read() throws Exception {
60+
// System.in.read(): 1byte 크기만 읽어 ASCII 코드에 해당하는 int 값 리턴
61+
// n = System.in.read()일 때, 한글자의 수를 읽으면 48 <= n <58
62+
int c, n = System.in.read() & 15;
63+
64+
// ASCII 코드 48이상인 경우 (0-9의 숫자)
65+
while((c = System.in.read()) >= 48)
66+
n = (n << 3) + (n << 1) + (c & 15);
67+
if(c == 13) // 입력이 Enter일 경우 다음 바이트를 읽어 해당 문자 건너뛰기
68+
System.in.read();
69+
70+
return n;
71+
}
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class DH_자율주행_자동차 {
5+
// 자동차의 위치, 바라보는 방향을 저장하는 클래스
6+
static class Car {
7+
int r, c, d;
8+
public Car(int r, int c, int d) {
9+
this.r = r;
10+
this.c = c;
11+
this.d = d;
12+
}
13+
}
14+
static Car car;
15+
static int dr[] = {-1, 0, 1, 0};
16+
static int dc[] = {0, 1, 0, -1};
17+
// map: 도로와 자동차가 움직인 정보를 가지고 있음
18+
// - 0: 갈 수 있는 도로, 1: 인도, 2: 이미 지나간 도로
19+
// result: 자동차가 움직인 도롤의 총 면적
20+
static int map[][], result = 1;
21+
22+
static void solution() {
23+
map[car.r][car.c] = 2;
24+
25+
while(true) {
26+
// 네 방향을 기준으로 왼쪽으로 갈 수 있는지 확인하하기 위한 변수
27+
int cnt = 0;
28+
// 왼쪽으로 갈 수 있는지 확인
29+
if(!canMoveLeft()) {
30+
// 자동차를 회전시키면서 왼쪽으로 갈 수 있는지 확인
31+
while(cnt++ < 3) if(canMoveLeft()) break;
32+
33+
// cnt가 4라면 모든 방향에 대해 확인해봤지만 갈 수 없는 상황
34+
if(cnt == 4) {
35+
int nr = car.r - dr[car.d];
36+
int nc = car.c - dc[car.d];
37+
38+
updateCarInfo(nr, nc, car.d);
39+
if(!check(nr, nc) || map[nr][nc] == 1) break;
40+
}
41+
}
42+
}
43+
44+
System.out.println(result);
45+
}
46+
47+
// 왼쪽으로 갈 수 있는지 확인
48+
static boolean canMoveLeft() {
49+
int d = (car.d - 1 + 4) % 4;
50+
int nr = car.r + dr[d];
51+
int nc = car.c + dc[d];
52+
53+
car.d = d;
54+
if(!check(nr, nc) || map[nr][nc] != 0) return false;
55+
updateCarInfo(nr, nc, d);
56+
map[nr][nc] = 2;
57+
result++;
58+
59+
return true;
60+
}
61+
62+
// 자동차의 정보 업데이트
63+
static void updateCarInfo(int r, int c, int d) {
64+
car.r = r;
65+
car.c = c;
66+
car.d = d;
67+
}
68+
static boolean check(int r, int c) {
69+
return r >= 0 && r < map.length && c >= 0 && c < map[0].length;
70+
}
71+
public static void main(String[] args) throws Exception {
72+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
73+
StringTokenizer st = new StringTokenizer(br.readLine());
74+
75+
int n = Integer.parseInt(st.nextToken());
76+
int m = Integer.parseInt(st.nextToken());
77+
map = new int[n][m];
78+
79+
st = new StringTokenizer(br.readLine());
80+
int cr = Integer.parseInt(st.nextToken());
81+
int cc = Integer.parseInt(st.nextToken());
82+
int cd = Integer.parseInt(st.nextToken());
83+
84+
car = new Car(cr, cc, cd);
85+
for(int r = 0; r < map.length; r++) {
86+
String s = br.readLine();
87+
for(int c = 0; c < map[0].length; c++) {
88+
map[r][c] = s.charAt(c * 2) - '0';
89+
}
90+
}
91+
92+
solution();
93+
}
94+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class DH_불안한_무빙워크 {
5+
// cnt: 몇 번째 실험인지 저장하는 변수
6+
// arr: 무빙워크의 안정성
7+
static int cnt, N, K, arr[];
8+
// v: 무빙워크에 사람이 있는지 확인
9+
// 어짜피 [0][N - 1] 위치에 가면 사람은 무빙워크에서 내려가기 때문에
10+
// arr의 0번째 행만 고려함 -> v: 1차원 배열
11+
static boolean v[];
12+
13+
static void movePeople() {
14+
for (int i = N - 1; i > 0; i--) {
15+
if(!v[i]) continue;
16+
// 해당 칸에 사람이 있으면서 안정성이 0보다 크다면
17+
// 사람 이동
18+
if(v[i + 1] || arr[i + 1] == 0) continue;
19+
v[i + 1] = true;
20+
v[i] = false;
21+
arr[i + 1]--;
22+
23+
if(arr[i + 1] == 0) cnt++;
24+
}
25+
}
26+
27+
static void moveMovingWalk() {
28+
// 무빙워크 안정성 옆 칸으로 이동
29+
arr[0] = arr[arr.length - 1];
30+
for(int i = arr.length - 1; i > 0; i--) {
31+
arr[i] = arr[i - 1];
32+
}
33+
34+
// 무빙워크 이동할 떄, 무빙워크 위에 있는 사람도 같이 이동
35+
for(int i = v.length - 2; i > 0; i--) v[i + 1] = v[i];
36+
// N 위치에 가면 내림
37+
v[N] = false;
38+
// 첫 번째도 사람이 없어야 됨
39+
v[1] = false;
40+
}
41+
42+
static void addPerson() {
43+
if(arr[1] == 0) return;
44+
v[1] = true;
45+
arr[1]--;
46+
if(arr[1] == 0) cnt++;
47+
}
48+
49+
static void solution() {
50+
int turn = 0;
51+
52+
while(true) {
53+
turn++;
54+
// 무빙워크 이동
55+
moveMovingWalk();
56+
// 사람 이동
57+
movePeople();
58+
// 처음 칸의 안정성 확인 이후 사람 추가
59+
addPerson();
60+
61+
if(cnt >= K) break;
62+
}
63+
64+
System.out.println(turn);
65+
}
66+
public static void main(String[] args) throws Exception {
67+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
68+
StringTokenizer st = new StringTokenizer(br.readLine());
69+
70+
N = Integer.parseInt(st.nextToken());
71+
K = Integer.parseInt(st.nextToken());
72+
73+
arr = new int[2 * N + 1];
74+
v = new boolean[N + 1];
75+
76+
st = new StringTokenizer(br.readLine());
77+
for(int i = 1; i < arr.length; i++) {
78+
arr[i] = Integer.parseInt(st.nextToken());
79+
}
80+
81+
solution();
82+
}
83+
}

Programmers/Level2/DH_132265.java

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package Programmers.Level2;
2+
3+
/*
4+
롤케이크_자르기
5+
*/
6+
7+
class DH_132265 {
8+
9+
public int solution(int[] topping) {
10+
int length = topping.length;
11+
int toppingType = 0, answer = 0;
12+
13+
int cnt[] = new int[10_001];
14+
for(int i = 0; i < length; i++) {
15+
if(cnt[topping[i]] == 0) toppingType++;
16+
cnt[topping[i]]++;
17+
}
18+
19+
int cntA = 0;
20+
boolean check[] = new boolean[10_001];
21+
22+
for(int i = 0; i < length; i++) {
23+
if(!check[topping[i]]) {
24+
cntA++;
25+
check[topping[i]] = true;
26+
}
27+
28+
cnt[topping[i]]--;
29+
if(cnt[topping[i]] == 0) toppingType--;
30+
if(cntA == toppingType) answer++;
31+
}
32+
return answer;
33+
}
34+
}

Programmers/Level2/DH_154539.java

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package Programmers.Level2;
2+
import java.util.*;
3+
4+
/*
5+
뒤에 있는 큰 수 찾기
6+
*/
7+
8+
class DH_154539 {
9+
public int[] solution(int[] numbers) {
10+
11+
int[] answer = new int[numbers.length];
12+
Arrays.fill(answer, - 1);
13+
14+
Stack<Integer> stack = new Stack();
15+
for(int i = numbers.length - 1; i >= 0; i--) {
16+
17+
if(!stack.isEmpty() && numbers[i] >= stack.peek()) {
18+
while(!stack.isEmpty() && numbers[i] >= stack.peek()) {
19+
stack.pop();
20+
}
21+
}
22+
23+
if(!stack.isEmpty()) answer[i] = stack.peek();
24+
stack.push(numbers[i]);
25+
}
26+
27+
return answer;
28+
}
29+
}
30+

0 commit comments

Comments
 (0)