diff --git "a/BOJ/1000-5000353円262円210円/HW_1613.java" "b/BOJ/1000-5000353円262円210円/HW_1613.java" new file mode 100644 index 00000000..8e1af2ad --- /dev/null +++ "b/BOJ/1000-5000353円262円210円/HW_1613.java" @@ -0,0 +1,44 @@ +import java.io.*; +import java.util.*; + +public class HW_1613 { + public static void main(String[] args) throws IOException{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + int N = Integer.parseInt(st.nextToken()); + int K = Integer.parseInt(st.nextToken()); + + boolean[][] visited = new boolean[N+1][N+1]; // 방문 여부만 확인 + for(int i=0; i 0) { + int lv = Integer.parseInt(st.nextToken()); + if (lv> 0) rotate(lv); + melt(); + } + + // 1. 남아있는 빙하의 총량 계산 + int sum = 0; + for (int i = 0; i < L; i++) { + for (int j = 0; j < L; j++) { + sum += board[i][j]; + } + } + System.out.println(sum); + + // 2. 가장 큰 얼음 군집 크기 계산 + visited = new boolean[L][L]; + max = 0; + for (int i = 0; i < L; i++) { + for (int j = 0; j < L; j++) { + if (!visited[i][j] && board[i][j]> 0) { + max = Math.max(max, bfs(i, j)); + } + } + } + System.out.println(max); + } + + // 초기화 + public static void initialize() { + for (int i = 0; i < L; i++) { + for (int j = 0; j < L; j++) { + nextboard[i][j] = 0; + } + } + } + + + public static void rotate(int level) { + initialize(); // `nextboard` 초기화 + int boxSize = (int) Math.pow(2, level); + int halfSize = (int) Math.pow(2, level - 1); + + for (int i = 0; i < L; i += boxSize) { // 시계 방향 90도 회전 + for (int j = 0; j < L; j += boxSize) { + move(i, j, halfSize, 0); + move(i, j + halfSize, halfSize, 1); + move(i + halfSize, j, halfSize, 2); + move(i + halfSize, j + halfSize, halfSize, 3); + } + } + + for (int i = 0; i < L; i++) { + for (int j = 0; j < L; j++) { + board[i][j] = nextboard[i][j]; // 배열 복사 + } + } + } + + // size`만큼의 하위 격자를 시계 방향으로 회전 + public static void move(int startX, int startY, int size, int dir) { + for (int i = startX; i < startX + size; i++) { + for (int j = startY; j < startY + size; j++) { + int nx = i + dx[dir] * size; + int ny = j + dy[dir] * size; + if (!isValid(nx, ny)) continue; + nextboard[nx][ny] = board[i][j]; + } + } + } + + public static void melt() { + initialize(); + + for (int i = 0; i < L; i++) { + for (int j = 0; j < L; j++) { + if (board[i][j] != 0 && iceCnt(i, j) < 3) { + nextboard[i][j] = board[i][j] - 1; // -1 + } else { + nextboard[i][j] = board[i][j]; + } + } + } + + for (int i = 0; i < L; i++) { + for (int j = 0; j < L; j++) { + board[i][j] = nextboard[i][j]; + } + } + } + + public static int iceCnt(int x, int y) { + int cnt = 0; + for (int d = 0; d < 4; d++) { + int nx = x + dx[d]; + int ny = y + dy[d]; + + if (isValid(nx, ny) && board[nx][ny] != 0) { + cnt++; + } + } + return cnt; + } + + // BFS : 얼음 군집 크기를 계산 + public static int bfs(int x, int y) { + int size = 1; + Queue queue = new LinkedList(); + queue.offer(new int[]{x, y}); + visited[x][y] = true; + + while (!queue.isEmpty()) { + int[] pos = queue.poll(); + + for (int d = 0; d < 4; d++) { + int nx = pos[0] + dx[d]; + int ny = pos[1] + dy[d]; + + if (isValid(nx, ny) && !visited[nx][ny] && board[nx][ny]> 0) { + visited[nx][ny] = true; + queue.offer(new int[]{nx, ny}); + size++; + } + } + } + return size; + } + + public static boolean isValid(int x, int y) { + return x>= 0 && y>= 0 && x < L && y < L; + } +} \ No newline at end of file diff --git a/Programmers/Level2/HW_181188.java b/Programmers/Level2/HW_181188.java new file mode 100644 index 00000000..ee235d65 --- /dev/null +++ b/Programmers/Level2/HW_181188.java @@ -0,0 +1,21 @@ +import java.util.*; +// 구하는 것 : 모든 폭격 미사일을 요격하기 위해 필요한 요격 미사일 수의 최솟값 +class Solution { + public int solution(int[][] targets) { + Arrays.sort(targets, (a, b) -> Integer.compare(a[1], b[1])); // e구간 기준 정렬 + + int cnt = 0; // 요격 미사일 개수 + double endShoot = Integer.MIN_VALUE; // 미사일 쏘는 위치 + + for(int i=0; i answers = new ArrayList(); + + for(int i = 0; i < n; i++){ + grp[i] = i; + } + + StringTokenizer st; + for(int i = 0; i < commands.length; i++){ + st = new StringTokenizer(commands[i]); + int r, c; + String v; + switch(st.nextToken()){ + case "UPDATE" : // UPDATE 추출 + String v1 = st.nextToken(); // v1 추출 + String v2 = st.nextToken(); // v2 추출 + + if(st.hasMoreTokens()){ // 남아있는 토큰이 있는 경우 (UPDATE v1 v2 value) + String value = st.nextToken(); // value 추출 + r = Integer.parseInt(v1) - 1; + c = Integer.parseInt(v2) - 1; + values[find(r * 50 + c)] = value; + } + else{ // UPDATE v1 v2 + for(int j = 0; j < n; j++){ + if(values[find(j)] != null && values[find(j)].equals(v1)){ + values[find(j)] = v2; + } + } + } + break; + + case "MERGE" : + int r1 = Integer.parseInt(st.nextToken()) - 1; + int c1 = Integer.parseInt(st.nextToken()) - 1; + int r2 = Integer.parseInt(st.nextToken()) - 1; + int c2 = Integer.parseInt(st.nextToken()) - 1; + + int num1 = r1*50 + c1; + int num2 = r2*50 + c2; + + // 값이 없는 표이 대표가 되지 않게 처리 + if(values[find(num1)] == null && values[find(num2)] != null){ + int temp = num1; + num1 = num2; + num2 = temp; + } + union(num1, num2); // 두 칸 병합 + break; + + case "UNMERGE" : + r = Integer.parseInt(st.nextToken()) - 1; + c = Integer.parseInt(st.nextToken()) - 1; + + int g = find(r*50 +c); // 대표 칸 찾기 + v = values[g]; // 대표 칸의 값을 저장 + + // 경로 압축 + for(int j = 0; j < n; j++){ + find(j); + } + + for(int j = 0; j < n; j++){ + if(find(j) == g){ + grp[j] = j; // 동일한 대표 칸을 가진 경우 초기화 + + if(j == r*50 + c){ + values[j] = v; // 지정된 칸의 값 유지 + }else{ + values[j] = null; // 나머지 칸 초기화 + } + } + } + break; + + case "PRINT" : + r = Integer.parseInt(st.nextToken()) - 1; + c = Integer.parseInt(st.nextToken()) - 1; + + v = values[find(r*50 + c)]; + + if(v == null){ + answers.add("EMPTY"); + } + else answers.add(v); + break; + } + } + String[] answer = new String[answers.size()]; + for(int i = 0; i < answers.size(); i++){ + answer[i] = answers.get(i); + } + return answer; + } + + // 원소가 속한 그룹 알아내기 + static int find(int idx){ + if(idx == grp[idx]){ + return idx; + } + return grp[idx] = find(grp[idx]); + } + + // 그룹 합치기 + static void union(int g1, int g2){ + g1 = find(g1); + g2 = find(g2); + + if(g1 == g2){ + return; + } + values[g2] = null; + grp[g2] = g1; + } +} \ No newline at end of file diff --git a/Programmers/Level3/HW_42884.java b/Programmers/Level3/HW_42884.java new file mode 100644 index 00000000..e1bba9b1 --- /dev/null +++ b/Programmers/Level3/HW_42884.java @@ -0,0 +1,22 @@ +// 모든 차량이 한번은 단속용 카메라를 만나도록하는 최소 카메라 설치 개수 +import java.util.*; +class HW_42884 { + public int solution(int[][] routes) { + Arrays.sort(routes, (a,b) -> Integer.compare(a[1], b[1])); // 나간 지점 기준 정렬 + + // 단속카메라 탐색 + int cnt = 0; // 카메라 개수 + int endCamera= Integer.MIN_VALUE; // 처음엔 카메라 설치X + + for(int i=0; i

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