Skip to content

Commit ab061b4

Browse files
authored
Merge pull request #90 from Jewan1120/main
[7주차] 백제완
2 parents bcea483 + 780bff2 commit ab061b4

File tree

9 files changed

+348
-0
lines changed

9 files changed

+348
-0
lines changed

BOJ/1000-5000번/JW_1535.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
public class Main {
2+
3+
public static void main(String[] args) throws Exception {
4+
int n = read();
5+
int[] cost = new int[n];
6+
for (int i = 0; i < n; i++)
7+
cost[i] = read();
8+
int[] get = new int[n];
9+
for (int i = 0; i < n; i++)
10+
get[i] = read();
11+
int[] dp = new int[100];
12+
// 중복 선택이 불가능한 0-1 Knapsack
13+
for (int i = 0; i < n; i++) {
14+
for (int j = 99; j >= cost[i]; j--) {
15+
dp[j] = Math.max(dp[j], dp[j - cost[i]] + get[i]);
16+
}
17+
}
18+
System.out.println(dp[99]);
19+
}
20+
21+
private static int read() throws Exception {
22+
int c, n = System.in.read() & 15;
23+
while ((c = System.in.read()) >= 48)
24+
n = (n << 3) + (n << 1) + (c & 15);
25+
if (c == 13)
26+
System.in.read();
27+
return n;
28+
}
29+
}

BOJ/1000-5000번/JW_2073.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
public class Main {
2+
3+
public static void main(String[] args) throws Exception {
4+
int d = read(), p = read();
5+
int[] length = new int[p];
6+
int[] width = new int[p];
7+
for (int i = 0; i < p; i++) {
8+
length[i] = read();
9+
width[i] = read();
10+
}
11+
int[] dp = new int[d + 1];
12+
dp[0] = Integer.MAX_VALUE; // 최솟값을 찾기 위해 첫 시작은 최대로 초기화
13+
// 중복 선택이 불가능한 0-1 Knapsack
14+
for (int i = 0; i < p; i++) {
15+
for (int j = d; j >= length[i]; j--) {
16+
// j길이를 만들었을 때 가질 수 있는 파이프의 최대 넓이
17+
dp[j] = Math.max(dp[j], Math.min(dp[j - length[i]], width[i]));
18+
}
19+
}
20+
System.out.println(dp[d]);
21+
}
22+
23+
private static int read() throws Exception {
24+
int c, n = System.in.read() & 15;
25+
while ((c = System.in.read()) >= 48)
26+
n = (n << 3) + (n << 1) + (c & 15);
27+
if (c == 13)
28+
System.in.read();
29+
return n;
30+
}
31+
}

BOJ/20001-25000번/JW_21939.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.util.HashMap;
4+
import java.util.StringTokenizer;
5+
import java.util.TreeSet;
6+
7+
public class BOJ410 {
8+
9+
static class Problem {
10+
int num, level;
11+
12+
Problem(int num, int level) {
13+
this.num = num;
14+
this.level = level;
15+
}
16+
}
17+
18+
public static void main(String[] args) throws Exception {
19+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
20+
int n = Integer.parseInt(br.readLine());
21+
// 문제 레벨과 번호로 정렬해서 저장할 트리 맵
22+
TreeSet<Problem> ts = new TreeSet<>((o1, o2) -> o1.level != o2.level ? o1.level - o2.level : o1.num - o2.num);
23+
// 현재 트리 맵에 어떤 정보가 저장되어 있는지 알려줄 해시 맵
24+
HashMap<Integer, Integer> hm = new HashMap<>();
25+
StringTokenizer st;
26+
for (int i = 0; i < n; i++) {
27+
st = new StringTokenizer(br.readLine());
28+
int p = Integer.parseInt(st.nextToken());
29+
int l = Integer.parseInt(st.nextToken());
30+
Problem problem = new Problem(p, l);
31+
ts.add(problem);
32+
hm.put(p, l);
33+
}
34+
StringBuilder sb = new StringBuilder();
35+
int m = Integer.parseInt(br.readLine());
36+
while (m-- > 0) {
37+
st = new StringTokenizer(br.readLine());
38+
String oper = st.nextToken();
39+
int p = Integer.parseInt(st.nextToken());
40+
int l;
41+
// 명령어 처리
42+
switch (oper) {
43+
case "recommend":
44+
if (p == 1)
45+
sb.append(ts.last().num); // 가장 끝에 있는 문제
46+
else
47+
sb.append(ts.first().num); // 처음에 있는 문제
48+
sb.append("\n");
49+
break;
50+
case "add":
51+
l = Integer.parseInt(st.nextToken()); // 문제 난이도
52+
ts.add(new Problem(p, l)); // 현재 가지고 있는 문제 트리 맵에 입력
53+
hm.put(p, l); // 가지고 있는 문제를 조회하기 위한 해시 맵에 입력
54+
break;
55+
case "solved":
56+
l = hm.get(p); // 해당 문제의 난이도를 가져옴
57+
Problem problem = new Problem(p, l);
58+
ts.remove(problem); // 만들어진 오브젝트와 동일한 객체가 있다면 제거
59+
hm.remove(p); // 맵에서도 제거
60+
break;
61+
}
62+
}
63+
System.out.println(sb);
64+
}
65+
}

