Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
4588e68
chore: ์†Œ์Šค์ฝ”๋“œ ์ดˆ๊ธฐํ™”
ay-eonii Apr 6, 2024
679aa40
docs(README): ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ ์ž‘์„ฑ
ay-eonii Apr 6, 2024
fab7a8e
feat(Name): ์ด๋ฆ„ ๋„๋ฉ”์ธ
ay-eonii Apr 6, 2024
09ffa9e
refactor(Name): ํŒจํ‚ค์ง€ ์ด๋™
ay-eonii Apr 6, 2024
c8ed3a5
feat(Names): ์‚ฌ๋žŒ ์ˆ˜ ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ
ay-eonii Apr 6, 2024
f9dd968
feat(RandomNumbersGenerator): ํŠน์ • ๋ฒ”์œ„์—์„œ ํŠน์ • ๊ฐœ์ˆ˜ ์ˆซ์ž ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ
ay-eonii Apr 6, 2024
2876215
fix(RandomNumbersGenerator): ๋ฒ”์œ„ ๋‚ด ์ˆซ์ž ๋žœ๋ค ์ˆœ์„œ๋กœ ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ
ay-eonii Apr 6, 2024
18cca4a
fix(RandomNumbersGenerator): ๋ฒ”์œ„ ๋‚ด ์ˆซ์ž๋ฅผ ๋žœ๋ค ์ˆœ์„œ์™€ ์ฃผ์–ด์ง„ ์‚ฌ์ด์ฆˆ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณ€๊ฒฝ
ay-eonii Apr 6, 2024
f418c3e
fix(Names): ์ธ๋ฑ์Šค๋กœ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
ay-eonii Apr 6, 2024
98f1568
feat(PairMatcher): ์ง ๋งค์นญ ๋ฉ”์„œ๋“œ
ay-eonii Apr 6, 2024
623f837
feat(OutputView): ๋งค์นญ ์‹œ์ž‘ ๋ฌธ๊ตฌ ์ถœ๋ ฅ
ay-eonii Apr 6, 2024
7d612c9
feat(InputView): ์ด๋ฆ„ ์ž…๋ ฅ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ
ay-eonii Apr 6, 2024
b7a3a87
feat(InputView): ์ตœ๋Œ€ ์ง ์ˆ˜ ์ž…๋ ฅ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ
ay-eonii Apr 7, 2024
f7c1b78
feat(OutputView): ์ง ๋งค์นญ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๋ฉ”์„œ๋“œ
ay-eonii Apr 7, 2024
6d8b33b
feat(Computer): ๋„๋ฉ”์ธ ๋ฐ ๋ทฐ ํ˜ธ์ถœ
ay-eonii Apr 7, 2024
430f2c1
feat(Applications): ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ
ay-eonii Apr 7, 2024
75d8870
feat(InputView): ์ง ์ˆ˜ ์žฌ์ž…๋ ฅ ์ฒ˜๋ฆฌ
ay-eonii Apr 7, 2024
7c585c0
docs(README): ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ
ay-eonii Apr 7, 2024
3d4d891
feat(PairCountValidator): ์ตœ๋Œ€ ์ง ์ˆ˜ ๊ฒ€์ฆ
ay-eonii Apr 7, 2024
f93b123
feat(PairCount): ์ง ์ˆ˜ ์›์‹œ๊ฐ’ ํฌ์žฅ
ay-eonii Apr 7, 2024
c2744c1
feat(OutputView): ์ง ๋งค์นญ ์™„๋ฃŒ ๋ฌธ๊ตฌ ์ถœ๋ ฅ
ay-eonii Apr 8, 2024
09d689c
feat(RetryOpinion): ์žฌ๊ตฌ์„ฑ ์—ฌ๋ถ€ ๋„๋ฉ”์ธ
ay-eonii Apr 8, 2024
d941329
feat(InputView): ์žฌ๊ตฌ์„ฑ ์—ฌ๋ถ€ ์ž…๋ ฅ ๋ฉ”์„œ๋“œ
ay-eonii Apr 8, 2024
a44ad9f
feat(OutputView): ๊ฒฝ๊ณ„์„  ์ถœ๋ ฅ ๋ฉ”์„œ๋“œ
ay-eonii Apr 8, 2024
5c12142
feat(OutputView): ์ข…๋ฃŒ ๋ฌธ๊ตฌ ์ถœ๋ ฅ
ay-eonii Apr 8, 2024
6579ccd
feat(Computer): ๋„๋ฉ”์ธ ๋ฐ ๋ทฐ ํ˜ธ์ถœ
ay-eonii Apr 8, 2024
47d1628
feat(Computer): ์ตœ๋Œ€ ์ง ์ˆ˜ ์žฌ์ž…๋ ฅ ์ฒ˜๋ฆฌ
ay-eonii Apr 8, 2024
5f17510
refactor(Names): ๋ฉ”์„œ๋“œ ์ˆœ์„œ ๋ณ€๊ฒฝ
ay-eonii Apr 8, 2024
f5719b3
refactor(Name): ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์ƒ์ˆ˜ํ™”
ay-eonii Apr 8, 2024
5e0fa85
refactor(PairMatcher): ๋ฐ˜๋ณต๋ฌธ ๋Œ€์‹  stream ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ
ay-eonii Apr 8, 2024
12eac09
test(NamesTest): ๋ฉ”์„œ๋“œ ์„ค๋ช… ์ถ”๊ฐ€
ay-eonii Apr 8, 2024
5e29d8e
test(RandomNumbers): ํŠน์ • ์‚ฌ์ด์ฆˆ๋กœ ์ž๋ฅด๋Š” ์—ญํ•  ์œ„์ž„
ay-eonii Apr 8, 2024
8276101
fix(InputView): ์ด๋ฆ„ ์ •๊ทœํ‘œํ˜„์‹ ์ˆ˜์ •
ay-eonii Apr 8, 2024
6f84ccf
feat(Names): ์ด๋ฆ„ ๊ฐœ์ˆ˜ ๊ฒ€์ฆ
ay-eonii Apr 8, 2024
3b6cd41
feat(OutputView): ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ๋ฉ”์„œ๋“œ
ay-eonii Apr 8, 2024
3cef975
refactor(Pair): ์ง ์ด๋ฆ„ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌ
ay-eonii Apr 8, 2024
c2f6f16
refactor(RandomNumbers): ๋ฐฐ์—ด ์ž๋ฅด๊ธฐ ๋ฐ˜๋ณต๋ฌธ ๋Œ€์‹  stream ์‚ฌ์šฉ
ay-eonii Apr 8, 2024
1534938
fix(Application): ๋ฉ”์ธ ๋ฉ”์„œ๋“œ ์ค‘๋ณต ์‚ญ์ œ
ay-eonii Apr 9, 2024
1d936a2
docs(README): ๊ธฐ๋Šฅ์š”๊ตฌ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ
ay-eonii Apr 10, 2024
588bf30
docs(README): ๊ธฐ๋Šฅ์š”๊ตฌ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ
ay-eonii Apr 10, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
## ๐Ÿ“‘ ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ

