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 cb2d54f

Browse files
authored
Merge pull request #224 from Jewan1120/main
[16주차] 백제완
2 parents 9d9c993 + 66db847 commit cb2d54f

File tree

6 files changed

+392
-0
lines changed

6 files changed

+392
-0
lines changed

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

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import java.util.PriorityQueue;
2+
import java.util.TreeMap;
3+
4+
public class JW_2258 {
5+
6+
public static void main(String[] args) throws Exception {
7+
int n = read(), m = read();
8+
TreeMap<Integer, Integer> tm = new TreeMap<>(); // 누적합을 저장할 맵
9+
TreeMap<Integer, PriorityQueue<Integer>> pq = new TreeMap<>(); // 각 가격 별로 살 수 있는 고기
10+
for (int i = 0; i < n; i++) {
11+
int amount = read(), cost = read();
12+
pq.putIfAbsent(cost, new PriorityQueue<>((o1, o2) -> o2 - o1)); // 내림차 순으로 정렬
13+
pq.get(cost).add(amount);
14+
tm.put(cost, tm.getOrDefault(cost, 0) + amount); // 누적합 계산
15+
}
16+
// 사려는 가격보다 작은 가격들은 덤으로 받을 수 있기 때문에 누적합에 더해줌
17+
for (int cost : tm.keySet())
18+
// 현재 가격보다 높은 가격이 있다면
19+
if (tm.higherKey(cost) != null)
20+
// 해당 누적합에 현재까지의 누적합을 합
21+
tm.put(tm.higherKey(cost), tm.get(tm.higherKey(cost)) + tm.get(cost));
22+
// 마지막 누적합으로도 조건을 만족할 수 없다면 -1 출력
23+
if (tm.get(tm.lastKey()) < m) {
24+
System.out.println(-1);
25+
return;
26+
}
27+
int min = Integer.MAX_VALUE;
28+
// 적은 가격과 무거운 덩어리부터 그리디하게 탐색
29+
for (int cost : pq.keySet()) {
30+
PriorityQueue<Integer> meat = pq.get(cost);
31+
int needs = m;
32+
if (tm.lowerKey(cost) != null)
33+
needs -= tm.get(tm.lowerKey(cost)); // 누적합을 가져와 구해야하는 무게에서 뺌
34+
int cnt = 0; // 현재 금액에서 사야하는 고기의 수
35+
while (!meat.isEmpty()) {
36+
needs -= meat.poll();
37+
cnt++;
38+
if (needs <= 0) {
39+
min = Math.min(min, cost * cnt); // 구매한 고기들의 수와 가격으로 비교
40+
break; // 더 이상 탐색하지 않아도 되기 때문에 해당 금액 종료
41+
}
42+
}
43+
}
44+
System.out.println(min);
45+
}
46+
47+
private static int read() throws Exception {
48+
int c, n = System.in.read() & 15;
49+
while ((c = System.in.read()) >= 48)
50+
n = (n << 3) + (n << 1) + (c & 15);
51+
if (c == 13)
52+
System.in.read();
53+
return n;
54+
}
55+
}

‎BOJ/20001-25000번/JW_20002.java‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
public class JW_20002 {
2+
3+
public static void main(String[] args) throws Exception {
4+
int n = read();
5+
int maxArea = Integer.MIN_VALUE;
6+
int[][] dp = new int[n + 1][n + 1]; // 누적합 배열
7+
for (int i = 1; i < n + 1; i++)
8+
for (int j = 1; j < n + 1; j++)
9+
dp[i][j] = read() + dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
10+
for (int i = 1; i < n + 1; i++)
11+
for (int j = 1; j < n + 1; j++)
12+
// 정사각형으로 계산하기 위함
13+
for (int k = 0; k < j && k < i; k++) {
14+
int a1 = dp[i - k - 1][j];
15+
int a2 = dp[i][j - k - 1];
16+
int a3 = dp[i - k - 1][j - k - 1]; // 겁치는 영역
17+
maxArea = Math.max(maxArea, dp[i][j] - a1 - a2 + a3);
18+
}
19+
System.out.println(maxArea);
20+
}
21+
22+
private static int read() throws Exception {
23+
int c, n = System.in.read() & 15;
24+
boolean m = n == 13;
25+
if (m)
26+
n = System.in.read() & 15;
27+
while ((c = System.in.read()) >= 48)
28+
n = (n << 3) + (n << 1) + (c & 15);
29+
if (c == 13)
30+
System.in.read();
31+
return m ? ~n + 1 : n;
32+
}
33+
}

