Skip to content
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ dependencies {
testImplementation platform('org.assertj:assertj-bom:3.25.1')
testImplementation('org.junit.jupiter:junit-jupiter')
testImplementation('org.assertj:assertj-core')
implementation("com.google.guava:guava:31.1-jre")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‚˜์š”?

}

tasks.named('test') {
Expand Down
121 changes: 118 additions & 3 deletions src/main/java/leets/leets_mate/LeetsMateApplication.java
Original file line number Diff line number Diff line change
@@ -1,38 +1,153 @@
package leets.leets_mate;

import com.google.common.collect.Lists;

import java.util.*;

public class LeetsMateApplication {

//๋ฐ˜๋ณต๋œ ์ž…๋ ฅ์ž‘์—…์„ ์œ„ํ•ด ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธ
Scanner scan = new Scanner(System.in);
String members;

// ๋™์ž‘ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public void run() {
//์ž…๋ ฅ๋ถ€
System.out.println("[Leets ์˜ค๋Š˜์˜ ์ง์—๊ฒŒ]๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");
System.out.println("๋ฉค๋ฒ„์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”. ',' ๋กœ ๊ตฌ๋ถ„");

//์˜์–ด ์ž…๋ ฅ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
members = inputMembers(members);

//๋ฌธ์ž์—ด์—์„œ List๋กœ ๋ณ€ํ™˜
List<String> memberList = parseMembers(members);

//์ตœ๋Œ€ ์ง ์ˆ˜ ์ž…๋ ฅ. ์˜ˆ์™ธ์ฒ˜๋ฆฌ
int maxGroup = checkMaxGroup(memberList);

//๋ฒ„ํผ ์† ๊ฐœํ–‰๋ฌธ์ž ์†Œ๋น„
scan.nextLine();

//์ดˆ๊ธฐ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
printResult(generateRandomGroups(memberList,maxGroup));

//๋‹ค์‹œ์ถ”์ฒจ๊ธฐ๋Šฅ, y๋‚˜n์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ์ฒ˜๋ฆฌ
reDraw(memberList, maxGroup);
}

//๋‹ค์‹œ ์ถ”์ฒจ ๊ธฐ๋Šฅ
private void reDraw(List<String> memberList, int maxGroup) {
String reDrawOpinion;
while(true){
System.out.println("๋‹ค์‹œ ์ถ”์ฒจํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?");
reDrawOpinion = scan.nextLine();
reDrawOpinion = getOpinion(reDrawOpinion);
if(reDrawOpinion.equals("n")){
break;
}
printResult(generateRandomGroups(memberList, maxGroup));
}
}

//๋‹ค์‹œ ์ถ”์ฒจ ์ž…๋ ฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
private String getOpinion(String index) {
while(true){
try{
checkYesOrNo(index);
break;
}catch (IllegalArgumentException e){
System.out.println("y๋‚˜ n์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”");
index = scan.nextLine();
}
}
return index;
}

//์ตœ๋Œ€ ์ง ์ˆ˜ ํฌ๊ธฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
private int checkMaxGroup(List<String> memberList) {
System.out.println("\n์ตœ๋Œ€ ์ง ์ˆ˜๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”");
int maxGroup;
while (true) {
try {
maxGroup = scan.nextInt();
checkDataValidity(memberNumber(memberList), maxGroup);
break;
} catch (InputMismatchException e) {
System.out.println("์ตœ๋Œ€ ์ง ์ˆ˜๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”");
scan.nextLine();
} catch (IllegalArgumentException e) {
System.out.println("์ตœ๋Œ€ ์ง ์ˆ˜๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”");
scan.nextLine();
}
}
return maxGroup;
}


//๋ฉค๋ฒ„ ์ž…๋ ฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
private String inputMembers(String members) {
//์ดˆ๊ธฐ ๋ฉค๋ฒ„ ์ž…๋ ฅ
members = scan.nextLine();
while(true) {
try {
checkHasNoEnglish(members);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image

์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜ˆ์™ธ๋„ ๊ณ ๋ คํ•ด๋ณด๋ฉด ์žฌ๋ฐŒ์„ ๊ฑฐ์—์š”~๐Ÿ˜†

break;
} catch (IllegalArgumentException e) {
System.out.println("๋ฉค๋ฒ„์˜ ์ด๋ฆ„์„ ํ•œ๊ธ€๋กœ ๋‹ค์‹œ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”. ',' ๋กœ ๊ตฌ๋ถ„");
members = scan.nextLine();
}
}
return members;
}


// ๋ฌธ์ž์—ด๋กœ๋œ ๋ฉค๋ฒ„๋“ค์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public List<String> parseMembers(String members) {
return new ArrayList<>();
String[] parsedMember = members.split(",");
return Arrays.asList(parsedMember);
}