**์ž…๋ ฅ**

- [x] ์ฐธ์„์ž๋“ค์˜ ์ด๋ฆ„์„ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค
- [x] `,` ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.
- [x] ํ•œ๊ธ€์ด ์•„๋‹ˆ๋ผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
- [x] ์ด๋ฆ„์€ ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค.
- [x] ์ตœ๋Œ€ ์ง(๊ทธ๋ฃน) ์ธ์› ์ˆ˜๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค.
- [x] ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
- [x] ์ด๋ฆ„ ์ˆ˜ < ์ตœ๋Œ€ ์ง(๊ทธ๋ฃน) ์ธ์› ์ˆ˜์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
- [x] ์žฌ์ถ”์ฒœ ์—ฌ๋ถ€๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค.
- [x] `y` ๋˜๋Š” `n` ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

**์ถœ๋ ฅ**

- [x] ์ง ์ถ”์ฒœ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค
- [x] `[ ์ด๋ฆ„1 | ... | ์ด๋ฆ„2 ]` ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
- [x] ์˜ˆ์™ธ๋Š” `[ERROR]`์™€ ๋ฉ”์‹œ์ง€๋ฅผ ํ•จ๊ป˜ ์ถœ๋ ฅํ•œ๋‹ค.

**์‚ฌ๋žŒ**

- [x] ์ด๋ฆ„์€ 5๊ธ€์ž ์ด๋‚ด์ด๋‹ค.

