diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..e3a631f --- /dev/null +++ b/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group = 'org.studies' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:5.9.1') + testImplementation 'org.junit.jupiter:junit-jupiter' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..795d5c3 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'algorithm-study2' + diff --git a/src/main/java/org/studies/Main.java b/src/main/java/org/studies/Main.java new file mode 100644 index 0000000..34915d7 --- /dev/null +++ b/src/main/java/org/studies/Main.java @@ -0,0 +1,7 @@ +package org.studies; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello pollra!"); + } +} \ No newline at end of file diff --git a/src/main/java/org/studies/kakao/one/EXPLANATION.md b/src/main/java/org/studies/kakao/one/EXPLANATION.md new file mode 100644 index 0000000..c1a848d --- /dev/null +++ b/src/main/java/org/studies/kakao/one/EXPLANATION.md @@ -0,0 +1,15 @@ +# 문제 + +- [Level.2] [두 큐 합 같게 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/118667) + +### 시간 복잡도 + +O(n) + +### 공간 복잡도 + +O(1) + +### 풀이 결과 + +![스크린샷 2023-11-21 오후 2.38.46.png](%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202023-11-21%20%EC%98%A4%ED%9B%84%202.38.46.png) diff --git a/src/main/java/org/studies/kakao/one/MakeTheTwoQueuesEqual.java b/src/main/java/org/studies/kakao/one/MakeTheTwoQueuesEqual.java new file mode 100644 index 0000000..5c935f2 --- /dev/null +++ b/src/main/java/org/studies/kakao/one/MakeTheTwoQueuesEqual.java @@ -0,0 +1,66 @@ +package org.studies.kakao.one; + +import java.util.Arrays; + +public class MakeTheTwoQueuesEqual { + public int solution(int[] queue1, int[] queue2) { + int count = 0; + long queue1Sum = sum(queue1); + long queue2Sum = sum(queue2); + long totalSum = queue1Sum + queue2Sum; + long reference = totalSum/2; + + if (queue1Sum == reference) { + return 0; + } + if (queue1.length == 1 || totalSum % 2 == 1) { + return -1; + } + int limitSwitching = queue1.length + queue2.length + 1; + + long minusSum = 0; + long plusSum = 0; + + int query1Index = 0; + int query2Index = 0; + + for (int i = 0; i <= limitSwitching; i++) { + if (reference == plusSum + queue1Sum - minusSum) { + break; + } + if (reference < plusSum + queue1Sum - minusSum) { + long pop = pop(queue1, query1Index++, queue2); + minusSum += pop; + count++; + System.out.println(Arrays.toString(queue1) + ", " + Arrays.toString(queue2) + "plus["+plusSum+"]/minus["+minusSum+"]/origin:["+queue1Sum+"]/pop1:["+pop+"]"); + } else if (reference > plusSum + queue1Sum - minusSum) { + long pop = pop(queue2, query2Index++, queue1); + plusSum += pop; + count++; + System.out.println(Arrays.toString(queue1) + ", " + Arrays.toString(queue2) + "plus["+plusSum+"]/minus["+minusSum+"]/origin:["+queue1Sum+"]/pop2:["+pop+"]"); + } + } + + if (reference == plusSum + queue1Sum - minusSum){ + System.out.println(Arrays.toString(queue1) + ", " + Arrays.toString(queue2) + "plus["+plusSum+"]/minus["+minusSum+"]/origin:["+queue1Sum+"]"); + return count; + } + + return -1; + } + + public long sum(int[] array) { + long result = 0L; + for (int i : array) { + result += i; + } + return result; + } + + public long pop(int[] array1, int arrayIndex, int[] array2) { + if (arrayIndex / array1.length % 2 == 0) { + return array1[arrayIndex % array1.length]; + } + return array2[arrayIndex % array1.length]; + } +} diff --git "a/src/main/java/org/studies/kakao/one/\354\212\244\355\201\254\353\246\260\354\203\267 2023-11-21 \354\230\244\355\233\204 2.38.46.png" "b/src/main/java/org/studies/kakao/one/\354\212\244\355\201\254\353\246\260\354\203\267 2023-11-21 \354\230\244\355\233\204 2.38.46.png" new file mode 100644 index 0000000..ecd1a21 Binary files /dev/null and "b/src/main/java/org/studies/kakao/one/\354\212\244\355\201\254\353\246\260\354\203\267 2023-11-21 \354\230\244\355\233\204 2.38.46.png" differ diff --git a/src/test/java/org/studies/kakao/one/MakeTheTwoQueuesEqualTest.java b/src/test/java/org/studies/kakao/one/MakeTheTwoQueuesEqualTest.java new file mode 100644 index 0000000..e22bd3c --- /dev/null +++ b/src/test/java/org/studies/kakao/one/MakeTheTwoQueuesEqualTest.java @@ -0,0 +1,85 @@ +package org.studies.kakao.one; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("Kakao TECH - 두 큐 합 같게 만들기") +class MakeTheTwoQueuesEqualTest { + + MakeTheTwoQueuesEqual makeTheTwoQueuesEqual = new MakeTheTwoQueuesEqual(); + + @Test + @DisplayName("[3, 2, 7, 2], [4, 6, 5, 1] => 2") + void example01() { + int solution = makeTheTwoQueuesEqual.solution(new int[] {3, 2, 7, 2}, new int[] {4, 6, 5, 1}); + + assertEquals(solution, 2); + } + + @Test + @DisplayName("[1, 2, 1, 2], [1, 10, 1, 2] => 7") + void example02() { + int solution = makeTheTwoQueuesEqual.solution(new int[] {1, 2, 1, 2}, new int[] {1, 10, 1, 2}); + + assertEquals(solution, 7); + } + + @Test + @DisplayName("[1, 1], [1, 5] => -1") + void example03() { + int solution = makeTheTwoQueuesEqual.solution(new int[] {1, 1}, new int[] {1, 5}); + + assertEquals(solution, -1); + } + + @Test + @DisplayName("[2], [1] => -1") + void example04() { + int solution = makeTheTwoQueuesEqual.solution(new int[] {2}, new int[] {1}); + + assertEquals(solution, -1); + } + + @Test + @DisplayName("[2, 5], [1, 3] => -1") + void example05() { + int solution = makeTheTwoQueuesEqual.solution(new int[] {2, 5}, new int[] {1, 3}); + + assertEquals(solution, -1); + } + + @Test + @DisplayName("[1, 1, 1, 1, 1, 1, 1, 1, 1, 10], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] => -1") + void example06() { + int solution = makeTheTwoQueuesEqual.solution(new int[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 10}, new int[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}); + + assertEquals(solution, -1); + } + + /** + * 예외 케이스: + * [1, 1, 1, 1, 1], [1, 1, 1, 9, 1] + * + * [1, 1, 1, 1, 1, 1], [1, 1, 9, 1]pop2:[1] + * [1, 1, 1, 1, 1, 1, 1], [1, 9, 1]pop2:[1] + * [1, 1, 1, 1, 1, 1, 1, 1], [9, 1]pop2:[1] + * [1, 1, 1, 1, 1, 1, 1, 1, 9], [1]pop2:[9] + * [1, 1, 1, 1, 1, 1, 1, 9], [1, 1]pop1:[1] + * [1, 1, 1, 1, 1, 1, 9], [1, 1, 1]pop1:[1] + * [1, 1, 1, 1, 1, 9], [1, 1, 1, 1]pop1:[1] + * [1, 1, 1, 1, 9], [1, 1, 1, 1, 1]pop1:[1] + * [1, 1, 1, 9], [1, 1, 1, 1, 1, 1]pop1:[1] + * [1, 1, 9], [1, 1, 1, 1, 1, 1, 1]pop1:[1] + * [1, 9], [1, 1, 1, 1, 1, 1, 1, 1]pop1:[0] + * [9], [1, 1, 1, 1, 1, 1, 1, 1, 1]...? + */ + @Test + @DisplayName("[1, 1, 1, 1, 1], [1, 1, 1, 9, 1] => 12") + void example07() { + int solution = makeTheTwoQueuesEqual.solution(new int[] {1, 1, 1, 1, 1}, new int[] {1, 1, 1, 9, 1}); + + assertEquals(solution, 12); + } +} \ No newline at end of file