// ์ด ๋ฉค๋ฒ„์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
public int memberNumber(List<String> members) {
return 0;
return members.size();
}

// ๋ฉค๋ฒ„ ๋ฌธ์ž์—ด์— ์˜์–ด๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์˜ˆ์™ธ ์ถœ๋ ฅ
public void checkHasNoEnglish(String members) {
for (Character c : members.toCharArray()) {
if(!((c >= 'ใ„ฑ' && c <= 'ํžฃ')||c==',')){
throw new IllegalArgumentException("[ERROR] ์ด๋ฆ„์€ ํ•œ๊ธ€๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
}
}
}

// ๋ฉค๋ฒ„์ˆ˜์™€ ์ตœ๋Œ€ ์ง์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด ์˜ˆ์™ธ ์ถœ๋ ฅ
public void checkDataValidity(int memberCount, int maximumGroupSize) {
if(memberCount<maximumGroupSize){
throw new IllegalArgumentException("[ERROR] ์ตœ๋Œ€ ์ง ์ˆ˜๋Š” ์ด๋ฆ„์˜ ๊ฐฏ์ˆ˜๋ณด๋‹ค ํด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}
}

//๋‹ค์‹œ ์ถ”์ฒจ ๊ธฐ๋Šฅ์—์„œ y,n์„ ์ž…๋ ฅํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด ์˜ˆ์™ธ ์ถœ๋ ฅ
public void checkYesOrNo(String index){
if(!((index.equals("y"))|(index.equals("n")))){
throw new IllegalArgumentException("[ERROR] ์ž…๋ ฅ์—๋Š” 'y','n'๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.");
}
}

// ๋žœ๋ค ์ง๊ฟ ์ถ”์ฒจํ•˜๋Š” ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค.
public List<List<String>> generateRandomGroups(List<String> memberList, int maximumGroupSize) {
return new ArrayList<>();
Collections.shuffle(memberList);
return Lists.partition(memberList, maximumGroupSize);
}

// ๊ฒฐ๊ณผ๋ฅผ ํ”„๋ฆฐํŠธ ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public void printResult(List<List<String>> result) {
System.out.println("์˜ค๋Š˜์˜ ์ง ์ถ”์ฒจ ๊ฒฐ๊ณผ");
for (List<String> strings : result) {
System.out.println(strings);
}
System.out.println("\n์ถ”์ฒจ์„ ์™„๋ฃŒํ•˜์˜€์Šต๋‹ˆ๋‹ค.\n");
}

public static void main(String[] args) {
Expand Down
15 changes: 13 additions & 2 deletions src/test/java/leets/leets_mate/LeetsMateApplicationTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;
Expand Down Expand Up @@ -33,15 +34,25 @@ void setUp() {

@Test
void ๋ฉค๋ฒ„์ˆ˜์™€_์ตœ๋Œ€_๋ฉค๋ฒ„์ˆ˜๋ฅผ_์ž˜๋ชป_์ž…๋ ฅํ•œ_๊ฒฝ์šฐ_์˜ˆ์™ธ๋ฅผ_๋ฐ˜ํ™˜ํ•œ๋‹ค() {
assertThrows(Exception.class, () -> {
IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> {
app.checkDataValidity(3, 4);
});
assertThat("[ERROR] ์ตœ๋Œ€ ์ง ์ˆ˜๋Š” ์ด๋ฆ„์˜ ๊ฐฏ์ˆ˜๋ณด๋‹ค ํด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.").isEqualTo(e.getMessage());
}

@Test
void ๋ฉค๋ฒ„_๋ฌธ์ž์—ด์—_์˜์–ด๋ฅผ_์ž…๋ ฅํ•œ_๊ฒฝ์šฐ_์˜ˆ์™ธ๋ฅผ_๋ฐ˜ํ™˜ํ•œ๋‹ค() {
assertThrows(Exception.class, () -> {
IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> {
app.checkHasNoEnglish("welcome,to,leets");
});
assertThat("[ERROR] ์ด๋ฆ„์€ ํ•œ๊ธ€๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.").isEqualTo(e.getMessage());
}

@Test
void ๋‹ค์‹œ์ถ”์ฒจ์—์„œ_์ž˜๋ชป_์ž…๋ ฅํ•œ_๊ฒฝ์šฐ_์˜ˆ์™ธ๋ฅผ_๋ฐ˜ํ™˜ํ•œ๋‹ค(){
IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> {
app.checkYesOrNo("a");
});
assertThat("[ERROR] ์ž…๋ ฅ์—๋Š” 'y','n'๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.").isEqualTo(e.getMessage());
}
}