From 88d8f7cec0489d661cfa2b1736928c55575f2cd6 Mon Sep 17 00:00:00 2001 From: seryn6911-hub Date: Sun, 21 Sep 2025 15:48:39 +0900 Subject: [PATCH 1/4] Changes --- src/main/java/racingcar/Application.java | 57 +++++++++++++++++++++++- src/main/java/racingcar/Member.java | 43 ++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/main/java/racingcar/Member.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..8089bb3 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,62 @@ package racingcar; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + Scanner scanner = new Scanner(System.in); + + try { + // 경주차 이름 입력 + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String[] membersList = scanner.nextLine().split(","); + List members = new ArrayList<>(); + for (String s : membersList) { + if(s.length()>5){ + throw new IllegalArgumentException("글자수 5자 이하만"); + } + members.add(new Member(s.trim(), 0)); + + } + + // 시도 횟수 입력 + System.out.println("시도할 회수는 몇회인가요?"); + int tryNum = scanner.nextInt(); + if (tryNum <= 0) { + throw new IllegalArgumentException("시도 횟수 오류"); + } + + // 경주 실행 + for (int i = 0; i < tryNum; i++) { + for (Member m : members) { + m.startRandom(); + System.out.println(m.name + " : " + "-".repeat(m.go)); + } + System.out.println(); + } + + // 우승자 판단 + int max = -1; + List winners = new ArrayList<>(); + for (Member m : members) { + if (m.getGo() > max) { + max = m.getGo(); + winners.clear(); + winners.add(m.name); + } else if (m.getGo() == max) { + winners.add(m.name); + } + } + + // 최종 우승자 출력 + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + throw e; // 애플리케이션 종료 + } finally { + scanner.close(); + } } } diff --git a/src/main/java/racingcar/Member.java b/src/main/java/racingcar/Member.java new file mode 100644 index 0000000..88cae88 --- /dev/null +++ b/src/main/java/racingcar/Member.java @@ -0,0 +1,43 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.Random; + +public class Member { + String name; + int go; + + public Member(String name, int go) { + this.name = name; + this.go = go; + } + + public String getName() { + return name; + } + + public int getGo() { + return go; + } + + // 랜덤으로 오르거나 안 오르거나 + public void startRandom() { + int value = Randoms.pickNumberInRange(0, 9); + if (value >= 4) { + go++; + } + } + + private void validateName(String name) { + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("자동차 이름은 비어 있을 수 없습니다."); + } + if (name.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 5자 이하만 가능합니다."); + } + } + + + +} From df2486035b80d4221293173ee5fb6a428475989b Mon Sep 17 00:00:00 2001 From: seryn6911-hub Date: Sun, 21 Sep 2025 15:49:59 +0900 Subject: [PATCH 2/4] test --- src/main/java/racingcar/Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 8089bb3..d5d8e20 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -15,7 +15,7 @@ public static void main(String[] args) { List members = new ArrayList<>(); for (String s : membersList) { if(s.length()>5){ - throw new IllegalArgumentException("글자수 5자 이하만"); + throw new IllegalArgumentException("글자수 5자 이하"); } members.add(new Member(s.trim(), 0)); From 28b1786554c9482f3b6ca942bc8647239b569333 Mon Sep 17 00:00:00 2001 From: seryn6911-hub Date: Sun, 21 Sep 2025 17:19:07 +0900 Subject: [PATCH 3/4] =?UTF-8?q?MVC=20=ED=8C=A8=ED=84=B4=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 57 ++------------------- src/main/java/racingcar/Controller.java | 47 +++++++++++++++++ src/main/java/racingcar/Member.java | 26 ++++------ src/main/java/racingcar/View.java | 64 ++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 68 deletions(-) create mode 100644 src/main/java/racingcar/Controller.java create mode 100644 src/main/java/racingcar/View.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index d5d8e20..84cfc8e 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,62 +1,15 @@ package racingcar; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; - public class Application { public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); + View view = new View(); + Controller controller = new Controller(view); try { - // 경주차 이름 입력 - System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); - String[] membersList = scanner.nextLine().split(","); - List members = new ArrayList<>(); - for (String s : membersList) { - if(s.length()>5){ - throw new IllegalArgumentException("글자수 5자 이하"); - } - members.add(new Member(s.trim(), 0)); - - } - - // 시도 횟수 입력 - System.out.println("시도할 회수는 몇회인가요?"); - int tryNum = scanner.nextInt(); - if (tryNum <= 0) { - throw new IllegalArgumentException("시도 횟수 오류"); - } - - // 경주 실행 - for (int i = 0; i < tryNum; i++) { - for (Member m : members) { - m.startRandom(); - System.out.println(m.name + " : " + "-".repeat(m.go)); - } - System.out.println(); - } - - // 우승자 판단 - int max = -1; - List winners = new ArrayList<>(); - for (Member m : members) { - if (m.getGo() > max) { - max = m.getGo(); - winners.clear(); - winners.add(m.name); - } else if (m.getGo() == max) { - winners.add(m.name); - } - } - - // 최종 우승자 출력 - System.out.println("최종 우승자 : " + String.join(", ", winners)); + controller.startRace(); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); - throw e; // 애플리케이션 종료 - } finally { - scanner.close(); + throw e; } } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java new file mode 100644 index 0000000..9963f53 --- /dev/null +++ b/src/main/java/racingcar/Controller.java @@ -0,0 +1,47 @@ +package racingcar; + +import java.util.ArrayList; +import java.util.List; + +public class Controller { + private final View view; + private final List members = new ArrayList<>(); + + public Controller(View view) { + this.view = view; + } + + //레이스 시작 + public void startRace() { + // 경주차 등록 + String[] names = view.getMemberNames(); + for (String name : names) { + members.add(new Member(name.trim(),0)); + } + + // 시도 횟수 + int tryCount = view.getTryCount(); + + // 경주 진행 + for (int i = 0; i < tryCount; i++) { + for (Member m : members) { + m.startRandom(); + } + view.printProgress(members); + } + + // 우승자 계산 + int max = 0; + for (Member m : members) { + if (m.getGo() > max) { + max = m.getGo(); + } + } + List winners = new ArrayList<>(); + for (Member m : members) + if (m.getGo() == max) { + winners.add(m); + } + view.printWinners(winners); + } +} diff --git a/src/main/java/racingcar/Member.java b/src/main/java/racingcar/Member.java index 88cae88..46f05ea 100644 --- a/src/main/java/racingcar/Member.java +++ b/src/main/java/racingcar/Member.java @@ -5,12 +5,13 @@ import java.util.Random; public class Member { - String name; - int go; + private String name; + private int go; public Member(String name, int go) { + validateName(name); this.name = name; - this.go = go; + this.go = 0; } public String getName() { @@ -20,24 +21,17 @@ public String getName() { public int getGo() { return go; } - - // 랜덤으로 오르거나 안 오르거나 + //랜덤 뽑기 public void startRandom() { - int value = Randoms.pickNumberInRange(0, 9); - if (value >= 4) { + int randomValue = Randoms.pickNumberInRange(0, 9); + if (randomValue >= 4) { // 4 이상이면 전진 go++; } } - + //예외처리 private void validateName(String name) { - if (name == null || name.isBlank()) { - throw new IllegalArgumentException("자동차 이름은 비어 있을 수 없습니다."); - } - if (name.length() > 5) { - throw new IllegalArgumentException("자동차 이름은 5자 이하만 가능합니다."); + if (name == null || name.isBlank() || name.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 1~5자 사이여야 합니다."); } } - - - } diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java new file mode 100644 index 0000000..cd7527e --- /dev/null +++ b/src/main/java/racingcar/View.java @@ -0,0 +1,64 @@ +package racingcar; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class View { + private final Scanner scanner; + + public View() { + this.scanner = new Scanner(System.in); + } + + // 경주차 이름 입력 + public String[] getMemberNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + List lst = List.of(scanner.nextLine().split(",")); + + for (String s : lst) { + String trimmed = s.trim(); + + if (trimmed.isEmpty()) { + throw new IllegalArgumentException("자동차 이름이 공백"); + } + + if (trimmed.length() > 5) { + throw new IllegalArgumentException("이름 오류"); + } + } + + String[] result = new String[lst.size()]; + for (int i = 0; i < lst.size(); i++) { + result[i] = lst.get(i).trim(); + } + return result; + } + + // 시도 회수 결정 + public int getTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + int tryNum = scanner.nextInt(); + if (tryNum <= 0) { + throw new IllegalArgumentException("시도 횟수는 이상"); + } + return tryNum; + } + + // 경주차 간거 표시 + public void printProgress(List members) { + for (Member m : members) { + System.out.println(m.getName() + " : " + "-".repeat(m.getGo())); + } + System.out.println(); + } + + // 우승자 발표 + public void printWinners(List winners) { + List winnerNames = new ArrayList<>(); + for (Member winner : winners) { + winnerNames.add(winner.getName()); + } + System.out.println("최종 우승자 : " + String.join(", ", winnerNames)); + } +} \ No newline at end of file From 5ffcaa39a41995d01eb77268a52797b71fcdb94a Mon Sep 17 00:00:00 2001 From: seryn6911-hub Date: Sun, 21 Sep 2025 17:23:29 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/View.java | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index cd7527e..c2563ac 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -1,6 +1,5 @@ package racingcar; -import java.util.ArrayList; import java.util.List; import java.util.Scanner; @@ -10,8 +9,7 @@ public class View { public View() { this.scanner = new Scanner(System.in); } - - // 경주차 이름 입력 + //경주차 이름 입력 public String[] getMemberNames() { System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); List lst = List.of(scanner.nextLine().split(",")); @@ -28,14 +26,11 @@ public String[] getMemberNames() { } } - String[] result = new String[lst.size()]; - for (int i = 0; i < lst.size(); i++) { - result[i] = lst.get(i).trim(); - } - return result; + return lst.stream() + .map(String::trim) + .toArray(String[]::new); } - - // 시도 회수 결정 + //시도 회수 결정 public int getTryCount() { System.out.println("시도할 회수는 몇회인가요?"); int tryNum = scanner.nextInt(); @@ -44,21 +39,15 @@ public int getTryCount() { } return tryNum; } - - // 경주차 간거 표시 + //경주차 간거 표시 public void printProgress(List members) { for (Member m : members) { System.out.println(m.getName() + " : " + "-".repeat(m.getGo())); } System.out.println(); } - - // 우승자 발표 + //우승자 발표 public void printWinners(List winners) { - List winnerNames = new ArrayList<>(); - for (Member winner : winners) { - winnerNames.add(winner.getName()); - } - System.out.println("최종 우승자 : " + String.join(", ", winnerNames)); + System.out.println("최종 우승자 : " + String.join(", ", winners.stream().map(Member::getName).toList())); } } \ No newline at end of file