**์ง**

- [x] ์ตœ๋Œ€ ์ง ์ˆ˜๋Š” ์‚ฌ๋žŒ ์ˆ˜๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

**๋งค์นญ**

- [x] ๋žœ๋ค์œผ๋กœ ๋งค์นญํ•œ๋‹ค.
37 changes: 3 additions & 34 deletions src/main/java/leets/leets_mate/LeetsMateApplication.java
Original file line number Diff line number Diff line change
@@ -1,42 +1,11 @@
package leets.leets_mate;

import java.util.*;
import leets.leets_mate.controller.Computer;

public class LeetsMateApplication {

// ๋™์ž‘ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public void run() {
}

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

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

// ๋ฉค๋ฒ„ ๋ฌธ์ž์—ด์— ์˜์–ด๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์˜ˆ์™ธ ์ถœ๋ ฅ
public void checkHasNoEnglish(String members) {
}

// ๋ฉค๋ฒ„์ˆ˜์™€ ์ตœ๋Œ€ ์ง์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด ์˜ˆ์™ธ ์ถœ๋ ฅ
public void checkDataValidity(int memberCount, int maximumGroupSize) {
}

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

// ๊ฒฐ๊ณผ๋ฅผ ํ”„๋ฆฐํŠธ ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
public void printResult(List<List<String>> result) {
}

public static void main(String[] args) {
LeetsMateApplication app = new LeetsMateApplication();
app.run();
Computer computer = new Computer();
computer.run();
}
}
69 changes: 69 additions & 0 deletions src/main/java/leets/leets_mate/controller/Computer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package leets.leets_mate.controller;

import leets.leets_mate.domain.*;
import leets.leets_mate.view.InputView;
import leets.leets_mate.view.OutputView;

import java.util.List;

public class Computer {

private final InputView inputView = new InputView();
private final OutputView outputView = new OutputView();

public void run() {
outputView.printStartNotice();
Names names = readNames();
PairCount pairCount = readPairCount(names.countNames());

PairMatcher pairMatcher = new PairMatcher(pairCount, new RandomNumbersGenerator());
matchPairs(pairMatcher, names);
outputView.printEndNotice();
}

private void matchPairs(PairMatcher pairMatcher, Names names) {
List<Pair> pairs = pairMatcher.match(names);
printPairMatchResult(pairs);

RetryOpinion retryOpinion = readRetry();
if (retryOpinion.isContinue()) {
outputView.printBreakLine();
matchPairs(pairMatcher, names);
}
}

private void printPairMatchResult(List<Pair> pairs) {
outputView.printPairMatchResultNotice();
pairs.forEach(pair -> outputView.printPairMatchResult(pair.names()));
outputView.printPairMatchFinishNotice();
}

private Names readNames() {
List<String> rawNames = inputView.readNames();
try {
List<Name> names = rawNames.stream()
.map(Name::new)
.toList();
return new Names(names);
} catch (IllegalArgumentException e) {
outputView.printError(e.getMessage());
return readNames();
}
}

private PairCount readPairCount(int namesCount) {
int pairCount = inputView.readPairCount();
try {
new PairCountValidator().validate(pairCount, namesCount);
return new PairCount(pairCount);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return readPairCount(namesCount);
}
}

private RetryOpinion readRetry() {
String input = inputView.readRetry();
return RetryOpinion.match(input);
}
}
39 changes: 39 additions & 0 deletions src/main/java/leets/leets_mate/domain/Name.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package leets.leets_mate.domain;

import java.util.Objects;

public class Name {

private static final int MAX_LENGTH = 5;
private static final String ERROR_FORMAT = "[ERROR] ์ด๋ฆ„์€ %d์ž ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.";

private final String name;

public Name(String name) {
validate(name);
this.name = name;
}

private void validate(String name) {
if (name.length() > MAX_LENGTH) {
throw new IllegalArgumentException(String.format(ERROR_FORMAT, MAX_LENGTH));
}
}

public String asString() {
return name;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Name name = (Name) o;
return Objects.equals(this.name, name.name);
}

@Override
public int hashCode() {
return Objects.hash(name);
}
}
50 changes: 50 additions & 0 deletions src/main/java/leets/leets_mate/domain/Names.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package leets.leets_mate.domain;

import java.util.List;
import java.util.Objects;

