From 34ed3f3d74845b54cc58f1e7b03ef580f99a824f Mon Sep 17 00:00:00 2001 From: LocKey Date: Sun, 1 Sep 2024 02:27:40 +0900 Subject: [PATCH 01/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=201=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem1.java | 60 +++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/src/main/java/onboarding/Problem1.java b/src/main/java/onboarding/Problem1.java index b99e6b5e67..fe5890cc01 100644 --- a/src/main/java/onboarding/Problem1.java +++ b/src/main/java/onboarding/Problem1.java @@ -1,10 +1,68 @@ package onboarding; +import java.util.ArrayList; import java.util.List; class Problem1 { public static int solution(List pobi, List crong) { - int answer = Integer.MAX_VALUE; + int answer; + + // 예외 처리 + if(pobi.size() != 2 || crong.size() != 2) { + return -1; + } + if(pobi.get(0) <= 1 || crong.get(0) <= 1 || pobi.get(1) >= 400 || crong.get(1) >= 400) { + return -1; + } + if(pobi.get(1) <= pobi.get(0) || pobi.get(1) - pobi.get(0) != 1 || crong.get(1) <= crong.get(0) || crong.get(1) - crong.get(0) != 1) { + return -1; + } + + int pobiSum = maxSum(pobi); + int crongSum = maxSum(crong); + if(pobiSum > crongSum) answer = 1; + else if(pobiSum < crongSum) answer = 2; + else answer = 0; + return answer; } + public static List splitDigit(int number) { + List result = new ArrayList<>(); + + while(number > 0) { + result.add(0, number % 10); + number = number / 10; + } + return result; + } + + public static Integer plusAll(List allDigit) { + int sum = 0; + for(int i = 0; i < allDigit.size(); i++) { + sum += allDigit.get(i); + } + return sum; + } + + public static Integer multiplyAll(List allDigit) { + int sum = 1; + for(int i = 0; i < allDigit.size(); i++) { + sum *= allDigit.get(i); + } + return sum; + } + + public static Integer plusMultiplyComp(Integer LR) { + List LRDigit = splitDigit(LR); + int plusLeftSum = plusAll(LRDigit); + int multiplyLeftSum = multiplyAll(LRDigit); + return Math.max(plusLeftSum, multiplyLeftSum); + } + + public static Integer maxSum(List user) { + int maxLeftSum = plusMultiplyComp(user.get(0)); + int maxRightSum = plusMultiplyComp(user.get(1)); + + return Math.max(maxLeftSum, maxRightSum); + } } \ No newline at end of file From a11e2e7f41174cb578db7741b4ad2b99f10845b6 Mon Sep 17 00:00:00 2001 From: LocKey Date: Sun, 1 Sep 2024 03:39:03 +0900 Subject: [PATCH 02/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=202=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem2.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/onboarding/Problem2.java b/src/main/java/onboarding/Problem2.java index ee836e9cac..fbda76d182 100644 --- a/src/main/java/onboarding/Problem2.java +++ b/src/main/java/onboarding/Problem2.java @@ -2,7 +2,21 @@ public class Problem2 { public static String solution(String cryptogram) { - String answer = "answer"; + String answer; + + while(true) { + int count = 0; + for (int i = 0; i < cryptogram.length() - 1; i++) { + if (cryptogram.charAt(i) == cryptogram.charAt(i + 1)) { + cryptogram = cryptogram.substring(0, i) + cryptogram.substring(i + 2); + i--; + count++; + } + } + if(count == 0) break; + } + + answer = cryptogram; return answer; } } From b14b253df579271431c1a0677c5d504891be8554 Mon Sep 17 00:00:00 2001 From: LocKey Date: Sun, 1 Sep 2024 14:35:48 +0900 Subject: [PATCH 03/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=203=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem3.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/onboarding/Problem3.java b/src/main/java/onboarding/Problem3.java index 12e095d6e3..775715781a 100644 --- a/src/main/java/onboarding/Problem3.java +++ b/src/main/java/onboarding/Problem3.java @@ -1,8 +1,19 @@ package onboarding; +import java.util.List; + public class Problem3 { public static int solution(int number) { int answer = 0; + for(int i = 1; i <= number; i++) { + List digits = Problem1.splitDigit(i); + for(int j = 0; j < digits.size(); j++) { + if(digits.get(j) == 3 || digits.get(j) == 6 || digits.get(j) == 9) { + answer++; + } + } + } + return answer; } } From 1eb140ead2d33312adfab3701f8dcd292ff9cc66 Mon Sep 17 00:00:00 2001 From: LocKey Date: Sun, 1 Sep 2024 15:05:58 +0900 Subject: [PATCH 04/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=204=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem4.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/onboarding/Problem4.java b/src/main/java/onboarding/Problem4.java index 9bc4334fa9..589f2be00a 100644 --- a/src/main/java/onboarding/Problem4.java +++ b/src/main/java/onboarding/Problem4.java @@ -3,6 +3,24 @@ public class Problem4 { public static String solution(String word) { String answer = ""; + + for(int i = 0; i < word.length(); i++) { + char c = word.charAt(i); + + if(c == ' ') { + answer += ' '; + continue; + } + + char newChar; + if(c >= 97) { //소문자 + newChar = (char) (219 - c); + } else { // 대문자 + newChar = (char) (155 - c); + } + answer += newChar; + } + return answer; } } From 6c8e2ba1412d033c295dfafc4dc2c44a9f5ceac2 Mon Sep 17 00:00:00 2001 From: LocKey Date: Sun, 1 Sep 2024 15:44:01 +0900 Subject: [PATCH 05/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=205=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem5.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/onboarding/Problem5.java b/src/main/java/onboarding/Problem5.java index d6c4dbe09b..62f9222d7d 100644 --- a/src/main/java/onboarding/Problem5.java +++ b/src/main/java/onboarding/Problem5.java @@ -1,11 +1,28 @@ package onboarding; +import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Problem5 { public static List solution(int money) { - List answer = Collections.emptyList(); + List answer = new ArrayList<>(); + List moneyUnit = new ArrayList<>() {{ + add(50000); + add(10000); + add(5000); + add(1000); + add(500); + add(100); + add(50); + add(10); + add(1); + }}; + + for(int i = 0; i < moneyUnit.size(); i++) { + answer.add(money / moneyUnit.get(i)); + money = money % moneyUnit.get(i); + } return answer; } } From 4e66704ce082938156599f78e933ab966556c953 Mon Sep 17 00:00:00 2001 From: LocKey Date: Sun, 1 Sep 2024 17:07:08 +0900 Subject: [PATCH 06/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=206=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem6.java | 32 +++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/onboarding/Problem6.java b/src/main/java/onboarding/Problem6.java index f6c7b32344..eaddca45da 100644 --- a/src/main/java/onboarding/Problem6.java +++ b/src/main/java/onboarding/Problem6.java @@ -1,10 +1,40 @@ package onboarding; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; public class Problem6 { public static List solution(List> forms) { - List answer = List.of("answer"); + List answer = new ArrayList<>(); + + for(int i = 0; i < forms.size(); i++) { + String name = forms.get(i).get(1); + String email = forms.get(i).get(0); + + if(answer.contains(email)) continue; + + for(int j = i + 1; j < forms.size(); j++) { + String compName = forms.get(j).get(1); + String compEmail = forms.get(j).get(0); + + if(answer.contains(compEmail)) continue; + + for(int k = 0; k < compName.length() - 1; k++) { + String subString = compName.substring(k, k + 2); + if(name.contains(subString)) { + answer.add(forms.get(j).get(0)); + if(!answer.contains(email)) { + answer.add(forms.get(i).get(0)); + } + break; + } + } + + } + } + answer.sort(Comparator.naturalOrder()); + return answer; } } From cb16b8e485b0166980e0d607120a0a99818bd48b Mon Sep 17 00:00:00 2001 From: LocKey Date: Sun, 1 Sep 2024 22:05:12 +0900 Subject: [PATCH 07/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=207=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem7.java | 68 ++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/src/main/java/onboarding/Problem7.java b/src/main/java/onboarding/Problem7.java index 365540f5cd..a6cd7d9733 100644 --- a/src/main/java/onboarding/Problem7.java +++ b/src/main/java/onboarding/Problem7.java @@ -1,11 +1,73 @@ package onboarding; -import java.util.Collections; -import java.util.List; +import java.util.*; public class Problem7 { + + static HashMap map = new HashMap<>(); public static List solution(String user, List> friends, List visitors) { - List answer = Collections.emptyList(); + List answer = new ArrayList<>(5); + + List userFriend = friendPoint(user, friends); + visitorPoint(visitors, userFriend); + + List> entries = new ArrayList<>(map.entrySet()); + + entries.sort((entry1, entry2) -> { + int valueComp = entry2.getValue().compareTo(entry1.getValue()); + if(valueComp == 0) { + return entry1.getKey().compareTo(entry2.getKey()); + } else { + return valueComp; + } + }); + + for(int i = 0; i < Math.min(5, entries.size()); i++) { //리스트의 크기가 5보다 작은 경우, 범위를 리스트 크기에 맞추기 위해 사용 + answer.add(entries.get(i).getKey()); + } + return answer; } + + public static List friendPoint(String user, List> friends) { + List userFriend = new ArrayList<>(); + + for(int i = 0; i < friends.size(); i++) { + if(friends.get(i).contains(user)) { + String friendName; + if(friends.get(i).get(0) == user) friendName = friends.get(i).get(1); + else friendName = friends.get(i).get(0); + userFriend.add(friendName); + + for(int j = 0; j < friends.size(); j++) { + if(friends.get(j).contains(friendName) && !friends.get(j).contains(user)) { + String togetherKnownFriend; + if(friends.get(j).get(0) == friendName) togetherKnownFriend = friends.get(j).get(1); + else togetherKnownFriend = friends.get(j).get(0); + if(!map.containsKey(togetherKnownFriend)) { + map.put(togetherKnownFriend, 10); + } else { + int point = map.get(togetherKnownFriend); + map.put(togetherKnownFriend, point + 10); + } + } + } + } + } + return userFriend; + } + + public static void visitorPoint(List visitors, List userFriend) { + for(int i = 0; i < visitors.size(); i++) { + String name = visitors.get(i); + if(!userFriend.contains(name)) { + if (map.containsKey(name)) { + int point = map.get(name); + map.put(name, point + 1); + } else { + map.put(name, 1); + } + } + } + } } From 4d345d14b16ed2606f1b920b79071d8d6f0c163f Mon Sep 17 00:00:00 2001 From: LocKey Date: Sun, 15 Sep 2024 21:08:05 +0900 Subject: [PATCH 08/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=201=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80,=20test=20code?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem1.java | 3 ++ src/test/java/onboarding/ApplicationTest.java | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/main/java/onboarding/Problem1.java b/src/main/java/onboarding/Problem1.java index fe5890cc01..b47d39a54a 100644 --- a/src/main/java/onboarding/Problem1.java +++ b/src/main/java/onboarding/Problem1.java @@ -17,6 +17,9 @@ public static int solution(List pobi, List crong) { if(pobi.get(1) <= pobi.get(0) || pobi.get(1) - pobi.get(0) != 1 || crong.get(1) <= crong.get(0) || crong.get(1) - crong.get(0) != 1) { return -1; } + if(pobi.get(0) % 2 != 1 || crong.get(0) % 2 != 1 || pobi.get(1) % 2 != 0 || crong.get(1) % 2 != 0) { + return -1; + } int pobiSum = maxSum(pobi); int crongSum = maxSum(crong); diff --git a/src/test/java/onboarding/ApplicationTest.java b/src/test/java/onboarding/ApplicationTest.java index 4cdf3ed0ef..0e0e112c04 100644 --- a/src/test/java/onboarding/ApplicationTest.java +++ b/src/test/java/onboarding/ApplicationTest.java @@ -33,6 +33,38 @@ void case3() { int result = -1; assertThat(Problem1.solution(pobi, crong)).isEqualTo(result); } + + @Test + void case4() { + List pobi = List.of(1, 2, 3); + List crong = List.of(4, 5); + int result = -1; + assertThat(Problem1.solution(pobi, crong)).isEqualTo(result); + } + + @Test + void case5() { + List pobi = List.of(399, 400); + List crong = List.of(3, 4); + int result = -1; + assertThat(Problem1.solution(pobi, crong)).isEqualTo(result); + } + + @Test + void case6() { + List pobi = List.of(102, 99); + List crong = List.of(4, 5); + int result = -1; + assertThat(Problem1.solution(pobi, crong)).isEqualTo(result); + } + + @Test + void case7() { + List pobi = List.of(3, 4); + List crong = List.of(200, 201); + int result = -1; + assertThat(Problem1.solution(pobi, crong)).isEqualTo(result); + } } @Nested From b0538dee7ba51d6970e924dfc61d015a59d71eb0 Mon Sep 17 00:00:00 2001 From: LocKey Date: Mon, 16 Sep 2024 03:34:26 +0900 Subject: [PATCH 09/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=202=20=EC=97=B0?= =?UTF-8?q?=EC=86=8D=EB=90=9C=202=EA=B0=9C=20=EC=9D=B4=EC=83=81=EC=9D=98?= =?UTF-8?q?=20=EB=AC=B8=EC=9E=90=20=EC=B2=98=EB=A6=AC,=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=EC=82=AC=ED=95=AD=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem2.java | 39 ++++++++++++++----- src/test/java/onboarding/ApplicationTest.java | 28 +++++++++++++ 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/main/java/onboarding/Problem2.java b/src/main/java/onboarding/Problem2.java index fbda76d182..5693fc23a3 100644 --- a/src/main/java/onboarding/Problem2.java +++ b/src/main/java/onboarding/Problem2.java @@ -2,21 +2,40 @@ public class Problem2 { public static String solution(String cryptogram) { - String answer; - while(true) { - int count = 0; - for (int i = 0; i < cryptogram.length() - 1; i++) { - if (cryptogram.charAt(i) == cryptogram.charAt(i + 1)) { - cryptogram = cryptogram.substring(0, i) + cryptogram.substring(i + 2); - i--; + // 길이 검증 + if (cryptogram == null || cryptogram.length() < 1 || cryptogram.length() > 1000) { + return "error"; + } + // 알파벳 소문자 검증 + if (!cryptogram.matches("^[a-z]+$")) { + return "error"; + } + + StringBuilder sb = new StringBuilder(cryptogram); + + while (true) { + boolean changed = false; + int count = 1; + for (int i = 0; i < sb.length() - 1; i++) { + if (sb.charAt(i) == sb.charAt(i + 1)) { count++; + if(i + 1 == sb.length() - 1) { + sb.delete(i - count + 2, sb.length()); + return sb.toString(); + } + } else { + if (count > 1) { + sb.delete(i - count + 1, i + 1); + changed = true; + i = Math.max(-1, i - count - 1); // 변경 후 이전 위치부터 다시 검사 + } + count = 1; } } - if(count == 0) break; + if (!changed) break; } - answer = cryptogram; - return answer; + return sb.toString(); } } diff --git a/src/test/java/onboarding/ApplicationTest.java b/src/test/java/onboarding/ApplicationTest.java index 0e0e112c04..fba082a545 100644 --- a/src/test/java/onboarding/ApplicationTest.java +++ b/src/test/java/onboarding/ApplicationTest.java @@ -82,6 +82,34 @@ void case2() { String result = ""; assertThat(Problem2.solution(cryptogram)).isEqualTo(result); } + + @Test + void case3() { + String cyptogram = "bowwwwwww"; + String result = "bo"; + assertThat(Problem2.solution(cyptogram)).isEqualTo(result); + } + + @Test + void case4() { + String cyptogram = "brrro"; + String result = "bo"; + assertThat(Problem2.solution(cyptogram)).isEqualTo(result); + } + + @Test + void case5() { + String cyptogram = "wwwwwwbrrrowwwwwww"; + String result = "bo"; + assertThat(Problem2.solution(cyptogram)).isEqualTo(result); + } + + @Test + void case6() { + String cyptogram = "ABt"; + String result = "error"; + assertThat(Problem2.solution(cyptogram)).isEqualTo(result); + } } @Nested From c39fef8851e432496e767f7f130f1d023c0d752c Mon Sep 17 00:00:00 2001 From: LocKey Date: Mon, 16 Sep 2024 03:37:21 +0900 Subject: [PATCH 10/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=203=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=EC=82=AC=ED=95=AD=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem3.java | 4 ++++ src/test/java/onboarding/ApplicationTest.java | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/src/main/java/onboarding/Problem3.java b/src/main/java/onboarding/Problem3.java index 775715781a..bd6495ef45 100644 --- a/src/main/java/onboarding/Problem3.java +++ b/src/main/java/onboarding/Problem3.java @@ -5,6 +5,10 @@ public class Problem3 { public static int solution(int number) { int answer = 0; + if(number < 1 || number > 10000) { + return -1; + } + for(int i = 1; i <= number; i++) { List digits = Problem1.splitDigit(i); for(int j = 0; j < digits.size(); j++) { diff --git a/src/test/java/onboarding/ApplicationTest.java b/src/test/java/onboarding/ApplicationTest.java index fba082a545..e92c35d506 100644 --- a/src/test/java/onboarding/ApplicationTest.java +++ b/src/test/java/onboarding/ApplicationTest.java @@ -127,6 +127,13 @@ void case2() { int result = 14; assertThat(Problem3.solution(number)).isEqualTo(result); } + + @Test + void case3() { + int number = -1; + int result = -1; + assertThat(Problem3.solution(number)).isEqualTo(result); + } } @Nested From 1512a2aae86e6f091b7411fbf61e00b435e34ac7 Mon Sep 17 00:00:00 2001 From: LocKey Date: Mon, 16 Sep 2024 03:40:03 +0900 Subject: [PATCH 11/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=204=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=EC=82=AC=ED=95=AD=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem4.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/onboarding/Problem4.java b/src/main/java/onboarding/Problem4.java index 589f2be00a..2ba9cd3242 100644 --- a/src/main/java/onboarding/Problem4.java +++ b/src/main/java/onboarding/Problem4.java @@ -4,6 +4,10 @@ public class Problem4 { public static String solution(String word) { String answer = ""; + if(word.length() < 1 || word.length() > 1000) { + return "error"; + } + for(int i = 0; i < word.length(); i++) { char c = word.charAt(i); From 07194766d10a68332459c07ca89d4b33cadbcb4c Mon Sep 17 00:00:00 2001 From: LocKey Date: Mon, 16 Sep 2024 03:43:06 +0900 Subject: [PATCH 12/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=205=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=EC=82=AC=ED=95=AD=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem5.java | 5 +++++ src/test/java/onboarding/ApplicationTest.java | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/main/java/onboarding/Problem5.java b/src/main/java/onboarding/Problem5.java index 62f9222d7d..3b3f4b6bcd 100644 --- a/src/main/java/onboarding/Problem5.java +++ b/src/main/java/onboarding/Problem5.java @@ -6,6 +6,11 @@ public class Problem5 { public static List solution(int money) { + + if(money < 1 || money > 1000000) { + return null; + } + List answer = new ArrayList<>(); List moneyUnit = new ArrayList<>() {{ add(50000); diff --git a/src/test/java/onboarding/ApplicationTest.java b/src/test/java/onboarding/ApplicationTest.java index e92c35d506..0c2db114c2 100644 --- a/src/test/java/onboarding/ApplicationTest.java +++ b/src/test/java/onboarding/ApplicationTest.java @@ -161,6 +161,12 @@ void case2() { List result = List.of(0, 1, 1, 0, 0, 0, 0, 0, 0); assertThat(Problem5.solution(money)).isEqualTo(result); } + + @Test + void case3() { + int money = 1000001; + assertThat(Problem5.solution(money)).isNull(); + } } @Nested From f7dc102e37a7d36fcb53a90e125d96f5cede7804 Mon Sep 17 00:00:00 2001 From: LocKey Date: Mon, 16 Sep 2024 17:40:50 +0900 Subject: [PATCH 13/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=206=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=EC=82=AC=ED=95=AD=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem6.java | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/main/java/onboarding/Problem6.java b/src/main/java/onboarding/Problem6.java index eaddca45da..e463764c15 100644 --- a/src/main/java/onboarding/Problem6.java +++ b/src/main/java/onboarding/Problem6.java @@ -8,10 +8,24 @@ public class Problem6 { public static List solution(List> forms) { List answer = new ArrayList<>(); + if(forms.size() < 1 || forms.size() > 10000) { + return null; + } + for(int i = 0; i < forms.size(); i++) { String name = forms.get(i).get(1); String email = forms.get(i).get(0); + // 이메일 검증: 이메일 형식이 올바르고 email.com 도메인만 허용 + if (!isValidEmail(email)) { + continue; + } + + // 닉네임 검증: 닉네임이 한글만 포함 + if (!isValidNickname(name)) { + continue; + } + if(answer.contains(email)) continue; for(int j = i + 1; j < forms.size(); j++) { @@ -37,4 +51,20 @@ public static List solution(List> forms) { return answer; } + + private static boolean isValidEmail(String email) { + if(email.length() < 11 || email.length() >= 20) { + return false; + } + String emailPattern = "^[a-zA-Z0-9._%+-]+@email\\.com$"; + return email.matches(emailPattern); + } + + private static boolean isValidNickname(String name) { + if (name.length() < 1 || name.length() >= 20) { + return false; + } + String nicknamePattern = "^[가-힣]+$"; + return name.matches(nicknamePattern); + } } From aaffd2c65d0cb19a8fab04da601080c5074d7e73 Mon Sep 17 00:00:00 2001 From: LocKey Date: Mon, 16 Sep 2024 18:06:35 +0900 Subject: [PATCH 14/15] =?UTF-8?q?=EB=AC=B8=EC=A0=9C=207=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=EC=82=AC=ED=95=AD=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC,=20=EB=84=A4=EC=9D=B4=EB=B0=8D,=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem7.java | 72 +++++++++++--------------- 1 file changed, 30 insertions(+), 42 deletions(-) diff --git a/src/main/java/onboarding/Problem7.java b/src/main/java/onboarding/Problem7.java index a6cd7d9733..08ce3dbd8e 100644 --- a/src/main/java/onboarding/Problem7.java +++ b/src/main/java/onboarding/Problem7.java @@ -4,69 +4,57 @@ public class Problem7 { - static HashMap map = new HashMap<>(); public static List solution(String user, List> friends, List visitors) { - List answer = new ArrayList<>(5); + List recommendedFriends = new ArrayList<>(5); + HashMap friendScores = new HashMap<>(); - List userFriend = friendPoint(user, friends); - visitorPoint(visitors, userFriend); + List userFriends = calculateFriendPoints(user, friends, friendScores); + calculateVisitorPoints(visitors, userFriends, friendScores); - List> entries = new ArrayList<>(map.entrySet()); + List> sortedFriendEntries = new ArrayList<>(friendScores.entrySet()); - entries.sort((entry1, entry2) -> { - int valueComp = entry2.getValue().compareTo(entry1.getValue()); - if(valueComp == 0) { + sortedFriendEntries.sort((entry1, entry2) -> { + int scoreComparison = entry2.getValue().compareTo(entry1.getValue()); + if(scoreComparison == 0) { return entry1.getKey().compareTo(entry2.getKey()); } else { - return valueComp; + return scoreComparison; } }); - for(int i = 0; i < Math.min(5, entries.size()); i++) { //리스트의 크기가 5보다 작은 경우, 범위를 리스트 크기에 맞추기 위해 사용 - answer.add(entries.get(i).getKey()); + for(int i = 0; i < Math.min(5, sortedFriendEntries.size()); i++) { + recommendedFriends.add(sortedFriendEntries.get(i).getKey()); } - return answer; + return recommendedFriends; } - public static List friendPoint(String user, List> friends) { - List userFriend = new ArrayList<>(); + private static List calculateFriendPoints(String user, List> friends, HashMap friendScores) { + List userFriends = new ArrayList<>(); - for(int i = 0; i < friends.size(); i++) { - if(friends.get(i).contains(user)) { - String friendName; - if(friends.get(i).get(0) == user) friendName = friends.get(i).get(1); - else friendName = friends.get(i).get(0); - userFriend.add(friendName); + for(List friendPair : friends) { + if(friendPair.contains(user)) { + String friend = friendPair.get(0).equals(user) ? friendPair.get(1) : friendPair.get(0); + userFriends.add(friend); - for(int j = 0; j < friends.size(); j++) { - if(friends.get(j).contains(friendName) && !friends.get(j).contains(user)) { - String togetherKnownFriend; - if(friends.get(j).get(0) == friendName) togetherKnownFriend = friends.get(j).get(1); - else togetherKnownFriend = friends.get(j).get(0); - if(!map.containsKey(togetherKnownFriend)) { - map.put(togetherKnownFriend, 10); - } else { - int point = map.get(togetherKnownFriend); - map.put(togetherKnownFriend, point + 10); - } + for (List mutualFriendPair : friends) { + if (mutualFriendPair.contains(friend) && !mutualFriendPair.contains(user)) { + String mutualFriend = mutualFriendPair.get(0).equals(friend) ? mutualFriendPair.get(1) : mutualFriendPair.get(0); + + int currentScore = friendScores.getOrDefault(mutualFriend, 0); + friendScores.put(mutualFriend, currentScore + 10); } } } } - return userFriend; + return userFriends; } - public static void visitorPoint(List visitors, List userFriend) { - for(int i = 0; i < visitors.size(); i++) { - String name = visitors.get(i); - if(!userFriend.contains(name)) { - if (map.containsKey(name)) { - int point = map.get(name); - map.put(name, point + 1); - } else { - map.put(name, 1); - } + private static void calculateVisitorPoints(List visitors, List userFriends, HashMap friendScores) { + for (String visitor : visitors) { + if (!userFriends.contains(visitor)) { + int currentScore = friendScores.getOrDefault(visitor, 0); + friendScores.put(visitor, currentScore + 1); } } } From 0a79b6c1327270cfb6cdaaec2164a89b612b4934 Mon Sep 17 00:00:00 2001 From: LocKey Date: Mon, 16 Sep 2024 18:48:37 +0900 Subject: [PATCH 15/15] =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EC=A0=84=EB=B6=80=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/onboarding/Problem1.java | 87 +++++++++++++---------- src/main/java/onboarding/Problem3.java | 9 ++- src/main/java/onboarding/Problem4.java | 14 ++-- src/main/java/onboarding/Problem5.java | 26 +++---- src/main/java/onboarding/Problem6.java | 60 ++++++++-------- src/main/java/onboarding/Problem7.java | 96 +++++++++++++++++++------- 6 files changed, 184 insertions(+), 108 deletions(-) diff --git a/src/main/java/onboarding/Problem1.java b/src/main/java/onboarding/Problem1.java index b47d39a54a..aef327008c 100644 --- a/src/main/java/onboarding/Problem1.java +++ b/src/main/java/onboarding/Problem1.java @@ -5,67 +5,84 @@ class Problem1 { public static int solution(List pobi, List crong) { - int answer; + int answer = 0; - // 예외 처리 - if(pobi.size() != 2 || crong.size() != 2) { + // 예외 처리 함수 호출 + if (!isValidInput(pobi) || !isValidInput(crong)) { return -1; } - if(pobi.get(0) <= 1 || crong.get(0) <= 1 || pobi.get(1) >= 400 || crong.get(1) >= 400) { - return -1; + + int pobiMaxScore = calculateMaxPageScore(pobi); + int crongMaxScore = calculateMaxPageScore(crong); + if (pobiMaxScore > crongMaxScore) return 1; + else if (pobiMaxScore < crongMaxScore) return 2; + + return answer; + } + + // 예외 처리 함수 + public static boolean isValidInput(List pages) { + if (pages.size() != 2) { + return false; } - if(pobi.get(1) <= pobi.get(0) || pobi.get(1) - pobi.get(0) != 1 || crong.get(1) <= crong.get(0) || crong.get(1) - crong.get(0) != 1) { - return -1; + int leftPage = pages.get(0); + int rightPage = pages.get(1); + + // 페이지 번호가 범위를 벗어나는 경우 + if (leftPage <= 1 || rightPage >= 400) { + return false; } - if(pobi.get(0) % 2 != 1 || crong.get(0) % 2 != 1 || pobi.get(1) % 2 != 0 || crong.get(1) % 2 != 0) { - return -1; + + // 페이지 순서가 잘못되었거나 차이가 1이 아닌 경우 + if (rightPage <= leftPage || rightPage - leftPage != 1) { + return false; } - int pobiSum = maxSum(pobi); - int crongSum = maxSum(crong); - if(pobiSum > crongSum) answer = 1; - else if(pobiSum < crongSum) answer = 2; - else answer = 0; + // 왼쪽 페이지는 홀수, 오른쪽 페이지는 짝수이어야 함 + if (leftPage % 2 != 1 || rightPage % 2 != 0) { + return false; + } - return answer; + return true; } - public static List splitDigit(int number) { + + public static List splitDigits(int number) { List result = new ArrayList<>(); - while(number > 0) { + while (number > 0) { result.add(0, number % 10); number = number / 10; } return result; } - public static Integer plusAll(List allDigit) { + public static Integer sumDigits(List digits) { int sum = 0; - for(int i = 0; i < allDigit.size(); i++) { - sum += allDigit.get(i); + for (int digit : digits) { + sum += digit; } return sum; } - public static Integer multiplyAll(List allDigit) { - int sum = 1; - for(int i = 0; i < allDigit.size(); i++) { - sum *= allDigit.get(i); + public static Integer multiplyDigits(List digits) { + int product = 1; + for (int digit : digits) { + product *= digit; } - return sum; + return product; } - public static Integer plusMultiplyComp(Integer LR) { - List LRDigit = splitDigit(LR); - int plusLeftSum = plusAll(LRDigit); - int multiplyLeftSum = multiplyAll(LRDigit); - return Math.max(plusLeftSum, multiplyLeftSum); + public static Integer calculateMaxSumOrProduct(Integer page) { + List pageDigits = splitDigits(page); + int sumOfDigits = sumDigits(pageDigits); + int productOfDigits = multiplyDigits(pageDigits); + return Math.max(sumOfDigits, productOfDigits); } - public static Integer maxSum(List user) { - int maxLeftSum = plusMultiplyComp(user.get(0)); - int maxRightSum = plusMultiplyComp(user.get(1)); + public static Integer calculateMaxPageScore(List user) { + int maxLeftPageScore = calculateMaxSumOrProduct(user.get(0)); + int maxRightPageScore = calculateMaxSumOrProduct(user.get(1)); - return Math.max(maxLeftSum, maxRightSum); + return Math.max(maxLeftPageScore, maxRightPageScore); } -} \ No newline at end of file +} diff --git a/src/main/java/onboarding/Problem3.java b/src/main/java/onboarding/Problem3.java index bd6495ef45..c814793711 100644 --- a/src/main/java/onboarding/Problem3.java +++ b/src/main/java/onboarding/Problem3.java @@ -1,5 +1,6 @@ package onboarding; +import java.util.Arrays; import java.util.List; public class Problem3 { @@ -9,10 +10,12 @@ public static int solution(int number) { return -1; } + List clapNumbers = Arrays.asList(3, 6, 9); + for(int i = 1; i <= number; i++) { - List digits = Problem1.splitDigit(i); - for(int j = 0; j < digits.size(); j++) { - if(digits.get(j) == 3 || digits.get(j) == 6 || digits.get(j) == 9) { + List digits = Problem1.splitDigits(i); + for (Integer digit : digits) { + if (clapNumbers.contains(digit)) { answer++; } } diff --git a/src/main/java/onboarding/Problem4.java b/src/main/java/onboarding/Problem4.java index 2ba9cd3242..581062d21d 100644 --- a/src/main/java/onboarding/Problem4.java +++ b/src/main/java/onboarding/Problem4.java @@ -1,6 +1,10 @@ package onboarding; public class Problem4 { + + private static final int LOWERCASE_TRANSFORM_BASE = 219; + private static final int UPPERCASE_TRANSFORM_BASE = 155; + public static String solution(String word) { String answer = ""; @@ -17,10 +21,12 @@ public static String solution(String word) { } char newChar; - if(c >= 97) { //소문자 - newChar = (char) (219 - c); - } else { // 대문자 - newChar = (char) (155 - c); + if(c >= 'a' && c <= 'z') { //소문자 + newChar = (char) (LOWERCASE_TRANSFORM_BASE - c); + } else if (c >= 'A' && c <= 'Z') { // 대문자 변환 + newChar = (char) (UPPERCASE_TRANSFORM_BASE - c); + } else { + newChar = c; // 알파벳이 아닌 경우 그대로 유지 } answer += newChar; } diff --git a/src/main/java/onboarding/Problem5.java b/src/main/java/onboarding/Problem5.java index 3b3f4b6bcd..a4daf48110 100644 --- a/src/main/java/onboarding/Problem5.java +++ b/src/main/java/onboarding/Problem5.java @@ -7,24 +7,24 @@ public class Problem5 { public static List solution(int money) { - if(money < 1 || money > 1000000) { + if (money < 1 || money > 1000000) { return null; } List answer = new ArrayList<>(); - List moneyUnit = new ArrayList<>() {{ - add(50000); - add(10000); - add(5000); - add(1000); - add(500); - add(100); - add(50); - add(10); - add(1); - }}; + final List moneyUnit = List.of( + 50000, + 10000, + 5000, + 1000, + 500, + 100, + 50, + 10, + 1 + ); - for(int i = 0; i < moneyUnit.size(); i++) { + for (int i = 0; i < moneyUnit.size(); i++) { answer.add(money / moneyUnit.get(i)); money = money % moneyUnit.get(i); } diff --git a/src/main/java/onboarding/Problem6.java b/src/main/java/onboarding/Problem6.java index e463764c15..2f38efb145 100644 --- a/src/main/java/onboarding/Problem6.java +++ b/src/main/java/onboarding/Problem6.java @@ -7,53 +7,55 @@ public class Problem6 { public static List solution(List> forms) { List answer = new ArrayList<>(); - - if(forms.size() < 1 || forms.size() > 10000) { + if (forms.size() < 1 || forms.size() > 10000) { return null; } - for(int i = 0; i < forms.size(); i++) { - String name = forms.get(i).get(1); + for (int i = 0; i < forms.size(); i++) { String email = forms.get(i).get(0); + String name = forms.get(i).get(1); - // 이메일 검증: 이메일 형식이 올바르고 email.com 도메인만 허용 - if (!isValidEmail(email)) { + if (!isValidEmail(email) || !isValidNickname(name) || answer.contains(email)) { continue; } - // 닉네임 검증: 닉네임이 한글만 포함 - if (!isValidNickname(name)) { - continue; - } + checkDuplicateSubstrings(forms, i, name, email, answer); + } - if(answer.contains(email)) continue; + answer.sort(Comparator.naturalOrder()); + return answer; + } - for(int j = i + 1; j < forms.size(); j++) { - String compName = forms.get(j).get(1); - String compEmail = forms.get(j).get(0); + private static void checkDuplicateSubstrings(List> forms, int currentIndex, String currentName, String currentEmail, List answer) { + for (int j = currentIndex + 1; j < forms.size(); j++) { + String compName = forms.get(j).get(1); + String compEmail = forms.get(j).get(0); - if(answer.contains(compEmail)) continue; + if (answer.contains(compEmail)) { + continue; + } - for(int k = 0; k < compName.length() - 1; k++) { - String subString = compName.substring(k, k + 2); - if(name.contains(subString)) { - answer.add(forms.get(j).get(0)); - if(!answer.contains(email)) { - answer.add(forms.get(i).get(0)); - } - break; - } + if (hasDuplicateSubstring(currentName, compName)) { + answer.add(compEmail); + if (!answer.contains(currentEmail)) { + answer.add(currentEmail); } - } } - answer.sort(Comparator.naturalOrder()); + } - return answer; + private static boolean hasDuplicateSubstring(String name1, String name2) { + for (int k = 0; k < name2.length() - 1; k++) { + String subString = name2.substring(k, k + 2); + if (name1.contains(subString)) { + return true; + } + } + return false; } private static boolean isValidEmail(String email) { - if(email.length() < 11 || email.length() >= 20) { + if (email.length() < 11 || email.length() >= 20) { return false; } String emailPattern = "^[a-zA-Z0-9._%+-]+@email\\.com$"; @@ -67,4 +69,4 @@ private static boolean isValidNickname(String name) { String nicknamePattern = "^[가-힣]+$"; return name.matches(nicknamePattern); } -} +} \ No newline at end of file diff --git a/src/main/java/onboarding/Problem7.java b/src/main/java/onboarding/Problem7.java index 08ce3dbd8e..0ba547e9be 100644 --- a/src/main/java/onboarding/Problem7.java +++ b/src/main/java/onboarding/Problem7.java @@ -5,49 +5,82 @@ public class Problem7 { public static List solution(String user, List> friends, List visitors) { + // 예외 처리 함수 호출 + validateInput(user, friends, visitors); + List recommendedFriends = new ArrayList<>(5); HashMap friendScores = new HashMap<>(); - List userFriends = calculateFriendPoints(user, friends, friendScores); + List userFriends = extractUserFriends(user, friends); + addMutualFriendPoints(user, friends, friendScores, userFriends); calculateVisitorPoints(visitors, userFriends, friendScores); - List> sortedFriendEntries = new ArrayList<>(friendScores.entrySet()); + List> sortedFriendEntries = sortFriendScores(friendScores); - sortedFriendEntries.sort((entry1, entry2) -> { - int scoreComparison = entry2.getValue().compareTo(entry1.getValue()); - if(scoreComparison == 0) { - return entry1.getKey().compareTo(entry2.getKey()); - } else { - return scoreComparison; - } - }); - - for(int i = 0; i < Math.min(5, sortedFriendEntries.size()); i++) { + for (int i = 0; i < Math.min(5, sortedFriendEntries.size()); i++) { recommendedFriends.add(sortedFriendEntries.get(i).getKey()); } return recommendedFriends; } - private static List calculateFriendPoints(String user, List> friends, HashMap friendScores) { - List userFriends = new ArrayList<>(); + // 예외 처리 함수 + private static void validateInput(String user, List> friends, List visitors) { + // 사용자 ID 길이 및 알파벳 소문자 검증 + if (user == null || user.length() < 1 || user.length() > 30 || !user.matches("[a-z]+")) { + throw new IllegalArgumentException("사용자 ID는 1자 이상 30자 이하의 알파벳 소문자여야 합니다."); + } + + // friends 리스트 크기 및 각 원소 검증 + if (friends == null || friends.size() < 1 || friends.size() > 10000) { + throw new IllegalArgumentException("friends 리스트는 1 이상 10,000 이하이어야 합니다."); + } + for (List friendPair : friends) { + if (friendPair == null || friendPair.size() != 2) { + throw new IllegalArgumentException("friends 리스트의 각 원소는 정확히 2개의 아이디로 이루어져야 합니다."); + } + for (String id : friendPair) { + if (id == null || id.length() < 1 || id.length() > 30 || !id.matches("[a-z]+")) { + throw new IllegalArgumentException("친구 아이디는 1자 이상 30자 이하의 알파벳 소문자여야 합니다."); + } + } + } + + // visitors 리스트 크기 및 각 원소 검증 + if (visitors == null || visitors.size() > 10000) { + throw new IllegalArgumentException("visitors 리스트는 0 이상 10,000 이하이어야 합니다."); + } + for (String visitor : visitors) { + if (visitor == null || visitor.length() < 1 || visitor.length() > 30 || !visitor.matches("[a-z]+")) { + throw new IllegalArgumentException("방문자 아이디는 1자 이상 30자 이하의 알파벳 소문자여야 합니다."); + } + } + } - for(List friendPair : friends) { - if(friendPair.contains(user)) { + // 사용자 친구 목록 추출 + private static List extractUserFriends(String user, List> friends) { + List userFriends = new ArrayList<>(); + for (List friendPair : friends) { + if (friendPair.contains(user)) { String friend = friendPair.get(0).equals(user) ? friendPair.get(1) : friendPair.get(0); userFriends.add(friend); + } + } + return userFriends; + } - for (List mutualFriendPair : friends) { - if (mutualFriendPair.contains(friend) && !mutualFriendPair.contains(user)) { - String mutualFriend = mutualFriendPair.get(0).equals(friend) ? mutualFriendPair.get(1) : mutualFriendPair.get(0); + // 함께 아는 친구에게 점수 추가 + private static void addMutualFriendPoints(String user, List> friends, HashMap friendScores, List userFriends) { + for (String friend : userFriends) { + for (List mutualFriendPair : friends) { + if (mutualFriendPair.contains(friend) && !mutualFriendPair.contains(user)) { + String mutualFriend = mutualFriendPair.get(0).equals(friend) ? mutualFriendPair.get(1) : mutualFriendPair.get(0); - int currentScore = friendScores.getOrDefault(mutualFriend, 0); - friendScores.put(mutualFriend, currentScore + 10); - } + int currentScore = friendScores.getOrDefault(mutualFriend, 0); + friendScores.put(mutualFriend, currentScore + 10); } } } - return userFriends; } private static void calculateVisitorPoints(List visitors, List userFriends, HashMap friendScores) { @@ -58,4 +91,19 @@ private static void calculateVisitorPoints(List visitors, List u } } } -} + + // 정렬 함수 + private static List> sortFriendScores(HashMap friendScores) { + List> sortedEntries = new ArrayList<>(friendScores.entrySet()); + + sortedEntries.sort((entry1, entry2) -> { + int scoreComparison = entry2.getValue().compareTo(entry1.getValue()); + if (scoreComparison == 0) { + return entry1.getKey().compareTo(entry2.getKey()); + } + return scoreComparison; + }); + + return sortedEntries; + } +} \ No newline at end of file