‎BOJ/20001-25000번/JW_23326.java‎

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import java.util.TreeSet;
2+
3+
public class JW_23326 {
4+
5+
public static void main(String[] args) throws Exception {
6+
int n = read(), q = read();
7+
TreeSet<Integer> ts = new TreeSet<>(); // 시계(값이 증가) 방향으로 빠른 탐색을 위한 자료 구조
8+
for (int i = 1; i < n + 1; i++)
9+
if (read() == 1) {
10+
ts.add(i);
11+
ts.add(i + n); // 원형이기 때문에 배열 두 개를 합친 것처럼 연산
12+
}
13+
StringBuilder sb = new StringBuilder();
14+
int now = 1; // 첫 시작 위치
15+
while (q-- > 0) {
16+
int oper = read();
17+
int p;
18+
switch (oper) {
19+
case 1:
20+
p = read();
21+
// 값이 존재한다면 해당 값을 삭제
22+
if (ts.contains(p)) {
23+
ts.remove(p);
24+
ts.remove(p + n);
25+
// 존재하지 않는다면 해당 값을 삽입
26+
} else {
27+
ts.add(p);
28+
ts.add(p + n);
29+
}
30+
break;
31+
case 2:
32+
p = read() % n; // 필요 없는 부분 제거
33+
now += p;
34+
// 원형이므로 위치 조정
35+
if (now > n)
36+
now %= n;
37+
break;
38+
case 3:
39+
// 다음 명소까지 움직여야하는 거리 계산
40+
if (ts.isEmpty())
41+
sb.append("-1\n");
42+
else if (ts.contains(now)) {
43+
sb.append("0\n");
44+
} else
45+
sb.append(ts.higher(now) - now).append("\n");
46+
break;
47+
}
48+
}
49+
System.out.println(sb);
50+
}
51+
52+
private static int read() throws Exception {
53+
int c, n = System.in.read() & 15;
54+
while ((c = System.in.read()) >= 48)
55+
n = (n << 3) + (n << 1) + (c & 15);
56+
if (c == 13)
57+
System.in.read();
58+
return n;
59+
}
60+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.util.StringTokenizer;
4+
5+
public class JW_보도블럭 {
6+
7+
static int n, len;
8+
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+
n = Integer.parseInt(st.nextToken());
13+
len = Integer.parseInt(st.nextToken());
14+
int[][] board = new int[n][n];
15+
for (int i = 0; i < n; i++) {
16+
st = new StringTokenizer(br.readLine());
17+
for (int j = 0; j < n; j++)
18+
board[i][j] = Integer.parseInt(st.nextToken());
19+
}
20+
int cnt = 0;
21+
// 행 체크
22+
for (int i = 0; i < n; i++) {
23+
int[] line = new int[n];
24+
for (int j = 0; j < n; j++)
25+
line[j] = board[i][j];
26+
if (isPossible(line))
27+
cnt++;
28+
}
29+
// 열 체크
30+
for (int i = 0; i < n; i++) {
31+
int[] line = new int[n];
32+
for (int j = 0; j < n; j++)
33+
line[j] = board[j][i];
34+
if (isPossible(line))
35+
cnt++;
36+
}
37+
System.out.println(cnt);
38+
}
39+
40+
// 해당 배열에 보도블럭을 설치할 수 있는지 확인하는 함수
41+
private static boolean isPossible(int[] line) {
42+
// 보도블럭을 사용하면 방문 처리하기 위한 배열
43+
boolean[] visited = new boolean[n];
44+
for (int i = 0; i < n - 1; i++) {
45+
int diff = line[i] - line[i + 1];
46+
// 높이가 1을 초과하게 되면 설치할 수 없음
47+
if (Math.abs(diff) > 1)
48+
return false;
49+
if (diff == 1) {
50+
int s = i + 1;
51+
int lv = line[s];
52+
for (int j = 0; j < len; j++) {
53+
// 유효한 범위 / 보도블럭 사용하지 않음 / 같은 높이인지를 체크
54+
if (!isValid(s + j) || visited[s + j] || line[s + j] != lv)
55+
return false;
56+
visited[s + j] = true; // 방문 처리
57+
}
58+
} else if (diff == -1) {
59+
int s = i;
60+
int lv = line[s];
61+
for (int j = 0; j < len; j++) {
62+
if (!isValid(s - j) || visited[s - j] || line[s - j] != lv)
63+
return false;
64+
visited[s - j] = true;
65+
}
66+
}
67+
}
68+
return true;
69+
}
70+
71+
// 경계 체크
72+
private static boolean isValid(int x) {
73+
return 0 <= x && x < n;
74+
}
75+
}

