diff --git a/Lv.1/week7_1.java b/Lv.1/week7_1.java new file mode 100644 index 0000000..7d665e7 --- /dev/null +++ b/Lv.1/week7_1.java @@ -0,0 +1,29 @@ +class Solution { + public int solution(int[] nums) { + return dfs(nums, 0, 0, 0); + } + + // depth: 현재 선택한 숫자 개수 + // start: 다음 숫자 index + private int dfs(int[] nums, int depth, int start, int sum) { + if (depth == 3) { + // 합이 소수면 1 + return isPrime(sum) ? 1 : 0; + } + + int count = 0; // 소수 경우의 수 + for (int i = start; i < nums.length; i++) { // 배열 탐색 + count += dfs(nums, depth + 1, i + 1, sum + nums[i]); //+1 재귀 호출, 선택한 숫자 합을 다음 호출에 전달 + } + return count; + } + + // 소수 판별 + private boolean isPrime(int num) { + if (num < 2) return false; + for (int i = 2; i * i <= num; i++) { // 2~ num 제곱근 + if (num % i == 0) return false; // 나누어 떨어지면 소수가 아님 + } + return true; // 소수인 경우 true + } +} diff --git a/Lv.1/week7_2.java b/Lv.1/week7_2.java new file mode 100644 index 0000000..505e322 --- /dev/null +++ b/Lv.1/week7_2.java @@ -0,0 +1,56 @@ +import java.util.*; + +class Solution { + public int[] solution(String[] park, String[] routes) { + int h = park.length; // 공원 height + int w = park[0].length(); // 공원 width + int x = 0, y = 0; // 시작좌표00 + + // 시작 위치 찾기 + for (int i = 0; i < h; i++) { + if (park[i].contains("S")) { // 시작지점이 포함되어잇으면 + x = i; + y = park[i].indexOf("S"); + break; + } + } + + // 방향 벡터 + Map directions = Map.of( + "N", new int[]{-1, 0}, // 북 + "S", new int[]{1, 0}, // 남 + "W", new int[]{0, -1}, // 서 + "E", new int[]{0, 1} // 동 + ); + + for (String route : routes) { + String[] splitRoute = route.split(" "); + String dir = splitRoute[0]; // NSWE + int steps = Integer.parseInt(splitRoute[1]); // 이동할 칸 수 + + int[] move = directions.get(dir); // 방향에 따른 이동량 + int nx = x, ny = y; // 임시 위치 + boolean valid = true; + + // 범위랑 장애물 체크 + for (int i = 0; i < steps; i++) { + nx += move[0]; // 행 갱신 + ny += move[1]; // 열 갱신 + + // 범위 외부거나 장애물이 있는 경우 판별 + if (nx < 0 || nx >= h || ny < 0 || ny >= w || park[nx].charAt(ny) == 'X') { + valid = false; + break; + } + } + + // 유효한 경우 update + if (valid) { + x = nx; + y = ny; + } + } + + return new int[]{x, y}; + } +} diff --git a/Lv.2/week7_3.java b/Lv.2/week7_3.java new file mode 100644 index 0000000..b32a4f8 --- /dev/null +++ b/Lv.2/week7_3.java @@ -0,0 +1,34 @@ +class Solution { + private int[] answer = new int[2]; + + public int[] solution(int[][] arr) { + compressZone(arr, 0, 0, arr.length); + return answer; + } + + private void compressZone(int[][] arr, int x, int y, int size) { + // 영역이 동일한 값인지 + if (isSingleValue(arr, x, y, size)) { + answer[arr[x][y]]++; // 0이면 result[0], 1이면 result[1] 증가 + return; + } + + // 동일한 값 아니면 4개로 나눠서 재귀호출 + int newSize = size / 2; + compressZone(arr, x, y, newSize); // 왼.위 + compressZone(arr, x, y + newSize, newSize); // 오.위 + compressZone(arr, x + newSize, y, newSize); // 왼.아 + compressZone(arr, x + newSize, y + newSize, newSize); // 오.아 + } + + private boolean isSingleValue(int[][] arr, int x, int y, int size) { + int value = arr[x][y]; // 첫째 값을 기준 + for (int i = x; i < x + size; i++) { + for (int j = y; j < y + size; j++) { + if (arr[i][j] != value) + return false; // 다른 값이 있으면 false + } + } + return true; // 전체값이 동일하면 true + } +}