From 688f6ad29ccd87b1a313ef30b7ea165eaaee0c31 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Tue, 30 Jan 2024 18:11:46 +0900 Subject: [PATCH 01/30] Programmers Solution 42586 --- .../programmers/lv2/Solution42586.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42586.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42586.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42586.java new file mode 100644 index 0000000..5136553 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42586.java @@ -0,0 +1,54 @@ +package com.example.algorithm.programmers.lv2; + +import java.util.*; + +public class Solution42586 { + + // progresses : [93, 30, 55] + // speeds : [1, 30, 5] + // return : [2, 1] + + public int[] solution(int[] progresses, int[] speeds) { + List answer = new ArrayList<>(); + + // 남은 일의 갯수 + int left = progresses.length; + + // 완료 지점 + int idx = 0; + + while (left > 0) { + int count = 0; + + for (int i = 0; i < progresses.length; i++) { + progresses[i] = progresses[i] + speeds[i]; + } + + for (int i = idx; i < progresses.length; i++) { + // 배포한 작업 카운트 + if (progresses[i] >= 100) { + count++; + idx++; + }else break; + } + + if (count != 0) { + answer.add(count); + left = left - count; + } + } + + return answer.stream() + .mapToInt(Integer::intValue) + .toArray(); + } + + public static void main(String[] args) { + Solution42586 solution = new Solution42586(); + int[] progresses = {93, 30, 55}; + int[] speeds = {1, 30, 5}; + int[] answer = solution.solution(progresses, speeds); + System.out.println(Arrays.toString(answer)); + } + +} From 6f863c25f17cdeaa3e0816b35de601e99e0fa3d4 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Fri, 2 Feb 2024 23:46:12 +0900 Subject: [PATCH 02/30] Programmers Solution 12909 --- .../com/example/algorithm/BilliardBall.java | 39 +++++++++++++++ .../example/algorithm/StringNumToIntNum.java | 17 +++++++ ...\352\265\254\355\225\230\352\270\260.java" | 2 +- .../programmers/lv2/Solution12909.java | 50 +++++++++++++++++++ 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/algorithm/BilliardBall.java create mode 100644 src/main/java/com/example/algorithm/StringNumToIntNum.java rename "src/main/java/com/example/algorithm/programmers/kakaoBlindRecruitment/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" => "src/main/java/com/example/algorithm/programmers/kakao/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" (96%) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution12909.java diff --git a/src/main/java/com/example/algorithm/BilliardBall.java b/src/main/java/com/example/algorithm/BilliardBall.java new file mode 100644 index 0000000..1203b3b --- /dev/null +++ b/src/main/java/com/example/algorithm/BilliardBall.java @@ -0,0 +1,39 @@ +package com.example.algorithm; + +import static java.lang.Thread.*; + +public class BilliardBall { + public static void main(String[] args) throws InterruptedException { + + int w = 10; // 당구대 너비 + int h = 5; // 당구대 높이 + int r = 1; // 당구공 반지름 + int x = 3; // 초기 x 좌표 + int y = 3; // 초기 y 좌표 + int dx = 1; // x 방향 속도 + int dy = 1; // y 방향 속도 + + while (true) { + sleep(1000); + + int newX = x + dx; + int newY = y + dy; + + + // CodeA: 공이 당구대의 왼쪽, 오른쪽 벽에 부딪치면 + if (newX - r < 0 || newX + r > w) { + // CodeB: x축 방향을 바꾼다 + dx = -dx; + } + + // CodeA: 공이 당구대의 위쪽, 아래쪽 벽에 부딪치면 + if (newY - r < 0 || newY + r > h) { + // CodeB: y축 방향을 바꾼다 + dy = -dy; + } + + x = newX; + y = newY; + } + } +} diff --git a/src/main/java/com/example/algorithm/StringNumToIntNum.java b/src/main/java/com/example/algorithm/StringNumToIntNum.java new file mode 100644 index 0000000..ffbb738 --- /dev/null +++ b/src/main/java/com/example/algorithm/StringNumToIntNum.java @@ -0,0 +1,17 @@ +package com.example.algorithm; + +public class StringNumToIntNum { + + public static void main(String[] args) { + String a = "12345"; + int i = 0; + + for (int j = 0; j < a.length(); j++) { + i *= 10; + i += a.charAt(j) - '0'; + } + + System.out.println(i); + } + +} diff --git "a/src/main/java/com/example/algorithm/programmers/kakaoBlindRecruitment/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" "b/src/main/java/com/example/algorithm/programmers/kakao/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" similarity index 96% rename from "src/main/java/com/example/algorithm/programmers/kakaoBlindRecruitment/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" rename to "src/main/java/com/example/algorithm/programmers/kakao/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" index 4a6d0a4..b8a94f6 100644 --- "a/src/main/java/com/example/algorithm/programmers/kakaoBlindRecruitment/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" +++ "b/src/main/java/com/example/algorithm/programmers/kakao/k\354\247\204\354\210\230\354\227\220\354\204\234_\354\206\214\354\210\230_\352\260\234\354\210\230_\352\265\254\355\225\230\352\270\260.java" @@ -1,4 +1,4 @@ -package com.example.algorithm.programmers.kakaoBlindRecruitment; +package com.example.algorithm.programmers.kakao; // 문제의 핵심: 소수판별에서의 효율적인 알고리즘 구현(시간복잡도) diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution12909.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution12909.java new file mode 100644 index 0000000..b077cf2 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution12909.java @@ -0,0 +1,50 @@ +package com.example.algorithm.programmers.lv2; + +import java.util.*; + +public class Solution12909 { + + // s : "()()" + // return : true + + boolean solution(String s) { + boolean answer = true; + + Stack stack = new Stack<>(); + + char[] array = s.toCharArray(); + + // 배열의 처음과 끝에 올바르지 않은 괄호가 있으면 false + if (array[s.length() - 1] == '(' || array[0] == ')') { + return false; + } + + for (char ch : array) { + if (ch == '(') { + stack.push(ch); + } else if (ch == ')') { + if (stack.isEmpty()) { + // 여는 괄호가 없는데 닫는 괄호가 나오면 올바르지 않은 괄호면 false + return false; + } + // 짝이 맞는 경우 스택에서 여는 괄호를 제거 + stack.pop(); + } + } + + // 스택에 남아 있는 괄호가 있는 경우에도 올바르지 않은 괄호먄 false + if (!stack.isEmpty()) { + return false; + } + + return answer; + } + + public static void main(String[] args) { + Solution12909 solution = new Solution12909(); + String s = "(()()"; + boolean answer = solution.solution(s); + System.out.println(answer); + } + +} From 3d2560a0f04a0292e83a772a2249abdab2c514c4 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Sat, 3 Feb 2024 22:17:18 +0900 Subject: [PATCH 03/30] Programmers Solution 42587 --- .../programmers/lv2/Solution42587.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42587.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42587.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42587.java new file mode 100644 index 0000000..2af159b --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42587.java @@ -0,0 +1,66 @@ +package com.example.algorithm.programmers.lv2; + +import java.util.*; + +public class Solution42587 { + + // priorities : [2, 1, 3, 2] + // location : 2 + // return : 1 + + public int solution(int[] priorities, int location) { + int answer = 0; + + Queue queue = new LinkedList<>(); + + for (int i = 0; i < priorities.length; i++) { + queue.add(new Process(i, priorities[i])); + } + + while (!queue.isEmpty()) { + Process currentProcess = queue.poll(); + + // 현재 프로세스보다 우선순위가 높은 프로세스가 있는지 확인 + boolean higherPriorityExist = queue.stream().anyMatch(p -> p.priority > currentProcess.priority); + + if (higherPriorityExist) { + // 더 높은 우선순위의 프로세스가 있으면 다시 큐에 추가 + queue.add(currentProcess); + } else { + // 높은 우선순위의 프로세스가 없으면 실행하고 정답 증가 + answer++; + // 만약 실행한 프로세스가 찾고자 하는 프로세스라면 종료 + if (currentProcess.location == location) { + break; + } + } + } + + return answer; + } + + class Process { + int location; + int priority; + + public Process(int location, int priority) { + this.location = location; + this.priority = priority; + } + } + + public static void main(String[] args) { + int[] priorities1 = {2, 1, 3, 2}; + int location1 = 2; + + Solution42587 solution = new Solution42587(); + + System.out.println(solution.solution(priorities1, location1)); + + int[] priorities2 = {1, 1, 9, 1, 1, 1}; + int location2 = 0; + System.out.println(solution.solution(priorities2, location2)); + } + +} + From 3984a4fb5c002bfa6cae6de3dd1365eb72b452cf Mon Sep 17 00:00:00 2001 From: Sudongk Date: Tue, 6 Feb 2024 11:10:48 +0900 Subject: [PATCH 04/30] Programmers Solution 42583 --- .../programmers/lv2/Solution42583.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42583.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42583.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42583.java new file mode 100644 index 0000000..ca88616 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42583.java @@ -0,0 +1,61 @@ +package com.example.algorithm.programmers.lv2; + +import java.util.*; + +public class Solution42583 { + + // bridge_length : 2 + // weight : 10 + // truck_weights : [7, 4, 5, 6] + // return : 8 + + public int solution(int bridge_length, int weight, int[] truck_weights) { + int answer = 0; + int passed_truck_count = 0; + int truck_idx = 0; + int total_truck_weight = 0; + Queue bridge = new LinkedList<>(); + + while (passed_truck_count != truck_weights.length) { + // 다리를 건너는 트럭의 개수가 다리의 길이와 같다면 다리 끝에 도착을 의미 + if (bridge.size() == bridge_length) { + // 다리 끝에 있는 요소 꺼냄 + Integer truck_weight = bridge.poll(); + // 꺼낸 요소가 트럭이라면 지난 트럭 갯수 증가, 다리에 있는 트럭 총 무게 감소 + if (truck_weight != 0) { + passed_truck_count++; + total_truck_weight = total_truck_weight - truck_weight; + } + } + + // 다리가 수용 가능한 무게라면 다리에 트럭 추가 후 트럭 총 무게 증가, 트럭 인덱스 증가, 시간 증가 + if (truck_idx < truck_weights.length && total_truck_weight + truck_weights[truck_idx] <= weight) { + bridge.add(truck_weights[truck_idx]); + total_truck_weight = total_truck_weight + truck_weights[truck_idx]; + truck_idx++; + // 시간 증가 후 다음 루프로 이동 + answer++; + continue; + } + + // 아니라면 0추가 + bridge.add(0); + + // 시간 증가 + answer++; + } + + return answer; + } + + public static void main(String[] args) { + int bridge_length = 2; + int weight = 10; + int[] truck_weights = {7,4,5,6}; + + Solution42583 solution = new Solution42583(); + + System.out.println(solution.solution(bridge_length, weight, truck_weights)); + } + +} From 4f4459981807b0f904bbcd41e688e7bfae1c09e2 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Sat, 17 Feb 2024 20:33:32 +0900 Subject: [PATCH 05/30] Programmers Solution 42584 --- .../programmers/lv2/Solution42584.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42584.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42584.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42584.java new file mode 100644 index 0000000..c1ecfb0 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42584.java @@ -0,0 +1,46 @@ +package com.example.algorithm.programmers.lv2; + +import java.util.*; + +public class Solution42584 { + + // prices : [1, 2, 3, 2, 3] + // return : [4, 3, 1, 1, 0] + + public int[] solution(int[] prices) { + int[] answer = {}; + + // prices 배열의 길이만큼 answer 배열 생성 + answer = new int[prices.length]; + + // prices 배열의 길이만큼 반복 + for (int i = 0; i < prices.length; i++) { + // 현재 가격과 비교할 가격 + int currentPrice = prices[i]; + int count = 0; + // 현재 가격과 비교할 가격의 차이가 0보다 크고 현재 가격의 인덱스가 prices 배열의 길이보다 작다면 반복 + for (int j = i + 1; j < prices.length; j++) { + // 현재 가격과 비교할 가격의 차이가 0보다 크다면 count 증가 + if (currentPrice <= prices[j]) { + count++; + } else { + // 현재 가격과 비교할 가격의 차이가 0보다 작다면 count 증가 후 반복문 종료 + count++; + break; + } + } + // 현재 가격의 인덱스에 count를 저장 + answer[i] = count; + } + + return answer; + } + + public static void main(String[] args) { + Solution42584 solution = new Solution42584(); + int[] prices = {1, 2, 3, 2, 3}; + int[] answer = solution.solution(prices); + System.out.println(Arrays.toString(answer)); + } + +} From bcfe193270c9ab6091a99b527d947c1d660f7adb Mon Sep 17 00:00:00 2001 From: Sudongk Date: Fri, 23 Feb 2024 15:50:24 +0900 Subject: [PATCH 06/30] Programmers Solution 42626 --- .../programmers/lv2/Solution42626.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42626.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42626.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42626.java new file mode 100644 index 0000000..b33098a --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42626.java @@ -0,0 +1,46 @@ +package com.example.algorithm.programmers.lv2; + +import java.util.PriorityQueue; + +public class Solution42626 { + + // scoville : [1, 2, 3, 9, 10, 12] + // K : 7 + // return : 2 + + public int solution(int[] scoville, int K) { + // 자바의 최소 힙 (부모 노드가 자식 노드보다 작거나 같은 완전 이진 트리) + PriorityQueue pq = new PriorityQueue<>(); + + // 최소 힙을 유지하면서 모든 음식의 스코빌 지수를 큐에 삽입 + for (int s : scoville) + pq.offer(s); + + int count = 0; + // 최소값이 K 이상이 될 때까지 반복 + while (pq.peek() < K) { + // 음식이 한 개만 남았는데도 K 이상의 스코빌 지수를 만들 수 없는 경우 + if (pq.size() == 1) + return -1; + + // 가장 맵지 않은 음식과 두 번째로 맵지 않은 음식을 섞어 새로운 음식의 스코빌 지수 계산 + int mixedScoville = pq.poll() + (pq.poll() * 2); + // 다시 정렬 + pq.offer(mixedScoville); + + count++; + } + + return count; + } + + public static void main(String[] args) { + int[] scoville = {1, 2, 3, 9, 10, 12}; + int K = 7; + + Solution42626 solution = new Solution42626(); + + System.out.println(solution.solution(scoville, K)); + } + +} From ff042c507ea71715fe0424db0da627ee9ca18f18 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Sat, 2 Mar 2024 16:52:21 +0900 Subject: [PATCH 07/30] Programmers Solution 42627 --- .../programmers/lv3/Solution42627.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java diff --git a/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java b/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java new file mode 100644 index 0000000..27e56e9 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java @@ -0,0 +1,49 @@ +package com.example.algorithm.programmers.lv3; + +import java.util.*; + +public class Solution42627 { + + // jobs : [[0, 3], [1, 9], [2, 6]] + // return : 9 + + public int solution(int[][] jobs) { + int answer = 0; + + // 작업의 소요시간을 기준으로 오름차순 정렬 + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]); + + int time = 0; + int index = 0; + + // 작업의 요청 시간을 기준으로 오름차순 정렬 + while (index < jobs.length || !pq.isEmpty()) { + // 현재 시간 이하의 작업을 모두 큐에 삽입 + while (index < jobs.length && jobs[index][0] <= time) { + pq.offer(jobs[index++]); + } + // 큐가 비어있는 경우 현재 시간을 작업의 요청 시간으로 변경 + if (pq.isEmpty()) { + time = jobs[index][0]; + } else { // 큐가 비어있지 않은 경우 + int[] job = pq.poll(); + answer += time + job[1] - job[0]; + time += job[1]; + } + } + + // 평균 시간 계산 + answer /= jobs.length; + + return answer; + } + + public static void main(String[] args) { + int[][] jobs = {{0, 3}, {1, 9}, {2, 6}}; + + Solution42627 solution = new Solution42627(); + + System.out.println(solution.solution(jobs)); + } + +} From 10eaf48d502fb7fe5db9b481905c9c600716a907 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Thu, 28 Mar 2024 16:29:31 +0900 Subject: [PATCH 08/30] Programmers Solution 42628 --- .../programmers/lv2/Solution42626.java | 2 + .../programmers/lv3/Solution42628.java | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv3/Solution42628.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42626.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42626.java index b33098a..a401bbc 100644 --- a/src/main/java/com/example/algorithm/programmers/lv2/Solution42626.java +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42626.java @@ -10,8 +10,10 @@ public class Solution42626 { public int solution(int[] scoville, int K) { // 자바의 최소 힙 (부모 노드가 자식 노드보다 작거나 같은 완전 이진 트리) + // poll()하면 가장 작은 값 반환 PriorityQueue pq = new PriorityQueue<>(); + // 최소 힙을 유지하면서 모든 음식의 스코빌 지수를 큐에 삽입 for (int s : scoville) pq.offer(s); diff --git a/src/main/java/com/example/algorithm/programmers/lv3/Solution42628.java b/src/main/java/com/example/algorithm/programmers/lv3/Solution42628.java new file mode 100644 index 0000000..9624ef0 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv3/Solution42628.java @@ -0,0 +1,63 @@ +package com.example.algorithm.programmers.lv3; + +import java.util.Arrays; +import java.util.Collections; +import java.util.PriorityQueue; + +public class Solution42628 { + + // operations : ["I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"] + // return : [0, 0] + + public int[] solution(String[] operations) { + int[] answer = new int[2]; + + // 최소 힙 최소 : 값이 우선순위인 큐 + PriorityQueue pq = new PriorityQueue<>(); + + // 최대 힙 : 최대 값이 우선순위인 큐 + PriorityQueue reversePq = new PriorityQueue<>(Collections.reverseOrder()); + + for (String op : operations) { + String[] split = op.split(" "); + if (split[0].equals("I")) { + pq.offer(Integer.parseInt(split[1])); + reversePq.offer(Integer.parseInt(split[1])); + } + + if (split[0].equals("D")) { + if (pq.isEmpty() || reversePq.isEmpty()) { + continue; + } + + if (split[1].equals("1")) { + int max = reversePq.poll(); + pq.remove(max); + } else { + int min = pq.poll(); + reversePq.remove(min); + } + } + } + + if (pq.isEmpty() || reversePq.isEmpty()) { + return answer; + } + + answer[0] = reversePq.poll(); + answer[1] = pq.poll(); + + return answer; + } + + public static void main(String[] args) { + String[] operations = {"I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"}; + + Solution42628 solution = new Solution42628(); + + int[] answer = solution.solution(operations); + + System.out.println(Arrays.toString(answer)); + } + +} From b07534bc13bf293c56f82fc413334cb637d63c25 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Thu, 28 Mar 2024 16:31:09 +0900 Subject: [PATCH 09/30] Programmers Soluton 42627 --- .../data_structure/list/MyArrayList.java | 103 ++++++++++++++++++ .../algorithm/data_structure/list/MyList.java | 25 +++++ 2 files changed, 128 insertions(+) create mode 100644 src/main/java/com/example/algorithm/data_structure/list/MyArrayList.java create mode 100644 src/main/java/com/example/algorithm/data_structure/list/MyList.java diff --git a/src/main/java/com/example/algorithm/data_structure/list/MyArrayList.java b/src/main/java/com/example/algorithm/data_structure/list/MyArrayList.java new file mode 100644 index 0000000..db32f13 --- /dev/null +++ b/src/main/java/com/example/algorithm/data_structure/list/MyArrayList.java @@ -0,0 +1,103 @@ +package com.example.algorithm.data_structure.list; + +import java.util.Arrays; + +public class MyArrayList implements MyList { + + // 타입 안정성 때문에 Object 타입 대신 제네릭 타입 사용 + private static final int DEFAULT_CAPACITY = 10; + private T[] elements; + private int size; + + + public MyArrayList() { + this.elements = (T[]) new Object[DEFAULT_CAPACITY]; + this.size = 0; + } + + @Override + public void add(T t) { + if(this.size == this.elements.length) { + this.elements = Arrays.copyOf(this.elements, this.size * 2); + } + + this.elements[this.size++] = t; + } + + @Override + public void insert(int index, T t) { + if(this.size == this.elements.length) { + this.elements = Arrays.copyOf(this.elements, this.size * 2); + } + + for (int i = this.size - 1; i >= index; i--) { + this.elements[i + 1] = this.elements[i]; + } + + this.elements[index] = t; + this.size++; + } + + @Override + public void clear() { + + } + + @Override + public boolean delete(T t) { + return false; + } + + @Override + public boolean deleteByIndex(int index) { + return false; + } + + @Override + public T get(int index) { + return null; + } + + @Override + public int indexOf(T t) { + return 0; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public boolean contains(T t) { + return false; + } + + @Override + public int size() { + return 0; + } + + public static void main(String[] args) { + MyArrayList list = new MyArrayList<>(); + list.add(1); + list.add(2); + list.add(3); + list.add(5); + list.add(6); + list.add(7); + list.add(8); + list.add(9); + list.add(10); + list.add(11); + + System.out.println(list.size); + System.out.println(Arrays.toString(list.elements)); + + list.insert(1, 4); + + System.out.println(list.size); + System.out.println(Arrays.toString(list.elements)); + } + +} diff --git a/src/main/java/com/example/algorithm/data_structure/list/MyList.java b/src/main/java/com/example/algorithm/data_structure/list/MyList.java new file mode 100644 index 0000000..5787f60 --- /dev/null +++ b/src/main/java/com/example/algorithm/data_structure/list/MyList.java @@ -0,0 +1,25 @@ +package com.example.algorithm.data_structure.list; + +public interface MyList { + + void add(T t); + + void insert(int index, T t); + + void clear(); + + boolean delete(T t); + + boolean deleteByIndex(int index); + + T get(int index); + + int indexOf(T t); + + boolean isEmpty(); + + boolean contains(T t); + + int size(); + +} From 4ef9d96ee894710208d1fd4eaa74d908a6aa7dd3 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Fri, 29 Mar 2024 21:08:57 +0900 Subject: [PATCH 10/30] Programmers Solution 42627 --- .../example/algorithm/programmers/lv3/Solution42627.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java b/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java index 27e56e9..d8d1733 100644 --- a/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java +++ b/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java @@ -10,12 +10,12 @@ public class Solution42627 { public int solution(int[][] jobs) { int answer = 0; - // 작업의 소요시간을 기준으로 오름차순 정렬 - PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]); - int time = 0; int index = 0; + // 작업의 소요시간을 기준으로 오름차순 정렬 + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]); + // 작업의 요청 시간을 기준으로 오름차순 정렬 while (index < jobs.length || !pq.isEmpty()) { // 현재 시간 이하의 작업을 모두 큐에 삽입 From c1569b366c2ebf846b5320e7f3e4d11cc588c403 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Mon, 1 Apr 2024 23:36:11 +0900 Subject: [PATCH 11/30] Programmers Solution 42627 --- .../programmers/lv3/Solution42627.java | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java b/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java index d8d1733..9d31e94 100644 --- a/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java +++ b/src/main/java/com/example/algorithm/programmers/lv3/Solution42627.java @@ -8,38 +8,54 @@ public class Solution42627 { // return : 9 public int solution(int[][] jobs) { + // 각 작업의 요청 시점부터 처리완료 시점까지의 합을 작업의 갯수로 나눈 값 int answer = 0; - int time = 0; - int index = 0; + // 작업이 요청되는 시점 기준으로 오름차순 정렬 * 핵심 + Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]); - // 작업의 소요시간을 기준으로 오름차순 정렬 + // 작업의 소요시간 기준으로 오름차순 정렬 * 핵심 PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]); - // 작업의 요청 시간을 기준으로 오름차순 정렬 - while (index < jobs.length || !pq.isEmpty()) { - // 현재 시간 이하의 작업을 모두 큐에 삽입 - while (index < jobs.length && jobs[index][0] <= time) { - pq.offer(jobs[index++]); + // 작업 배열 인덱스 + int jobs_index = 0; + // 처리 완료된 작업 개수 + int finish_job = 0; + // 작업 처리 완료 시간 디스크는 한번에 하나의 작업만 수행 가능하기 때문에 작업 완료 시점은 작 작업의 소요 시간의 합계 + int end_time = 0; + + while(true) { + // 모든 작업을 처리했다면 종료 + if(finish_job == jobs.length) break; + + // 작업 처리 중 요청된 작업 add + while(jobs_index < jobs.length && jobs[jobs_index][0] <= end_time) { + pq.add(jobs[jobs_index++]); } - // 큐가 비어있는 경우 현재 시간을 작업의 요청 시간으로 변경 - if (pq.isEmpty()) { - time = jobs[index][0]; - } else { // 큐가 비어있지 않은 경우 + + // 이전 작업 처리 중 요청된 작업이 있는 경우 + if(!pq.isEmpty()) { int[] job = pq.poll(); - answer += time + job[1] - job[0]; - time += job[1]; + // 대기시간 + 작업 소요시간 + // 작업 요청부터 종료까지 걸린 시간 추가 + answer += end_time - job[0] + job[1]; + // 작업 처리 완료 시간 갱신 + end_time += job[1]; + // 처리 완료된 작업 개수 1 증가 + finish_job++; + } + // 이전 작업 처리 중 요청된 작업이 없는 경우 + else { + end_time = jobs[jobs_index][0]; // 다음 작업 요청 시점으로 갱신 } } - // 평균 시간 계산 - answer /= jobs.length; + return answer / jobs.length; - return answer; } public static void main(String[] args) { - int[][] jobs = {{0, 3}, {1, 9}, {2, 6}}; + int[][] jobs = {{0, 3}, {2, 6}, {1, 9}}; Solution42627 solution = new Solution42627(); From 954d17b099ddcfc44ad336919d995584160a2df9 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Tue, 2 Apr 2024 16:40:01 +0900 Subject: [PATCH 12/30] Programmers Solution 42748 --- .../programmers/lv1/Solution42748.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv1/Solution42748.java diff --git a/src/main/java/com/example/algorithm/programmers/lv1/Solution42748.java b/src/main/java/com/example/algorithm/programmers/lv1/Solution42748.java new file mode 100644 index 0000000..862b887 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv1/Solution42748.java @@ -0,0 +1,51 @@ +package com.example.algorithm.programmers.lv1; + +import java.util.*; + +public class Solution42748 { + + // array : [1, 5, 2, 6, 3, 7, 4] + // commands : [[2, 5, 3], [4, 4, 1], [1, 7, 3]] + // return : [5, 6, 3] + + public int[] solution(int[] array, int[][] commands) { + int[] answer = new int[commands.length]; + + for (int i = 0; i < commands.length; i++) { + int startIndex = commands[i][0] - 1; + int endIndex = commands[i][1] - 1; + int targetIndex = commands[i][2] - 1; + + // 최소힙을 이용한 정렬 (부모노드는 항상 자식노드보다 작다) + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1 - o2); + + for (int j = startIndex; j <= endIndex; j++) { + pq.offer(array[j]); + } + + for (int k = 0; k <= targetIndex; k++) { + // 값을 poll 할 때마다 최소값이 나오고 내부에서 정렬이 일어난다. + Integer targetVal = pq.poll(); + if (k == targetIndex) { + answer[i] = targetVal; + } + } + + pq.clear(); + } + + return answer; + } + + public static void main(String[] args) { + int[] array = {1, 5, 2, 6, 3, 7, 4}; + int[][] commands = {{2, 5, 3}, {4, 4, 1}, {1, 7, 3}}; + + Solution42748 solution = new Solution42748(); + + int[] answer = solution.solution(array, commands); + + System.out.println(Arrays.toString(answer)); + } + +} From 40768999905e446d04131dff0558620c60041a12 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Thu, 4 Apr 2024 22:15:05 +0900 Subject: [PATCH 13/30] Programmers Solution 42746 --- .../programmers/lv2/Solution42746.java | 58 +++++++++++++++++++ .../programmers/permutation/Permutation.java | 18 +++--- 2 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42746.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42746.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42746.java new file mode 100644 index 0000000..0ac47bb --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42746.java @@ -0,0 +1,58 @@ +package com.example.algorithm.programmers.lv2; + +import java.util.*; + +public class Solution42746 { + + // numbers : [6, 10, 2] + // return : "6210" + + public String solution(int[] numbers) { + String answer = ""; + + // 우선순위 큐 - 최대 힙(내림차순) + PriorityQueue pq = new PriorityQueue<>(((o1, o2) -> o2 - o1)); + + // 조합 가능한 숫자 구하고 우선순위 큐에 삽입 + permutation(numbers, new int[numbers.length], new boolean[numbers.length], 0, numbers.length, pq); + + answer = String.valueOf(pq.poll()); + + return answer; + } + + // 순열을 구하는 재귀 함수 + public void permutation(int[] numbers, int[] out, boolean[] visited, int depth, int r, PriorityQueue pq) { + StringBuilder sb = new StringBuilder(); + if (depth == r) { + for (int i = 0; i < r; i++) { + if (out[i] == 0) { + break; + } + sb.append(out[i]); + } + pq.add(Integer.parseInt(sb.toString())); + sb.setLength(0); + } + + for (int i = 0; i < numbers.length; i++) { + if (!visited[i]) { + visited[i] = true; + out[depth] = numbers[i]; + permutation(numbers, out, visited, depth + 1, r, pq); + visited[i] = false; + } + } + } + + public static void main(String[] args) { + int[] numbers = {3, 30, 34, 5, 9}; + + Solution42746 solution = new Solution42746(); + + String answer = solution.solution(numbers); + + System.out.println(answer); + } + +} diff --git a/src/main/java/com/example/algorithm/programmers/permutation/Permutation.java b/src/main/java/com/example/algorithm/programmers/permutation/Permutation.java index ac29ef5..7f80ba7 100644 --- a/src/main/java/com/example/algorithm/programmers/permutation/Permutation.java +++ b/src/main/java/com/example/algorithm/programmers/permutation/Permutation.java @@ -5,15 +5,15 @@ * ex) [1, 2] , [2, 1] 는 서로 다름 * */ public class Permutation { - public static void permutation(int[] arr, int[] out, boolean[] visited, int depth, int r){ - if(depth == r){ // 뽑으려는 갯수 r과 depth가 같으면 출력 - for(int num : out) System.out.print(num + " "); + public static void permutation(int[] arr, int[] out, boolean[] visited, int depth, int r) { + if (depth == r) { // 뽑으려는 갯수 r과 depth가 같으면 출력 + for (int num : out) System.out.print(num + " "); System.out.println(); return; // 재귀함수 탈출? } - for(int i = 0; i < arr.length; i++){ - if(!visited[i]){ + for (int i = 0; i < arr.length; i++) { + if (!visited[i]) { visited[i] = true; out[depth] = arr[i]; permutation(arr, out, visited, depth + 1, r); @@ -22,10 +22,10 @@ public static void permutation(int[] arr, int[] out, boolean[] visited, int dept } } - public static void main(String[] args){ - int[] arr = {1, 2, 3, 4}; - // 2개 뽑기 - int r = 4; + public static void main(String[] args) { + int[] arr = {6, 0, 2}; + // 3개 뽑기 + int r = 3; permutation(arr, new int[r], new boolean[arr.length], 0, r); } } From bf8e5ccb896389e82da8212f827a5da347a47e3d Mon Sep 17 00:00:00 2001 From: Sudongk Date: Tue, 9 Apr 2024 23:26:20 +0900 Subject: [PATCH 14/30] =?UTF-8?q?Programmers=20Solution=2042746=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EC=B4=88=EA=B3=BC=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/lv2/Solution42746.java | 46 +++++++------------ 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42746.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42746.java index 0ac47bb..17b50a0 100644 --- a/src/main/java/com/example/algorithm/programmers/lv2/Solution42746.java +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42746.java @@ -8,45 +8,33 @@ public class Solution42746 { // return : "6210" public String solution(int[] numbers) { - String answer = ""; - - // 우선순위 큐 - 최대 힙(내림차순) - PriorityQueue pq = new PriorityQueue<>(((o1, o2) -> o2 - o1)); + // Integer 배열을 String 배열로 변환 + String[] nums = new String[numbers.length]; + for (int i = 0; i < numbers.length; i++) { + nums[i] = String.valueOf(numbers[i]); + } - // 조합 가능한 숫자 구하고 우선순위 큐에 삽입 - permutation(numbers, new int[numbers.length], new boolean[numbers.length], 0, numbers.length, pq); + // 정렬 기준 설정 + Arrays.sort(nums, (a, b) -> (b + a).compareTo(a + b)); - answer = String.valueOf(pq.poll()); + System.out.println(Arrays.toString(nums)); - return answer; - } + // 모든 수가 0인 경우 예외 처리 + if (nums[0].equals("0")) { + return "0"; + } - // 순열을 구하는 재귀 함수 - public void permutation(int[] numbers, int[] out, boolean[] visited, int depth, int r, PriorityQueue pq) { + // 정렬된 문자열을 이어붙여 결과 반환 StringBuilder sb = new StringBuilder(); - if (depth == r) { - for (int i = 0; i < r; i++) { - if (out[i] == 0) { - break; - } - sb.append(out[i]); - } - pq.add(Integer.parseInt(sb.toString())); - sb.setLength(0); + for (String num : nums) { + sb.append(num); } - for (int i = 0; i < numbers.length; i++) { - if (!visited[i]) { - visited[i] = true; - out[depth] = numbers[i]; - permutation(numbers, out, visited, depth + 1, r, pq); - visited[i] = false; - } - } + return sb.toString(); } public static void main(String[] args) { - int[] numbers = {3, 30, 34, 5, 9}; + int[] numbers = {3, 30, 34, 5, 9, 3, 30, 34, 5, 9,34, 5, 934, 5, 9}; Solution42746 solution = new Solution42746(); From 3f81a41565c5f1576c7fb481135fd129fc27e51a Mon Sep 17 00:00:00 2001 From: Sudongk Date: Wed, 10 Apr 2024 23:33:54 +0900 Subject: [PATCH 15/30] Programmers Solution 42747 --- .../programmers/lv2/Solution42747.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42747.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42747.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42747.java new file mode 100644 index 0000000..fdccf07 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42747.java @@ -0,0 +1,38 @@ +package com.example.algorithm.programmers.lv2; + +import java.util.*; + +public class Solution42747 { + + // citations : [3, 0, 6, 1, 5] + // return : 3 + + public int solution(int[] citations) { + int answer = 0; + + // 오름차순 정렬 + Arrays.sort(citations); + + for (int i = 0; i < citations.length; i++) { + // h를 citations.length - i로 설정한 이유는 h번 이상 인용된 논문이 h편 이상이어야 하기 때문 + int h = citations.length - i; + if (citations[i] >= h) { + answer = h; + break; + } + } + + return answer; + } + + public static void main(String[] args) { + int[] citations = {3, 0, 6, 1, 5}; + + Solution42747 solution = new Solution42747(); + + int answer = solution.solution(citations); + + System.out.println(answer); + } + +} From 0f59a3e77e23bc04a0ce9fceeabf4906467244c3 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Mon, 29 Apr 2024 22:18:54 +0900 Subject: [PATCH 16/30] Programmers Solution 86491 --- .../programmers/lv1/Solution86491.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv1/Solution86491.java diff --git a/src/main/java/com/example/algorithm/programmers/lv1/Solution86491.java b/src/main/java/com/example/algorithm/programmers/lv1/Solution86491.java new file mode 100644 index 0000000..865af3d --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv1/Solution86491.java @@ -0,0 +1,41 @@ +package com.example.algorithm.programmers.lv1; + +import java.util.Arrays; + +public class Solution86491 { + + // sizes : [[60, 50], [30, 70], [60, 30], [80, 40]] + // return : 4000 + + public int solution(int[][] sizes) { + int answer = 0; + + int maxW = 0; + int maxH = 0; + + // 가로, 세로 중 큰 값을 찾아서 저장 + for (int[] size : sizes) { + // 오름차순 정렬 + Arrays.sort(size); + + // 최대 가로, 세로 길이 저장 + maxW = Math.max(maxW, size[0]); + maxH = Math.max(maxH, size[1]); + } + + answer = maxW * maxH; + + return answer; + } + + public static void main(String[] args) { + int[][] sizes = {{60, 50}, {30, 70}, {60, 30}, {80, 40}}; + + Solution86491 solution = new Solution86491(); + + int answer = solution.solution(sizes); + + System.out.println(answer); + } + +} From 24318d8011cc4935f9abb833fcdc67c67ae3977f Mon Sep 17 00:00:00 2001 From: Sudongk Date: Tue, 30 Apr 2024 17:31:33 +0900 Subject: [PATCH 17/30] Programmers Solution 42840 --- .../programmers/lv1/Solution42840.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv1/Solution42840.java diff --git a/src/main/java/com/example/algorithm/programmers/lv1/Solution42840.java b/src/main/java/com/example/algorithm/programmers/lv1/Solution42840.java new file mode 100644 index 0000000..ed59536 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv1/Solution42840.java @@ -0,0 +1,89 @@ +package com.example.algorithm.programmers.lv1; + +import java.util.*; + +public class Solution42840 { + + // answers : [1, 2, 3, 4, 5] + // return : [1] + + public int[] solution(int[] answers) { + List answer = new ArrayList<>(); + + int[] student1RandomSeq = {1, 2, 3, 4, 5}; + int[] student2RandomSeq = {2, 1, 2, 3, 2, 4, 2, 5}; + int[] student3RandomSeq = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; + + // 학생별 정답 수 + int[] studentsAnswerCount = new int[3]; + + // 정답 배열 인덱스 + int answersIndex = 0; + + // 학생별 찍는 번호 배열 인덱스 + int student1Index = 0; + int student2Index = 0; + int student3Index = 0; + + // 정답 수 계산 + while (answersIndex != answers.length) { + + // 학생별 정답 수 계산 + if (student1RandomSeq[student1Index] == answers[answersIndex]) { + studentsAnswerCount[0]++; + } + + if (student2RandomSeq[student2Index] == answers[answersIndex]) { + studentsAnswerCount[1]++; + } + + if (student3RandomSeq[student3Index] == answers[answersIndex]) { + studentsAnswerCount[2]++; + } + + // 배열 인덱스 증가 + if (student1Index == student1RandomSeq.length - 1) { + student1Index = 0; + }else { + student1Index++; + } + + if (student2Index == student2RandomSeq.length - 1) { + student2Index = 0; + }else { + student2Index++; + } + + if (student3Index == student3RandomSeq.length - 1) { + student3Index = 0; + }else { + student3Index++; + } + + answersIndex++; + } + + // 최대 정답 수 찾기 + for (int i = 0; i < studentsAnswerCount.length; i++) { + int maxVal = Arrays.stream(studentsAnswerCount).max().getAsInt(); + + if (studentsAnswerCount[i] == maxVal) { + answer.add(i + 1); + } + } + + // List -> int[] + return answer.stream().mapToInt(Integer::intValue).toArray(); + } + + public static void main(String[] args) { + int[] answers = {1, 2, 3, 4, 5}; + + Solution42840 solution = new Solution42840(); + + int[] answer = solution.solution(answers); + + System.out.println(Arrays.toString(answer)); + } + +} From a200e9646d2e22b04862ad6d98c3a49a63a39590 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Wed, 1 May 2024 20:30:20 +0900 Subject: [PATCH 18/30] Programmers Solution 42839 --- .../programmers/lv2/Solution42839.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42839.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42839.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42839.java new file mode 100644 index 0000000..431fb7f --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42839.java @@ -0,0 +1,66 @@ +package com.example.algorithm.programmers.lv2; + +import java.util.*; + +public class Solution42839 { + + // numbers : "17" + // return : 3 + + public int solution(String numbers) { + int answer = 0; + + Set set = new HashSet<>(); + + // 순열을 이용하여 모든 경우의 수를 구함 + permutation("", numbers, set); + + // 소수 판별 + for (int num : set) { + if (isPrime(num)) { + answer++; + } + } + + return answer; + } + + // 소수 판별 + private boolean isPrime(int num) { + if (num < 2) { + return false; + } + + for (int i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) { + return false; + } + } + + return true; + } + + // 순열 + private void permutation(String prefix, String numbers, Set set) { + int n = numbers.length(); + + if (!prefix.equals("")) { + set.add(Integer.valueOf(prefix)); + } + + for (int i = 0; i < n; i++) { + permutation(prefix + numbers.charAt(i), numbers.substring(0, i) + numbers.substring(i + 1, n), set); + } + } + + public static void main(String[] args) { + String numbers = "011"; + + Solution42839 solution = new Solution42839(); + + int answer = solution.solution(numbers); + + System.out.println(answer); + } + +} From b951dfe3874541187ce1035d4d7288f7cb234798 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Thu, 9 May 2024 22:54:37 +0900 Subject: [PATCH 19/30] Programmers Solution 42842 --- .../com/example/algorithm/AsyncExample.java | 26 ++++++++++ .../com/example/algorithm/AsyncExample2.java | 34 +++++++++++++ .../programmers/lv2/Solution42842.java | 48 +++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 src/main/java/com/example/algorithm/AsyncExample.java create mode 100644 src/main/java/com/example/algorithm/AsyncExample2.java create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42842.java diff --git a/src/main/java/com/example/algorithm/AsyncExample.java b/src/main/java/com/example/algorithm/AsyncExample.java new file mode 100644 index 0000000..31d2221 --- /dev/null +++ b/src/main/java/com/example/algorithm/AsyncExample.java @@ -0,0 +1,26 @@ +package com.example.algorithm; + +public class AsyncExample { + + public static void main(String[] args) { + // 비동기인데 왜 순차적으로 실행되는 이유 -> 메인 스레드가 종료되면 프로그램이 종료되기 때문 + // 같은 스레드라서 순차적으로 실행되는거 같은데 맞아? -> 맞아 + + try { + System.out.println("첫 번째 작업"); + System.out.println(Thread.currentThread().getName()); + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + try { + System.out.println("두 번째 작업"); + System.out.println(Thread.currentThread().getName()); + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/example/algorithm/AsyncExample2.java b/src/main/java/com/example/algorithm/AsyncExample2.java new file mode 100644 index 0000000..a640c36 --- /dev/null +++ b/src/main/java/com/example/algorithm/AsyncExample2.java @@ -0,0 +1,34 @@ +package com.example.algorithm; + +public class AsyncExample2 { + + public static void main(String[] args) { + + new Thread(() -> { + try { + Thread.sleep(500); + System.out.println(Thread.currentThread().getName()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }).start(); + + new Thread(() -> { + try { + Thread.sleep(500); + System.out.println(Thread.currentThread().getName()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }).start(); + + try { + Thread.sleep(2000); + System.out.println("메인 스레드 종료"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } + +} diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42842.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42842.java new file mode 100644 index 0000000..fdb5502 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42842.java @@ -0,0 +1,48 @@ +package com.example.algorithm.programmers.lv2; + +public class Solution42842 { + + // brown : 10, yellow : 2 + // return : [4, 3] + + public int[] solution(int brown, int yellow) { + int[] answer = new int[2]; + + int size = brown + yellow; + + int width = 0; + int length = 0; + + for (int i = 1; i <= size; i++) { + if (size % i == 0) { + length = size / i; + width = i % size; + } + + if (length != 0 && width != 0) { + if (length <= width) { + break; + } + } + } + + answer[0] = width; + answer[1] = length; + + return answer; + } + + public static void main(String[] args) { + int brown = 24; + int yellow = 24; + + Solution42842 solution = new Solution42842(); + + int[] answer = solution.solution(brown, yellow); + + for (int i : answer) { + System.out.println(i); + } + } + +} From d52c97dbdbef429427cd8068a59375d21a26a54c Mon Sep 17 00:00:00 2001 From: Sudongk Date: Fri, 10 May 2024 11:39:27 +0900 Subject: [PATCH 20/30] =?UTF-8?q?Programmers=20Solution=2042842=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/lv2/Solution42842.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42842.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42842.java index fdb5502..650fed7 100644 --- a/src/main/java/com/example/algorithm/programmers/lv2/Solution42842.java +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42842.java @@ -8,17 +8,33 @@ public class Solution42842 { public int[] solution(int brown, int yellow) { int[] answer = new int[2]; + // 전체 사이즈 int size = brown + yellow; int width = 0; int length = 0; + // 가로, 세로 길이 구하기 for (int i = 1; i <= size; i++) { + // 약수인 경우 if (size % i == 0) { + // size를 i로 나눈 값이 세로 길이 + int newLength = size / i; + // size를 i로 나눈 나머지가 가로 길이 + int newWidth = i % size; + + int yellowSize = (newWidth - 2) * (newLength - 2); + + // 노란색 카펫의 사이즈와 일치하지 않는 경우 + if (yellowSize != yellow) { + continue; + } + length = size / i; width = i % size; } + // 가로가 세로보다 크거나 같은 경우 if (length != 0 && width != 0) { if (length <= width) { break; @@ -33,8 +49,8 @@ public int[] solution(int brown, int yellow) { } public static void main(String[] args) { - int brown = 24; - int yellow = 24; + int brown = 18; + int yellow = 6; Solution42842 solution = new Solution42842(); From 8b85e4244b9f38a56a517cd13c043ede6a10682b Mon Sep 17 00:00:00 2001 From: Sudongk Date: Sat, 11 May 2024 16:12:47 +0900 Subject: [PATCH 21/30] Programmers Solution 87946 --- .../programmers/lv2/Solution87946.java | 86 +++++++++++++++++++ .../programmers/permutation/Permutation.java | 2 +- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution87946.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution87946.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution87946.java new file mode 100644 index 0000000..26e32e5 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution87946.java @@ -0,0 +1,86 @@ +package com.example.algorithm.programmers.lv2; + +public class Solution87946 { + + // k : 80 + // dungeons : [[80,20],[50,40],[30,10]] + // result : 3 + + int answer = -1; + + public int solution(int k, int[][] dungeons) { + int dungeonCount = dungeons.length; + int[] arr = new int[dungeonCount]; + + for (int i = 0; i < dungeonCount; i++) { + arr[i] = i; + } + + permutation(arr, 0, dungeonCount, k, dungeons); + + return answer; + } + + // 가능한 순번 인덱스 구하가 후 순서대로 던전 탐험 + private void permutation(int[] indexSeq, int depth, int dungeonCount, int k, int[][] dungeons) { + if (depth == dungeonCount) { + int count = explore(indexSeq, k, dungeons); + + // 던전 탐험 횟수 최대값 저장 + if (answer < count) { + answer = count; + } + return; + } + + // 던전 탐험 횟수가 이미 최대값이면 종료 + if (answer == dungeonCount) { + return; + } + + for (int i = depth; i < dungeonCount; i++) { + swap(indexSeq, i, depth); + permutation(indexSeq, depth + 1, dungeonCount, k, dungeons); + swap(indexSeq, i, depth); + } + } + + // 순번 인덱스 교환 + private void swap(int[] indexSeq, int i, int j) { + int temp = indexSeq[i]; + indexSeq[i] = indexSeq[j]; + indexSeq[j] = temp; + } + + // 던전 탐험 + private int explore(int[] indexSeq, int k, int[][] dungeons) { + int count = 0; + for (int idx : indexSeq) { + // 유저의 피로도가 던전의 최소 필요 피로도보다 크거나 같으면 던전 탐험 + if (dungeons[idx][0] <= k) { + // 유저의 피로도 감소 + k -= dungeons[idx][1]; + // 던전 탐험 횟수 증가 + count++; + } else { + // 피로도가 만족되지 않으면 루프 종료 던전 탐험 불가능하면 종료 + break; + } + } + + return count; + } + + + public static void main(String[] args) { + int k = 80; + int[][] dungeons = {{80, 20}, {50, 40}, {30, 10}}; + + Solution87946 solution = new Solution87946(); + + int answer = solution.solution(k, dungeons); + + System.out.println(answer); + } + +} diff --git a/src/main/java/com/example/algorithm/programmers/permutation/Permutation.java b/src/main/java/com/example/algorithm/programmers/permutation/Permutation.java index 7f80ba7..3d2f7fa 100644 --- a/src/main/java/com/example/algorithm/programmers/permutation/Permutation.java +++ b/src/main/java/com/example/algorithm/programmers/permutation/Permutation.java @@ -23,7 +23,7 @@ public static void permutation(int[] arr, int[] out, boolean[] visited, int dept } public static void main(String[] args) { - int[] arr = {6, 0, 2}; + int[] arr = {6, 0, 4}; // 3개 뽑기 int r = 3; permutation(arr, new int[r], new boolean[arr.length], 0, r); From e5aecc07c1b9d01221b42e595153aef90763626c Mon Sep 17 00:00:00 2001 From: Sudongk Date: Mon, 13 May 2024 00:00:02 +0900 Subject: [PATCH 22/30] Programmers Solution 86971 --- .../programmers/lv2/Solution86971.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution86971.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution86971.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution86971.java new file mode 100644 index 0000000..101f6ec --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution86971.java @@ -0,0 +1,82 @@ +package com.example.algorithm.programmers.lv2; + +import java.util.*; + +public class Solution86971 { + + // n : 9 + // wires : [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]] + // return : 3 + + public int solution(int n, int[][] wires) { + int answer = 999999999; + + Map> map = new HashMap<>(); + + for (int i = 1; i <= n; i++) { + map.put(i, new HashSet<>()); + } + + for (int[] wire : wires) { + int v1 = wire[0]; + int v2 = wire[1]; + + Set set1 = map.get(v1); + Set set2 = map.get(v2); + +// set1.add(v1); + set1.add(v2); + set2.add(v1); +// set2.add(v2); + + map.put(v1, set1); + map.put(v2, set2); + } + + System.out.println(map); + + for (int[] wire : wires) { + int count1 = countConnectedTower(map, wire[0], wire[1]); + int count2 = countConnectedTower(map, wire[1], wire[0]);; + + int diffCount = Math.abs(count1 - count2); + + if (diffCount < answer) { + answer = diffCount; + } + } + + return answer; + } + + public int countConnectedTower(Map> map, int targetNode, int excludeNode) { + Set connectNode = new HashSet<>(); + Set nodes = map.get(targetNode); + + for (int key : nodes) { + if (key == excludeNode) { + continue; + } + + connectNode.addAll(map.get(key)); + } + + return connectNode.size() + 1; + } + + + public static void main(String[] args) { + // 반례 + // 9, [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9]] + // 1 + int n = 9; + int[][] wires = {{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}, {6, 7}, {7, 8}, {8, 9}}; + + Solution86971 solution = new Solution86971(); + + int answer = solution.solution(n, wires); + + System.out.println(answer); + } + +} From f6a3dcf9acb5f022086805635c942d782b88d1a1 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Mon, 13 May 2024 22:23:08 +0900 Subject: [PATCH 23/30] Programmers Solution 86971 --- .../programmers/lv2/Solution86971.java | 80 +++++++++++-------- 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution86971.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution86971.java index 101f6ec..874749b 100644 --- a/src/main/java/com/example/algorithm/programmers/lv2/Solution86971.java +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution86971.java @@ -8,67 +8,77 @@ public class Solution86971 { // wires : [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]] // return : 3 + // 반례 + // n :9 + // wires: [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9]] + // return : 1 + public int solution(int n, int[][] wires) { int answer = 999999999; - Map> map = new HashMap<>(); + // 0번 인덱스는 사용하지 않음 + List> graph = new ArrayList<>(); + for (int i = 0; i <= n; i++) { + graph.add(new ArrayList<>()); + } - for (int i = 1; i <= n; i++) { - map.put(i, new HashSet<>()); + // 인접 리스트 생성 + for (int[] wire : wires) { + graph.get(wire[0]).add(wire[1]); + graph.get(wire[1]).add(wire[0]); + System.out.println(graph); } + // 각 간선을 제거하고 bfs로 탐색 for (int[] wire : wires) { int v1 = wire[0]; int v2 = wire[1]; - Set set1 = map.get(v1); - Set set2 = map.get(v2); + // 간선 제거 + graph.get(v1).remove(Integer.valueOf(v2)); + graph.get(v2).remove(Integer.valueOf(v1)); -// set1.add(v1); - set1.add(v2); - set2.add(v1); -// set2.add(v2); + int aCount = bfs(graph, v1, n); + int bCount = bfs(graph, v2, n); - map.put(v1, set1); - map.put(v2, set2); - } - - System.out.println(map); - - for (int[] wire : wires) { - int count1 = countConnectedTower(map, wire[0], wire[1]); - int count2 = countConnectedTower(map, wire[1], wire[0]);; + int diff = Math.abs(aCount - bCount); - int diffCount = Math.abs(count1 - count2); + answer = Math.min(answer, diff); - if (diffCount < answer) { - answer = diffCount; - } + // 제거한 간선 복구 + graph.get(v1).add(v2); + graph.get(v2).add(v1); } return answer; } - public int countConnectedTower(Map> map, int targetNode, int excludeNode) { - Set connectNode = new HashSet<>(); - Set nodes = map.get(targetNode); + private int bfs(List> graph, int start, int n) { + Queue queue = new LinkedList<>(); + boolean[] visited = new boolean[n + 1]; - for (int key : nodes) { - if (key == excludeNode) { - continue; - } + queue.offer(start); + visited[start] = true; + + int count = 1; - connectNode.addAll(map.get(key)); + while (!queue.isEmpty()) { + int current = queue.poll(); + + // 현재 노드와 연결된 노드 탐색 + for (int next : graph.get(current)) { + if (!visited[next]) { + queue.offer(next); + visited[next] = true; + count++; + } + } } - return connectNode.size() + 1; + return count; } - public static void main(String[] args) { - // 반례 - // 9, [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9]] - // 1 int n = 9; int[][] wires = {{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}, {6, 7}, {7, 8}, {8, 9}}; From 1cb73bf6017451f9504d28f30f90ba46a556ecc2 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Tue, 14 May 2024 23:36:41 +0900 Subject: [PATCH 24/30] Programmers Solution 42862 --- .../programmers/lv1/Solution42862.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv1/Solution42862.java diff --git a/src/main/java/com/example/algorithm/programmers/lv1/Solution42862.java b/src/main/java/com/example/algorithm/programmers/lv1/Solution42862.java new file mode 100644 index 0000000..3b90f6e --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv1/Solution42862.java @@ -0,0 +1,66 @@ +package com.example.algorithm.programmers.lv1; + +import java.util.*; + +public class Solution42862 { + + // n : 5 + // lost : [2, 4] + // reserve : [1, 3, 5] + // return : 5 + + public int solution(int n, int[] lost, int[] reserve) { + int answer = n - lost.length; + + // 오름차순 정렬 + Arrays.sort(lost); + Arrays.sort(reserve); + + // 여벌 체육복을 가지고 있지만 도난 당한 경우 + for (int i = 0; i < lost.length; i++) { + for (int j = 0; j < reserve.length; j++) { + if (lost[i] == reserve[j]) { + lost[i] = -1; + reserve[j] = -1; + answer++; + break; + } + } + } + + // 여벌 체육복을 빌려줄 수 있는 경우 + for (int i = 0; i < lost.length; i++) { + if (lost[i] == -1) { + continue; + } + + for (int j = 0; j < reserve.length; j++) { + if (reserve[j] == -1) { + continue; + } + + if (lost[i] == reserve[j] - 1 || lost[i] == reserve[j] + 1) { + answer++; + lost[i] = -1; + reserve[j] = -1; + break; + } + } + } + + return answer; + } + + public static void main(String[] args) { + int n = 5; + int[] lost = {2, 3, 4}; + int[] reserve = {3, 4, 5}; + + Solution42862 solution = new Solution42862(); + + int answer = solution.solution(n, lost, reserve); + + System.out.println(answer); + } + +} From 123714b71999172d71bb22e0a3fa4b9969208e59 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Wed, 29 May 2024 22:31:15 +0900 Subject: [PATCH 25/30] Programmers Solution 84512 --- .../programmers/lv2/Solution84512.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution84512.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution84512.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution84512.java new file mode 100644 index 0000000..f7457b5 --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution84512.java @@ -0,0 +1,49 @@ +package com.example.algorithm.programmers.lv2; + +public class Solution84512 { + + // word : "AAAAE" / "AAAE" / "I" / "EIO + // return : 6 / 10 / 1563 / 1189 + public int solution(String word) { + int answer = 0; + + // 풀이 설명 + // 1. 모음 배열을 만든다. + // 2. 각 모음 별로 가중치를 부여한다. + // 3. 각 자리수 별로 가중치를 부여한다. + // 4. 각 자리수 별로 모음이 나오면 가중치를 더한다. + + // 모음 배열 + String[] vowels = {"A", "E", "I", "O", "U"}; + + // 가중치 배열 + int[] multipliers = {781, 156, 31, 6, 1}; + + // 각 자리수 별로 가중치를 더한다. + for (int i = 0; i < word.length(); i++) { + // 각 자리수 별로 모음이 나오면 가중치를 더한다. + for (int j = 0; j < vowels.length; j++) { + // 모음이 나오면 가중치를 더한다. + if (vowels[j].equals(String.valueOf(word.charAt(i)))) { + // 가중치를 더한다. + answer += 1 + j * multipliers[i]; + // 모음이 나오면 종료 + break; + } + } + } + + return answer; + } + + public static void main(String[] args) { + String word = "AAAAE"; + + Solution84512 solution = new Solution84512(); + + int answer = solution.solution(word); + + System.out.println(answer); + } + +} From 584d7875461ceb8b3c6999a868126adb8035161f Mon Sep 17 00:00:00 2001 From: Sudongk Date: Mon, 3 Jun 2024 20:43:45 +0900 Subject: [PATCH 26/30] Programmers Solution 42860 --- .../programmers/lv2/Solution42860.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42860.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42860.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42860.java new file mode 100644 index 0000000..e818deb --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42860.java @@ -0,0 +1,45 @@ +package com.example.algorithm.programmers.lv2; + +public class Solution42860 { + + // name : "JEROEN" + // return : 56 + + public int solution(String name) { + int answer = 0; + + int length = name.length(); + + // 최대로 가질 수 있는 최대 이동 횟수 + int minMove = length - 1; + + for (int i = 0; i < length; i++) { + // 알파벳 변경 횟수 + answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1); + + // 다음 알파벳이 A인 경우 + int next = i + 1; + while (next < length && name.charAt(next) == 'A') { + next++; + } + + // i번째 문자를 변경하고 다음 문자가 A가 아닌 경우 + minMove = Math.min(minMove, i + length - next + Math.min(i, length - next)); + } + + answer += minMove; + + return answer; + } + + public static void main(String[] args) { + String name = "JEROEN"; + + Solution42860 solution = new Solution42860(); + + int answer = solution.solution(name); + + System.out.println(answer); + } + +} From 4707ad534ba71e0372445a36e629e430a4f1a99e Mon Sep 17 00:00:00 2001 From: Sudongk Date: Mon, 10 Jun 2024 23:07:49 +0900 Subject: [PATCH 27/30] =?UTF-8?q?Programmers=20Solution=2043165=20?= =?UTF-8?q?=ED=83=80=EC=9E=84=EC=95=84=EC=9B=83=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/algorithm/AsyncExample2.java | 2 +- .../programmers/lv2/Solution43165.java | 35 ++++++++----------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/example/algorithm/AsyncExample2.java b/src/main/java/com/example/algorithm/AsyncExample2.java index a640c36..afdbe55 100644 --- a/src/main/java/com/example/algorithm/AsyncExample2.java +++ b/src/main/java/com/example/algorithm/AsyncExample2.java @@ -6,7 +6,7 @@ public static void main(String[] args) { new Thread(() -> { try { - Thread.sleep(500); + Thread.sleep(510); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution43165.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution43165.java index f38709e..540f80c 100644 --- a/src/main/java/com/example/algorithm/programmers/lv2/Solution43165.java +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution43165.java @@ -4,38 +4,31 @@ public class Solution43165 { // numbers : [1, 1, 1, 1, 1] // target : 3 // result : 5 + + // 결과값 저장 private static int cnt = 0; + // numbers 배열의 모든 경우의 수를 탐색하여 target과 일치하는 경우의 수를 구함 public int solution(int[] numbers, int target) { - // DFS를 이용해 풀이 - dfs(0, target, numbers); - + dfs(numbers, target, 0, 0); return cnt; } - public void dfs(int index, int target, int[] numbers) { - // 주어진 배열의 마지막 자리일 경우 - if (index == numbers.length) { - // sum 초기화 - int sum = 0; - - for (int i = 0; i < numbers.length; i++) { - // sum에 주어진 배열의 수를 더한다 - sum += numbers[i]; - } - // 배열을 모두 더한 값이 target과 같은 경우 + // 깊이 우선 탐색 + private void dfs(int[] numbers, int target, int sum, int depth) { + // numbers 배열의 모든 원소를 탐색한 경우 + if (depth == numbers.length) { + // target과 일치하는 경우의 수를 증가 if (sum == target) { cnt++; } - } - // 마지막 자리가 아닐 경우 재귀함수를 통해 부호를 바꿔가며 탐색 - else { - numbers[index] *= 1; - dfs(index + 1, target, numbers); - numbers[index] *= -1; - dfs(index + 1, target, numbers); + // 종료 + return; } + + dfs(numbers, target, sum + numbers[depth], depth + 1); + dfs(numbers, target, sum - numbers[depth], depth + 1); } public static void main(String[] args) { From 3cda40aca4889833c65184036779b44bd44f77f2 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Fri, 28 Jun 2024 21:26:40 +0900 Subject: [PATCH 28/30] =?UTF-8?q?=EA=B9=8A=EC=9D=B4=20=EC=9A=B0=EC=84=A0?= =?UTF-8?q?=20=ED=83=90=EC=83=89(dfs)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/algorithm/AsyncExample.java | 26 ----------- .../com/example/algorithm/AsyncExample2.java | 34 -------------- .../com/example/algorithm/BilliardBall.java | 39 ---------------- .../example/algorithm/StringNumToIntNum.java | 17 ------- .../algorithm/practice/DepthFirstSearch.java | 45 +++++++++++++++++++ 5 files changed, 45 insertions(+), 116 deletions(-) delete mode 100644 src/main/java/com/example/algorithm/AsyncExample.java delete mode 100644 src/main/java/com/example/algorithm/AsyncExample2.java delete mode 100644 src/main/java/com/example/algorithm/BilliardBall.java delete mode 100644 src/main/java/com/example/algorithm/StringNumToIntNum.java create mode 100644 src/main/java/com/example/algorithm/practice/DepthFirstSearch.java diff --git a/src/main/java/com/example/algorithm/AsyncExample.java b/src/main/java/com/example/algorithm/AsyncExample.java deleted file mode 100644 index 31d2221..0000000 --- a/src/main/java/com/example/algorithm/AsyncExample.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.algorithm; - -public class AsyncExample { - - public static void main(String[] args) { - // 비동기인데 왜 순차적으로 실행되는 이유 -> 메인 스레드가 종료되면 프로그램이 종료되기 때문 - // 같은 스레드라서 순차적으로 실행되는거 같은데 맞아? -> 맞아 - - try { - System.out.println("첫 번째 작업"); - System.out.println(Thread.currentThread().getName()); - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - try { - System.out.println("두 번째 작업"); - System.out.println(Thread.currentThread().getName()); - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - -} diff --git a/src/main/java/com/example/algorithm/AsyncExample2.java b/src/main/java/com/example/algorithm/AsyncExample2.java deleted file mode 100644 index afdbe55..0000000 --- a/src/main/java/com/example/algorithm/AsyncExample2.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.example.algorithm; - -public class AsyncExample2 { - - public static void main(String[] args) { - - new Thread(() -> { - try { - Thread.sleep(510); - System.out.println(Thread.currentThread().getName()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }).start(); - - new Thread(() -> { - try { - Thread.sleep(500); - System.out.println(Thread.currentThread().getName()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }).start(); - - try { - Thread.sleep(2000); - System.out.println("메인 스레드 종료"); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - -} diff --git a/src/main/java/com/example/algorithm/BilliardBall.java b/src/main/java/com/example/algorithm/BilliardBall.java deleted file mode 100644 index 1203b3b..0000000 --- a/src/main/java/com/example/algorithm/BilliardBall.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.example.algorithm; - -import static java.lang.Thread.*; - -public class BilliardBall { - public static void main(String[] args) throws InterruptedException { - - int w = 10; // 당구대 너비 - int h = 5; // 당구대 높이 - int r = 1; // 당구공 반지름 - int x = 3; // 초기 x 좌표 - int y = 3; // 초기 y 좌표 - int dx = 1; // x 방향 속도 - int dy = 1; // y 방향 속도 - - while (true) { - sleep(1000); - - int newX = x + dx; - int newY = y + dy; - - - // CodeA: 공이 당구대의 왼쪽, 오른쪽 벽에 부딪치면 - if (newX - r < 0 || newX + r > w) { - // CodeB: x축 방향을 바꾼다 - dx = -dx; - } - - // CodeA: 공이 당구대의 위쪽, 아래쪽 벽에 부딪치면 - if (newY - r < 0 || newY + r > h) { - // CodeB: y축 방향을 바꾼다 - dy = -dy; - } - - x = newX; - y = newY; - } - } -} diff --git a/src/main/java/com/example/algorithm/StringNumToIntNum.java b/src/main/java/com/example/algorithm/StringNumToIntNum.java deleted file mode 100644 index ffbb738..0000000 --- a/src/main/java/com/example/algorithm/StringNumToIntNum.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.algorithm; - -public class StringNumToIntNum { - - public static void main(String[] args) { - String a = "12345"; - int i = 0; - - for (int j = 0; j < a.length(); j++) { - i *= 10; - i += a.charAt(j) - '0'; - } - - System.out.println(i); - } - -} diff --git a/src/main/java/com/example/algorithm/practice/DepthFirstSearch.java b/src/main/java/com/example/algorithm/practice/DepthFirstSearch.java new file mode 100644 index 0000000..59bb8a0 --- /dev/null +++ b/src/main/java/com/example/algorithm/practice/DepthFirstSearch.java @@ -0,0 +1,45 @@ +package com.example.algorithm.practice; + +public class DepthFirstSearch { + + /* + * 깊이 우선 탐색 풀이 방식 (Depth First Search) + * 1. 시작 정점을 스택에 넣는다. + * 2. 스택에서 정점을 꺼내 방문한다. + * 3. 방문한 정점에서 인접한 정점 중 방문하지 않은 정점을 스택에 넣는다. + * 4. 스택이 빌 때까지 2~3을 반복한다. + * + * 깊이 우선 탐색이 필요한 경우 대표 3 가지 + * 1. 그래프의 모든 정점을 방문하는 경우 + * 2. 그래프의 연결 요소를 찾는 경우 + * 3. 그래프의 사이클을 찾는 경우 + */ + + public void dfs(int[][] graph, boolean[] visited, int start) { + visited[start] = true; + System.out.print(start + " "); + + for (int i = 0; i < graph[start].length; i++) { + if (graph[start][i] == 1 && !visited[i]) { + dfs(graph, visited, i); + } + } + } + + public static void main(String[] args) { + int[][] graph = { + {0, 1, 1, 0, 0, 0}, + {1, 0, 0, 1, 1, 0}, + {1, 0, 0, 0, 1, 0}, + {0, 1, 0, 0, 1, 1}, + {0, 1, 1, 1, 0, 1}, + {0, 0, 0, 1, 1, 0} + }; + + boolean[] visited = new boolean[graph.length]; + + DepthFirstSearch dfs = new DepthFirstSearch(); + dfs.dfs(graph, visited, 0); + } + +} From 6ecd773a0387c8bb3612191e455593afb7adf1d9 Mon Sep 17 00:00:00 2001 From: Sudongk Date: Sat, 29 Jun 2024 18:33:06 +0900 Subject: [PATCH 29/30] =?UTF-8?q?=EB=84=97=EC=9D=B4=20=EC=9A=B0=EC=84=A0?= =?UTF-8?q?=20=ED=83=90=EC=83=89(bfs)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practice/BreadthFirstSearch.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/main/java/com/example/algorithm/practice/BreadthFirstSearch.java diff --git a/src/main/java/com/example/algorithm/practice/BreadthFirstSearch.java b/src/main/java/com/example/algorithm/practice/BreadthFirstSearch.java new file mode 100644 index 0000000..e186902 --- /dev/null +++ b/src/main/java/com/example/algorithm/practice/BreadthFirstSearch.java @@ -0,0 +1,55 @@ +package com.example.algorithm.practice; + +public class BreadthFirstSearch { + + /* + * 너비 우선 탐색 풀이 방식 (Breadth First Search) + * 1. 시작 정점을 큐에 넣는다. + * 2. 큐에서 정점을 꺼내 방문한다. + * 3. 방문한 정점에서 인접한 정점 중 방문하지 않은 정점을 큐에 넣는다. + * 4. 큐가 빌 때까지 2~3을 반복한다. + * + * 너비 우선 탐색이 필요한 경우 대표 3 가지 + * 1. 최단 경로를 찾는 경우 + * 2. 임의의 경로를 찾는 경우 + * 3. 모든 정점을 방문하는 경우 + */ + + public void bfs(int[][] graph, boolean[] visited, int start) { + int[] queue = new int[graph.length]; + int front = 0; + int rear = 0; + + queue[rear++] = start; + visited[start] = true; + + while (front < rear) { + int current = queue[front++]; + System.out.print(current + " "); + + for (int i = 0; i < graph[current].length; i++) { + if (graph[current][i] == 1 && !visited[i]) { + queue[rear++] = i; + visited[i] = true; + } + } + } + } + + public static void main(String[] args) { + int[][] graph = { + {0, 1, 1, 0, 0, 0}, + {1, 0, 0, 1, 1, 0}, + {1, 0, 0, 0, 1, 0}, + {0, 1, 0, 0, 1, 1}, + {0, 1, 1, 1, 0, 1}, + {0, 0, 0, 1, 1, 0} + }; + + boolean[] visited = new boolean[graph.length]; + + BreadthFirstSearch bfs = new BreadthFirstSearch(); + bfs.bfs(graph, visited, 0); + } + +} From bc8337794706bbcfec63f358b9a3c8f28c51fe7e Mon Sep 17 00:00:00 2001 From: Sudongk Date: Wed, 3 Jul 2024 18:56:23 +0900 Subject: [PATCH 30/30] Programmers Solution 42883 --- .../programmers/lv2/Solution42883.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/main/java/com/example/algorithm/programmers/lv2/Solution42883.java diff --git a/src/main/java/com/example/algorithm/programmers/lv2/Solution42883.java b/src/main/java/com/example/algorithm/programmers/lv2/Solution42883.java new file mode 100644 index 0000000..d7e4e9a --- /dev/null +++ b/src/main/java/com/example/algorithm/programmers/lv2/Solution42883.java @@ -0,0 +1,50 @@ +package com.example.algorithm.programmers.lv2; + +public class Solution42883 { + + // number : "1924" / "1231234" / "4177252841" + // k : 2 / 3 / 4 + // return : "94" / "3234" / "775841" + + public String solution(String number, int k) { + String answer = ""; + + String[] num_arr = number.split(""); + + int len = number.length() - k; + int start = 0; + int end = k; + + for (int i = 0; i < len; i++) { + int max = 0; + int idx = 0; + + for (int j = start; j <= end; j++) { + int num = Integer.parseInt(num_arr[j]); + + if (max < num) { + max = num; + idx = j; + } + } + + answer += max; + start = idx + 1; + end++; + } + + return answer; + } + + public static void main(String[] args) { + String number = "4177252841"; + int k = 4; + + Solution42883 solution = new Solution42883(); + + String answer = solution.solution(number, k); + + System.out.println(answer); + } + +}