BOJ/5001-10000번/JW_5021.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.util.HashMap;
4+
import java.util.StringTokenizer;
5+
6+
public class Main {
7+
8+
static HashMap<String, String[]> tree = new HashMap<>(); // 가계도
9+
static HashMap<String, Double> bloodMap = new HashMap<>(); // 혈통
10+
11+
public static void main(String[] args) throws Exception {
12+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13+
StringTokenizer st = new StringTokenizer(br.readLine());
14+
int n = Integer.parseInt(st.nextToken());
15+
int m = Integer.parseInt(st.nextToken());
16+
// 트리 구조 생성
17+
String root = br.readLine();
18+
bloodMap.put(root, 1D);
19+
for (int i = 0; i < n; i++) {
20+
st = new StringTokenizer(br.readLine());
21+
String child = st.nextToken();
22+
String parent1 = st.nextToken();
23+
String parent2 = st.nextToken();
24+
tree.put(child, new String[] { parent1, parent2 });
25+
bloodMap.put(child, 0D);
26+
bloodMap.putIfAbsent(parent1, 0D);
27+
bloodMap.putIfAbsent(parent2, 0D);
28+
}
29+
String answer = "";
30+
double maxBlood = 0;
31+
while (m-- > 0) {
32+
String name = br.readLine();
33+
double blood = recursive(name); // 재귀로 타겟의 혈통의 값을 찾아주기
34+
if (blood > maxBlood) {
35+
answer = name;
36+
maxBlood = blood;
37+
}
38+
}
39+
System.out.println(answer);
40+
}
41+
42+
// 트리에서의 DP
43+
private static double recursive(String person) {
44+
// 미리 계산된 값이 있다면 반환 -> 메모이제이션
45+
if (bloodMap.containsKey(person) && bloodMap.get(person) > 0) {
46+
return bloodMap.get(person);
47+
}
48+
// 외부인일 경우 0을 반환
49+
if (!tree.containsKey(person)) {
50+
return 0;
51+
}
52+
String[] parents = tree.get(person);
53+
double parent1Blood = recursive(parents[0]) / 2.0; // 부모의 혈통 정보의 절반
54+
double parent2Blood = recursive(parents[1]) / 2.0; // 부모의 혈통 정보의 절반
55+
56+
double personBlood = parent1Blood + parent2Blood; // 둘의 혈통을 합친 것이 타겟의 혈통
57+
bloodMap.replace(person, personBlood); // 메모이제이션
58+
return personBlood;
59+
}
60+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.util.StringTokenizer;
4+
5+
public class Main {
6+
7+
static int n, m, t, p; // 세로, 가로, 시간, 시공의 돌풍의 위치
8+
// 윗 부분 회전에 맞추기 위해
9+
// 우 -> 상 -> 좌 -> 하
10+
// 순으로 변화량을 저장
11+
static int[] dy = { 0, -1, 0, 1 };
12+
static int[] dx = { 1, 0, -1, 0 };
13+
static int[][] board;
14+
15+
public static void main(String[] args) throws Exception {
16+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
17+
StringTokenizer st = new StringTokenizer(br.readLine());
18+
n = Integer.parseInt(st.nextToken());
19+
m = Integer.parseInt(st.nextToken());
20+
t = Integer.parseInt(st.nextToken());
21+
board = new int[n][m];
22+
for (int i = 0; i < n; i++) {
23+
st = new StringTokenizer(br.readLine());
24+
for (int j = 0; j < m; j++)
25+
board[i][j] = Integer.parseInt(st.nextToken());
26+
// 마지막 시공의 돌풍의 y좌표
27+
if (board[i][0] == -1)
28+
p = i;
29+
}
30+
// 시간만큼 시뮬레이션
31+
while (t-- > 0) {
32+
spread(); // 확산
33+
rotate(p - 1, 1); // 윗 부분 회전
34+
rotate(p , -1); // 아랫 부분 회전
35+
}
36+
System.out.println(calculate()); // 방 안의 먼지의 총합 계산
37+
}
38+
39+
private static void spread() {
40+
int[][] tempBoard = new int[n][m]; // 확산되는 양을 저장할 새로운 배열
41+
for (int i = 0; i < n; i++)
42+
for (int j = 0; j < m; j++)
43+
if (board[i][j] > 0) {
44+
int amount = board[i][j] / 5; // 확산될 양
45+
for (int k = 0; k < 4; k++) {
46+
int y = i + dy[k];
47+
int x = j + dx[k];
48+
// 유효한 좌표라면 확산
49+
if (isValid(y, x) && board[y][x] != -1) {
50+
tempBoard[i][j] -= amount; // 확산시킨 곳의 양은 감소
51+
tempBoard[y][x] += amount; // 확산된 곳의 양은 증가
52+
}
53+
}
54+
}
55+
// 원래 방에서 확산으로 인한 변화량을 더해줌
56+
for (int i = 0; i < n; i++)
57+
for (int j = 0; j < m; j++)
58+
board[i][j] += tempBoard[i][j];
59+
}
60+
61+
/*
62+
* @param s: 시공의 돌풍의 y좌표
63+
* @param mode: 윗 회전인지 아랫 회전인지 알려주는 변수
64+
*
65+
* mode에 따라서 회전하는 방향이 결정됨
66+
*/
67+
private static void rotate(int s, int mode) {
68+
int prev = 0; // 이전 값
69+
int dir = 0;
70+
int y = s, x = 1;
71+
// 시공의 돌풍으로 돌아올 때까지 반복
72+
while (!(y == s && x == 0)) {
73+
int temp = board[y][x]; // 원래 값 기억
74+
board[y][x] = prev; // 다음 좌표를 이전 값으로 갱신
75+
prev = temp; // 이전 값을 원래 값으로 갱신
76+
int ny = y + dy[dir];
77+
int nx = x + dx[dir];
78+
// 다음 좌표가 경계를 벗어난다면
79+
if (!isValid(ny, nx)) {
80+
// 방향 재설정
81+
dir = (dir + mode + 4) % 4;
82+
ny = y + dy[dir];
83+
nx = x + dx[dir];
84+
}
85+
// 다음 좌표 결정
86+
y = ny;
87+
x = nx;
88+
}
89+
}
90+
91+
// 방 안의 먼지의 총합을 계산
92+
private static int calculate() {
93+
// 시공의 돌풍이 -1이므로 전처리
94+
int sum = 2;
95+
for (int i = 0; i < n; i++)
96+
for (int j = 0; j < m; j++)
97+
sum += board[i][j];
98+
return sum;
99+
}
100+
101+
// 경계 체크
102+
private static boolean isValid(int y, int x) {
103+
return 0 <= y && y < n && 0 <= x && x < m;
104+
}
105+
}

Programmers/Level2/JW_49993.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution {
2+
public int solution(String skill, String[] skill_trees) {
3+
int answer = 0;
4+
String regex = "[^" + skill + "]"; // 스킬 순서 외의 문자를 지우기 위한 정규표현식
5+
for (String skill_tree : skill_trees)
6+
// 문자를 지웠을 때, 남은 문자가 스킬 순서와 일치할 때
7+
if (skill.indexOf(skill_tree.replaceAll(regex, "")) == 0)
8+
answer++;
9+
return answer;
10+
}
11+
}

Programmers/Level3/JW_12938.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int[] solution(int n, int s) {
3+
int[] answer = new int[n];
4+
// 1로만 이루어진 집합으로도 만들 수 없을 경우 -1 리턴
5+
if (n > s)
6+
return new int[] { -1 };
7+
// 오름차순으로 정렬하기 위해 뒤에서 부터 값 설정
8+
for (int i = n - 1; i >= 0; i--) {
9+
// 마지막 위치에 만들 수 있는 최댓값 설정
10+
answer[i] = s / n;
11+
// 나머지가 존재한다면 +1
12+
if (s % n != 0)
13+
answer[i]++;
14+
// n과 s값 변경
15+
n--;
16+
s -= answer[i];
17+
}
18+
return answer;
19+
}
20+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
SELECT
2+
MAX(num) num
3+
FROM
4+
(SELECT
5+
num
6+
FROM
7+
MyNumbers
8+
GROUP BY
9+
num
10+
HAVING
11+
COUNT(num) = 1) temp
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
SELECT
2+
product_id
3+
, year `first_year`
4+
, quantity
5+
, price
6+
FROM
7+
Sales
8+
WHERE (product_id, year) in (
9+
SELECT
10+
product_id
11+
, MIN(year) min_Year
12+
FROM
13+
Sales
14+
GROUP BY
15+
product_id
16+
)

0 commit comments

Comments
 (0)