From 75d8114af8564d78d750e60493fdc65f081b2dc6 Mon Sep 17 00:00:00 2001 From: "leejaehoonmyljh25800@" Date: Tue, 31 Mar 2026 23:39:04 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=20=EA=B2=BD?= =?UTF-8?q?=EC=A3=BC=20=EA=B8=B0=EB=B3=B8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/main/racingcar/Application.class | Bin 0 -> 4824 bytes bin/test/racingcar/ApplicationTest.class | Bin 0 -> 7547 bytes src/main/java/racingcar/Application.java | 135 ++++++++++++++++++++++- 3 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 bin/main/racingcar/Application.class create mode 100644 bin/test/racingcar/ApplicationTest.class diff --git a/bin/main/racingcar/Application.class b/bin/main/racingcar/Application.class new file mode 100644 index 0000000000000000000000000000000000000000..19e476a19ce9ef50f51334af0fd03b5eafd6ae01 GIT binary patch literal 4824 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 T`FEQz$Ns{!{44vtY={2`KBkxp literal 0 HcmV?d00001 diff --git a/bin/test/racingcar/ApplicationTest.class b/bin/test/racingcar/ApplicationTest.class new file mode 100644 index 0000000000000000000000000000000000000000..5951e3dd81ca47fd44a92bfcecc0dc0704d8ab70 GIT binary patch literal 7547 zcmbVQ33yc175;CwnT!t-21G!Xh(SUO3<1JoL`4Ki8^DqnOl=(}lSdes%#5=Ha4T(t zMzIZwC?F`cR8VOfWieW{`)2KK_kC}fN%wuR{qKD<^IkG-Tj>JRyC1JQmj@ z9=$W+=?=tVbVDVHzc1M4iw5L%+E^0b9Eb^A*qk?^Mh25Q(wjQg>rEZmmpZnS*>6aM;(>0x zEf5P3YDFj%j;jqI($wZ~w9B(4!Ql8e5{TQSHFR0`t!05Ld)vdQ`>{(=ZE{2u$-S%LZSlGu&DOy}u2&dKNd&JH|~^(wLVN*%pFdGd7Dt5kYTOYJ_C z?Cy_QMRQU+Bx~k-gRS)^mRlNp|!q1 z$boB_lGy|;@hDZzg(ke&fj0@9Z>tI#nz5FW(@g}~N7j-w5E^B5ID@|Kj!s|od;!<0 z?S4I?+Qfmk2#hx=TQ^6;+hq4T(IQYD33mkQwuM6hC$6Uw*1K4@8#UY@35yxEynd^O z8}T+uU^o$vB&eVhYOI}{4#9<+aI*tmff-VfjB?-N@rR?j5+rNq`q0534VTu;?FZ%A(!g5Z&L3(T?4$R-dCVMNI04~ODBE(&z>u=BFU)o5sK z-UO|_=`_t#u6JWBD1vb$SQ>oM1O-|P3wsV(wjKV$lru*8n$BxUunkU z^2n55=xQ3f3>kal$OY0L5gCv8HY$gC#7)7V-sKCfh;}8q^-w%p@-EzgcQ|mTK;5Xv zHUeM6PP|h<3&fh#B;Z$Xt)HJ!J&$_)Far@M3^O!1v4>+rwwdcV4_E*eJF!1oaG=}g3CDhm9Ctgc95%ue<19B{! zFk*n6C$r*P;p%Xh(`(chS*yo4hdW~~d=wvd;A6vTJ`m~&Z`D1`O6lq7+e9G@M|WuW z1U|`a>NZURuUcz2{iFfDhSO3|k5xB^!&?)P#@rLKScW~=x+9`n-Ov4|K{@)f*0)L; zS;|lghuX%9GQ3;~O&a1h z8tziI@0zwBYv@z9ADOmaXt-C|es0>%YPe6?eq-8xr{TTI_FL2TXASo&+n-F^KQuh3 zY=1XxuWNW%+5VHYiDC_pNt-A#ZB7l3E1Sc#jnVLaWs{r2|G8Jft>H;!8)w=s&~QT8 zCYrXX8a}LS7n-(w%kWDemRDfXx zGrSBPVgX0d(Oo%&7&Yq<4FV0e`aVL}bKYnUv4oS}xjf3QRA83ZA*xt_@{_O#Q&5UB zUOCj2lh@^zYZpIHAU_T1F@`G-e+7R_YoEi|XVfE={3`*Z+c^G}u5_UKkLNF_@fvB) z=Sq4_Gy||34mO)%(g1b?|2i$yMB4Ng168|%aCTEFe z+Y&7$sSLYJ7O|R$HMWSJf{62N5$lLJ-xjgH zAmRdB#6?70YKyqAAmSoh#LJ0zl`UdJLBz$jh}RHtjV znO3oSE;Gus)GX8Xl6=*AJ)di5Wwr9(4{o&ZRb^|d(U#BJ7MEMwLN#NzqeB_?w~B)iFzcki1V%~1`XNmU11x{8j7A212==Y+6bnY!Pv;nE;8N2 zZ@H4=n3Gtm2eD?PgdL=O zKVrdf8c|jj$q|Dhx1Kqd5aT+fy?&~*+=cpD*7EB1V)urY_7Zn%%NexQoJISc){Q3ZSoQW8PnrqTC8^38;jhn9bCSuSUQUaouHXSgWry~-Z#{$C zO<+Tkr?E|^TR}`g!2W*?hNAM03`fUk0O6L%sbHDD( z_NzU0kksAm*N}zU>{m|gIn;M@bLEV5S!Q!puKP1m(R?YzBAx9)m952aXhixGi3Mz9 z4BIK;J2)ZTie

#WK-gG4`EzXY#H2Cpl%H;eK?m}JHrRsl+pjR_$-JP;Z9)0* zSQu2b${996&OxoR1?AW0If6cK2f8*FlrQOzu;q&IB3|O}YkX0EindSVbNIYky@D^| zOKSCHd<|b$tJm-?d|R!)gYV-9YV||>1V2@)pW&DIm0JB8Nu<wK$d4&)qqExNQM7eOO)p=s9s8Fj)Fn>EoO@vwVEU9#9YBoFxGmJ@Q8Y`5R=6su~;lEEB_xwM@G*8 literal 0 HcmV?d00001 diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..fd94c4c 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,140 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + List cars = makeCars(); + int tryCount = getTryCount(); + + System.out.println(); + System.out.println("실행 결과"); + + for (int i = 0; i < tryCount; i++) { + moveCars(cars); + printCars(cars); + } + + printWinners(cars); + } + + private static List makeCars() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + + List cars = new ArrayList<>(); + + for (String name : names) { + if (name.isEmpty()) { + throw new IllegalArgumentException(); + } + + if (name.chars().anyMatch(Character::isWhitespace)) { + throw new IllegalArgumentException(); + } + + if (name.length() > 5) { + throw new IllegalArgumentException(); + } + + checkDuplicate(cars, name); + cars.add(new Car(name)); + } + + return cars; + } + + private static void checkDuplicate(List cars, String name) { + for (Car car : cars) { + if (car.getName().equals(name)) { + throw new IllegalArgumentException(); + } + } + } + + private static int getTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + String input = Console.readLine(); + + int count; + try { + count = Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(); + } + + if (count <= 0) { + throw new IllegalArgumentException(); + } + + return count; + } + + private static void moveCars(List cars) { + for (Car car : cars) { + int number = Randoms.pickNumberInRange(0, 9); + if (number >= 4) { + car.move(); + } + } + } + + private static void printCars(List cars) { + for (Car car : cars) { + System.out.println(car.getName() + " : " + "-".repeat(car.getPosition())); + } + System.out.println(); + } + + private static void printWinners(List cars) { + int max = findMaxPosition(cars); + List winners = new ArrayList<>(); + + for (Car car : cars) { + if (car.getPosition() == max) { + winners.add(car.getName()); + } + } + + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } + + private static int findMaxPosition(List cars) { + int max = 0; + + for (Car car : cars) { + if (car.getPosition() > max) { + max = car.getPosition(); + } + } + + return max; + } + + static class Car { + private final String name; + private int position; + + public Car(String name) { + this.name = name; + this.position = 0; + } + + public void move() { + position++; + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } } } From ccbf29f3d160b287a64e520593abc5b7b118e3c5 Mon Sep 17 00:00:00 2001 From: "leejaehoonmyljh25800@" Date: Mon, 6 Apr 2026 00:48:09 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=EB=A5=BC=20RacingGame=EA=B3=BC=20Car=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 136 +---------------------- src/main/java/racingcar/Car.java | 26 +++++ src/main/java/racingcar/RacingGame.java | 132 ++++++++++++++++++++++ 3 files changed, 160 insertions(+), 134 deletions(-) create mode 100644 src/main/java/racingcar/Car.java create mode 100644 src/main/java/racingcar/RacingGame.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index fd94c4c..d7c05d1 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,140 +1,8 @@ package racingcar; -import camp.nextstep.edu.missionutils.Console; -import camp.nextstep.edu.missionutils.Randoms; - -import java.util.ArrayList; -import java.util.List; - public class Application { public static void main(String[] args) { - List cars = makeCars(); - int tryCount = getTryCount(); - - System.out.println(); - System.out.println("실행 결과"); - - for (int i = 0; i < tryCount; i++) { - moveCars(cars); - printCars(cars); - } - - printWinners(cars); - } - - private static List makeCars() { - System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); - String input = Console.readLine(); - String[] names = input.split(","); - - List cars = new ArrayList<>(); - - for (String name : names) { - if (name.isEmpty()) { - throw new IllegalArgumentException(); - } - - if (name.chars().anyMatch(Character::isWhitespace)) { - throw new IllegalArgumentException(); - } - - if (name.length() > 5) { - throw new IllegalArgumentException(); - } - - checkDuplicate(cars, name); - cars.add(new Car(name)); - } - - return cars; - } - - private static void checkDuplicate(List cars, String name) { - for (Car car : cars) { - if (car.getName().equals(name)) { - throw new IllegalArgumentException(); - } - } - } - - private static int getTryCount() { - System.out.println("시도할 회수는 몇회인가요?"); - String input = Console.readLine(); - - int count; - try { - count = Integer.parseInt(input); - } catch (NumberFormatException e) { - throw new IllegalArgumentException(); - } - - if (count <= 0) { - throw new IllegalArgumentException(); - } - - return count; - } - - private static void moveCars(List cars) { - for (Car car : cars) { - int number = Randoms.pickNumberInRange(0, 9); - if (number >= 4) { - car.move(); - } - } - } - - private static void printCars(List cars) { - for (Car car : cars) { - System.out.println(car.getName() + " : " + "-".repeat(car.getPosition())); - } - System.out.println(); - } - - private static void printWinners(List cars) { - int max = findMaxPosition(cars); - List winners = new ArrayList<>(); - - for (Car car : cars) { - if (car.getPosition() == max) { - winners.add(car.getName()); - } - } - - System.out.println("최종 우승자 : " + String.join(", ", winners)); - } - - private static int findMaxPosition(List cars) { - int max = 0; - - for (Car car : cars) { - if (car.getPosition() > max) { - max = car.getPosition(); - } - } - - return max; - } - - static class Car { - private final String name; - private int position; - - public Car(String name) { - this.name = name; - this.position = 0; - } - - public void move() { - position++; - } - - public String getName() { - return name; - } - - public int getPosition() { - return position; - } + RacingGame game = new RacingGame(); + game.start(); } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 0000000..d835a96 --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,26 @@ +package racingcar; + +public class Car { + + private final String name; + private int position; + + public Car(String name) { + this.name = name; + this.position = 0; + } + + public void move(int number, int threshold) { + if (number >= threshold) { + position++; + } + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/RacingGame.java b/src/main/java/racingcar/RacingGame.java new file mode 100644 index 0000000..2ec9f86 --- /dev/null +++ b/src/main/java/racingcar/RacingGame.java @@ -0,0 +1,132 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class RacingGame { + + private static final int MAX_CAR_NAME_LENGTH = 5; + private static final int MIN_TRY_COUNT = 1; + private static final int RANDOM_START = 0; + private static final int RANDOM_END = 9; + private static final int MOVE_THRESHOLD = 4; + + public void start() { + List cars = createCars(); + int tryCount = inputTryCount(); + + System.out.print('\n'); + System.out.println("실행 결과"); + + for (int i = 0; i < tryCount; i++) { + moveCars(cars); + printCars(cars); + } + + printWinners(cars); + } + + private List createCars() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + + validateNames(names); + + List cars = new ArrayList<>(); + for (String name : names) { + cars.add(new Car(name)); + } + return cars; + } + + private int inputTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + String input = Console.readLine(); + int count = parseTryCount(input); + + if (count < MIN_TRY_COUNT) { + throw new IllegalArgumentException(); + } + + return count; + } + + private int parseTryCount(String input) { + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(); + } + } + + private void validateNames(String[] names) { + List used = new ArrayList<>(); + + for (String name : names) { + validateName(name); + + if (used.contains(name)) { + throw new IllegalArgumentException(); + } + used.add(name); + } + } + + private void validateName(String name) { + if (name.isEmpty()) { + throw new IllegalArgumentException(); + } + + if (name.chars().anyMatch(Character::isWhitespace)) { + throw new IllegalArgumentException(); + } + + if (name.length() > MAX_CAR_NAME_LENGTH) { + throw new IllegalArgumentException(); + } + } + + private void moveCars(List cars) { + for (Car car : cars) { + int number = Randoms.pickNumberInRange(RANDOM_START, RANDOM_END); + car.move(number, MOVE_THRESHOLD); + } + } + + private void printCars(List cars) { + for (Car car : cars) { + System.out.println(car.getName() + " : " + "-".repeat(car.getPosition())); + } + System.out.print('\n'); + } + + private void printWinners(List cars) { + int max = findMaxPosition(cars); + List winners = findWinners(cars, max); + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } + + private int findMaxPosition(List cars) { + int max = 0; + for (Car car : cars) { + max = Math.max(max, car.getPosition()); + } + return max; + } + + private List findWinners(List cars, int max) { + List winners = new ArrayList<>(); + + for (Car car : cars) { + if (car.getPosition() == max) { + winners.add(car.getName()); + } + } + + return winners; + } +} From d25ca8f3a69780f19283f150f9e1f3b9571e03bf Mon Sep 17 00:00:00 2001 From: "leejaehoonmyljh25800@" Date: Mon, 6 Apr 2026 00:50:03 +0900 Subject: [PATCH 3/4] =?UTF-8?q?bin=EA=B3=BC=20class=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=A0=9C=EC=99=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 100e36f..470ab7e 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ out/ ### VS Code ### .vscode/ .DS_Store +bin/ +*.calss From c368c1ebf64a85fb5845a857f4f6b2a984cbf45a Mon Sep 17 00:00:00 2001 From: "leejaehoonmyljh25800@" Date: Mon, 6 Apr 2026 00:54:59 +0900 Subject: [PATCH 4/4] =?UTF-8?q?gitignore=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 470ab7e..9e2c655 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,4 @@ out/ .vscode/ .DS_Store bin/ -*.calss +*.class