Skip to content
134 changes: 129 additions & 5 deletions src/main/java/leets/leets_mate/LeetsMateApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,160 @@
import java.util.*;

public class LeetsMateApplication {
Scanner sc = new Scanner(System.in);
String newline = System.lineSeparator();
boolean retry = true;

// ๋™์ž‘ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public void run() {
System.out.println("[Leets ์˜ค๋Š˜์˜ ์ง์—๊ฒŒ]๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");

List<String> members = parseMembers(inputMembers());

int maximumGroupSize = inputMaximumGroupSize(memberNumber(members));
System.out.println();

printResult(generateRandomGroups(members, maximumGroupSize));

sc.close();
}

// ๋ฉค๋ฒ„๋“ค์„ ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅ ๋ฐ›๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public String inputMembers() {
System.out.println();
System.out.println("์ฐธ์„์ž๋“ค์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”. (,๋กœ ๊ตฌ๋ถ„)");

String memberNamesInput = sc.nextLine();

try {
checkHasOnlyKorean(memberNamesInput);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return inputMembers();
}

return memberNamesInput;
}

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

// ์ตœ๋Œ€ ์ง์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public int inputMaximumGroupSize(int memberNumber) {
System.out.println(newline + "์ตœ๋Œ€ ์ง ์ˆ˜๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.");

int maximumGroupSize = sc.nextInt();
sc.nextLine(); // ๊ฐœํ–‰๋ฌธ์ž ์ œ๊ฑฐ

try {
checkDataValidity(memberNumber, maximumGroupSize);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return inputMaximumGroupSize(memberNumber);
}

return maximumGroupSize;
}

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

// ๋ฉค๋ฒ„ ๋ฌธ์ž์—ด์— ์˜์–ด๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์˜ˆ์™ธ ์ถœ๋ ฅ
public void checkHasNoEnglish(String members) {
// ๋ฉค๋ฒ„ ๋ฌธ์ž์—ด์— ํ•œ๊ธ€๊ณผ ์‰ผํ‘œ๋งŒ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์™ธ์˜ ๋ฌธ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์˜ˆ์™ธ ์ถœ
public void checkHasOnlyKorean(String members) {
if (!members.matches("^[๊ฐ€-ํžฃ,]+$")) {
throw new IllegalArgumentException("[ERROR] ์ด๋ฆ„์€ ํ•œ๊ธ€๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
}
}

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

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

List<List<String>> result = new ArrayList<>();
List<String> currentGroup = new ArrayList<>();

for (String member : memberList) {
if (member.isEmpty()) {
continue;
}

currentGroup.add(member);

if (currentGroup.size() == maximumGroupSize) {
result.add(new ArrayList<>(currentGroup));
currentGroup.clear();
}
}

if (!currentGroup.isEmpty()) {
result.add(new ArrayList<>(currentGroup));
}

return result;
}

// ๊ฒฐ๊ณผ๋ฅผ ํ”„๋ฆฐํŠธ ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public void printResult(List<List<String>> result) {
while (retry) {
System.out.println("์˜ค๋Š˜์˜ ์ง ์ถ”์ฒœ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.");

StringBuilder sb = new StringBuilder();

for (List<String> group : result) {
StringJoiner sj = new StringJoiner(" | ", "[ ", " ]");

for (String member : group) {
sj.add(member);
}

sb.append(sj).append(newline);
}

sb.append(newline).append("์ถ”์ฒœ์„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.");
System.out.println(sb);

askRetry();
}

System.out.println("์ž๋ฆฌ๋ฅผ ์ด๋™ํ•ด ์„œ๋กœ์—๊ฒŒ ์ธ์‚ฌํ•ด์ฃผ์„ธ์š”.");
}

// ๋‹ค์‹œ ์ถ”์ฒœ์„ ํ• ์ง€ ๋ฌผ์–ด๋ณด๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public void askRetry() {
System.out.print("๋‹ค์‹œ ๊ตฌ์„ฑํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (y or n): ");
String operator = sc.nextLine();

try {
retry = isDone(operator);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
askRetry();
}
}

// ๋‹ค์‹œ ์ถ”์ฒœ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public boolean isDone(String operator) {
if (operator.equals("n")) {
return false;
}

if (operator.equals("y")) {
System.out.println("--------------------------------");
return true;
}

throw new IllegalArgumentException("[ERROR] y ๋˜๋Š” n์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");
}

public static void main(String[] args) {
Expand Down
13 changes: 10 additions & 3 deletions src/test/java/leets/leets_mate/LeetsMateApplicationTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ void setUp() {
}

@Test
void ์ž…๋ ฅ๋ฐ›์€_๋ฌธ์ž์—ด์„_ํŒŒ์‹ฑํ•˜์—ฌ_๋ฆฌ์ŠคํŠธ๋กœ_๋งŒ๋“ ๋‹ค() {
void ์ž…๋ ฅ๋ฐ›์€_๋ฌธ์ž์—ด์„_ํŒŒ์‹ฑํ•˜์—ฌ_๋ฆฌ์ŠคํŠธ๋กœ_๋งŒ๋“ ๋‹ค() throws Exception {
String members = "๋ฆฌ์ธ ์—,์˜ค์‹ ,๊ฑธ,ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค";
List<String> actual = app.parseMembers(members);
assertThat(actual).containsExactly("๋ฆฌ์ธ ์—", "์˜ค์‹ ", "๊ฑธ", "ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค");
Expand All @@ -39,9 +39,16 @@ void setUp() {
}

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

@Test
void ๋‹ค์‹œ_์ถ”์ฒœ_๋ช…๋ น_์—์„œ_y๋‚˜_n์„_๋ˆ„๋ฅด์ง€_์•Š์€_๊ฒฝ์šฐ_์˜ˆ์™ธ๋ฅผ_๋ฐ˜ํ™˜ํ•œ๋‹ค() {
assertThrows(Exception.class, () -> {
app.isDone("a");
});
}
}