‎Programmers/Level3/JW_131703.java‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
public class JW_131703 {
2+
3+
public static void main(String[] args) {
4+
int[][] beginning = { { 0, 1, 0, 0, 0 }, { 1, 0, 1, 0, 1 }, { 0, 1, 1, 1, 0 }, { 1, 0, 1, 1, 0 },
5+
{ 0, 1, 0, 1, 0 } };
6+
int[][] target = { { 0, 0, 0, 1, 1 }, { 0, 0, 0, 0, 1 }, { 0, 0, 1, 0, 1 }, { 0, 0, 0, 1, 0 },
7+
{ 0, 0, 0, 0, 1 } };
8+
System.out.println(solution(beginning, target));
9+
}
10+
11+
static int n, m;
12+
13+
public static int solution(int[][] beginning, int[][] target) {
14+
n = beginning.length;
15+
m = beginning[0].length;
16+
int min = Integer.MAX_VALUE;
17+
// 만들 수 있는 모든 조합
18+
// row를 뒤집는 경우의 수
19+
for (int i = 0; i < (1 << n); i++) {
20+
// col을 뒤집는 경우의 수
21+
for (int j = 0; j < (1 << m); j++) {
22+
// 해당 뒤집는 경우의 수로 뒤집었을 때, 동일하다면
23+
if (isPossible(beginning, target, i, j)) {
24+
// 뒤집은 횟수
25+
int cnt = Integer.bitCount(i) + Integer.bitCount(j);
26+
min = Math.min(min, cnt); // 최솟값 갱신
27+
}
28+
}
29+
}
30+
return min == Integer.MAX_VALUE ? -1 : min;
31+
}
32+
33+
private static boolean isPossible(int[][] beginning, int[][] target, int row, int col) {
34+
for (int i = 0; i < n; i++)
35+
for (int j = 0; j < m; j++) {
36+
int v = beginning[i][j]; // 뒤집기 전의 값
37+
// 뒤집은 row에 해당한다면
38+
if (((1 << i) & row) != 0) {
39+
v ^= 1; // 뒤집기
40+
}
41+
// 뒤집은 col에 해당한다면
42+
if (((1 << j) & col) != 0) {
43+
v ^= 1; // 뒤집기
44+
}
45+
// 결과가 target의 해당 값과 동일하지 않다면 false 반환
46+
if (target[i][j] != v)
47+
return false;
48+
}
49+
return true;
50+
}
51+
}

0 commit comments

Comments
(0)

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