public class Names {

private static final int MIN_SIZE = 2;
private static final String ERROR_FORMAT = "[ERROR] ์ด๋ฆ„์€ %d๊ฐœ ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.";

private final List<Name> names;

public Names(List<Name> names) {
validate(names);
this.names = names;
}

private void validate(List<Name> names) {
if (names.size() < MIN_SIZE) {
throw new IllegalArgumentException(String.format(ERROR_FORMAT, MIN_SIZE));
}
}

public int countNames() {
return names.size();
}

public List<Name> findByIndexes(List<Integer> indexes) {
return indexes.stream()
.map(names::get)
.toList();
}

public List<Name> findByIndexes(RandomNumbers randomNumbers) {
return randomNumbers.findNames(names);
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Names names = (Names) o;
return Objects.equals(this.names, names.names);
}

@Override
public int hashCode() {
return Objects.hash(names);
}
}
32 changes: 32 additions & 0 deletions src/main/java/leets/leets_mate/domain/Pair.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package leets.leets_mate.domain;

import java.util.List;
import java.util.Objects;

public class Pair {

private final List<Name> names;

public Pair(List<Name> names) {
this.names = names;
}

public List<String> names() {
return names.stream()
.map(Name::asString)
.toList();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Pair pair = (Pair) o;
return Objects.equals(names, pair.names);
}

@Override
public int hashCode() {
return Objects.hash(names);
}
}
14 changes: 14 additions & 0 deletions src/main/java/leets/leets_mate/domain/PairCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package leets.leets_mate.domain;

public class PairCount {

private final int value;

public PairCount(int value) {
this.value = value;
}

public int value() {
return value;
}
}
13 changes: 13 additions & 0 deletions src/main/java/leets/leets_mate/domain/PairCountValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package leets.leets_mate.domain;

public class PairCountValidator {

private static final int MIN_COUNT = 2;
private static final String ERROR_FORMAT = "[ERROR] ์ตœ๋Œ€ ์ง ์ˆ˜๋Š” %d ์ด์ƒ, ์ด๋ฆ„ ์ˆ˜ ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.";

public void validate(int maxCount, int namesCount) {
if (maxCount < MIN_COUNT || maxCount > namesCount) {
throw new IllegalArgumentException(String.format(ERROR_FORMAT, MIN_COUNT));
}
}
}
23 changes: 23 additions & 0 deletions src/main/java/leets/leets_mate/domain/PairMatcher.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package leets.leets_mate.domain;

import java.util.List;

public class PairMatcher {

private final PairCount pairCount;
private final RandomNumbersGenerator randomNumbersGenerator;

public PairMatcher(PairCount pairCount, RandomNumbersGenerator randomNumbersGenerator) {
this.pairCount = pairCount;
this.randomNumbersGenerator = randomNumbersGenerator;
}

public List<Pair> match(Names names) {
RandomNumbers randomNumbers = randomNumbersGenerator.randomNumbers(names.countNames());
List<RandomNumbers> splitRandomNumbers = randomNumbers.splitBySize(pairCount.value());
return splitRandomNumbers.stream()
.map(names::findByIndexes)
.map(Pair::new)
.toList();
}
}
27 changes: 27 additions & 0 deletions src/main/java/leets/leets_mate/domain/RandomNumbers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package leets.leets_mate.domain;

import java.util.List;
import java.util.stream.IntStream;

public class RandomNumbers {

private final List<Integer> values;

public RandomNumbers(List<Integer> values) {
this.values = values;
}

public List<RandomNumbers> splitBySize(int size) {
int length = values.size();
return IntStream.iterate(0, i -> i < length, i -> i + size)
.mapToObj(i -> values.subList(i, Math.min(i + size, length)))
.map(RandomNumbers::new)
.toList();
}

public List<Name> findNames(List<Name> names) {
return values.stream()
.map(names::get)
.toList();
}
}
17 changes: 17 additions & 0 deletions src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package leets.leets_mate.domain;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.IntStream;

public class RandomNumbersGenerator {

public RandomNumbers randomNumbers(int bound) {
List<Integer> randomNumbers = new ArrayList<>(IntStream.range(0, bound)
.boxed()
.toList());
Collections.shuffle(randomNumbers);
return new RandomNumbers(randomNumbers);
}
}
Loading