Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
/target/
.idea/
.vscode/
/.metadata/
136 changes: 136 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<<<<<<< HEAD
# java-racingcar-precourse

## 기능
Expand Down Expand Up @@ -31,3 +32,138 @@

## 기타
- 잘못된 값 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료

=======
{\rtf1\ansi\ansicpg949\cocoartf2822
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;\f1\fnil\fcharset129 AppleSDGothicNeo-Regular;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid1\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid2\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid1}
{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid101\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid102\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid2}
{\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid201\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid3}
{\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid301\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid4}}
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}}
\paperw11900\paperh16840\margl1440\margr1440\vieww11520\viewh8400\viewkind0
\deftab560
\pard\pardeftab560\slleading20\partightenfactor0

\f0\fs26 \cf0 # java-car-racing\
\pard\pardeftab560\slleading20\pardirnatural\partightenfactor0
\cf0 \
\pard\pardeftab560\slleading20\partightenfactor0
\cf0 ## \uc0\u44592 \u45733 \
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls1\ilvl0
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u51088 \u46041 \u52264 \u51060 \u47492 \u44284 \u49892 \u54665 \u54943 \u49688 \u47484 \u48512 \u50668 \u48155 \u45716 \u45796 .\
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls1\ilvl1
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u51088 \u46041 \u52264 \u51060 \u47492 \u51008 \u49788 \u54364 (,)\u47484 \u44592 \u51456 \u51004 \u47196 \u44396 \u48516 \u54616 \u44256 5\u51088 \u51060 \u54616 \u47564 \u44032 \u45733 \u54616 \u45796 .\
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls1\ilvl0
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u51452 \u50612 \u51652 \u54943 \u49688 \u46041 \u50500 n \u45824 \u51032 \u51088 \u46041 \u52264 \u45716 \u51204 \u51652 \u54616 \u44144 \u45208 \u47688 \u52656 \u51080 \u45716 \u45796 .\
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls1\ilvl1
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 0-9 \uc0\u49324 \u51060 \u51032 \u47924 \u51089 \u50948 \u44050 \u51012 \u44396 \u54620 \u54980 \u44536 \u44050 \u51060 4 \u51060 \u49345 \u51064 \u44221 \u50864 \u51204 \u51652 \u54620 \u45796 .\
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls1\ilvl0
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u49892 \u54665 \u51060 \u54620 \u48264 \u45149 \u45216 \u46412 \u47560 \u45796 \u49892 \u54665 \u44208 \u44284 \u47484 \u52636 \u47141 \u54616 \u44256 \u51060 \u46412 \u51088 \u46041 \u52264 \u51060 \u47492 \u51012 \u44057 \u51060 \u52636 \u47141 \u54620 \u45796 .\
\ls1\ilvl0
\fs24 {\listtext \uc0\u8259 }
\fs26 \uc0\u51088 \u46041 \u52264 \u44221 \u51452 \u44172 \u51076 \u51012 \u50756 \u47308 \u54620 \u54980 \u45572 \u44032 \u50864 \u49849 \u54664 \u45716 \u51648 \u47484 \u50508 \u47140 \u51456 \u45796 . \u50864 \u49849 \u51088 \u45716 \u54620 \u47749 \u51060 \u49345 \u51068 \u49688 \u51080 \u45796 .\
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls1\ilvl1
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u44277 \u46041 \u50864 \u49849 \u51032 \u44221 \u50864 \u49788 \u54364 (,)\u47484 \u49324 \u50857 \u54644 \u44396 \u48516 \u54620 \u45796 \
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls1\ilvl0
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u49324 \u50857 \u51088 \u44032 \u51096 \u47803 \u46108 \u44050 \u51012 \u51077 \u47141 \u54624 \u44221 \u50864 \'a0IllegalArgumentException\u51012 \u48156 \u49373 \u49884 \u53416 \u54980 \u50528 \u54540 \u47532 \u52992 \u51060 \u49496 \u51008 \u51333 \u47308 \u46104 \u50612 \u50556 \u54620 \u45796 \
\pard\pardeftab560\slleading20\partightenfactor0
\cf0 \
## \uc0\u49892 \u54665 \u48169 \u48277 \
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls2\ilvl0
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u44221 \u51452 \u54624 \u51088 \u46041 \u52264 \u51060 \u47492 \u51012 \u51077 \u47141 \u54620 \u45796 \
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls2\ilvl1
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u51088 \u46041 \u52264 \u51060 \u47492 \u51012 \u49788 \u54364 (,) \u44592 \u51456 \u51004 \u47196 \u44396 \u48516 \u54620 \u45796 \
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls2\ilvl0
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u49884 \u46020 \u54624 \u54943 \u49688 \u47484 \u51077 \u47141 \u54620 \u45796 \
\ls2\ilvl0
\fs24 {\listtext \uc0\u8259 }
\fs26 \uc0\u52264 \u49688 \u48324 \u49892 \u54665 \u44208 \u44284 \u47484 \u52636 \u47141 \u54620 \u45796 \
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls2\ilvl1
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u51652 \u52636 \u54620 \u47564 \u53372 -\u47196 \u54364 \u49884 \u54620 \u45796 \
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls2\ilvl0
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u50864 \u49849 \u51088 \u47484 \u52636 \u47141 \u54620 \u45796 \
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls2\ilvl1
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u44277 \u46041 \u50864 \u49849 \u51032 \u44221 \u50864 \u49788 \u54364 (,)\u47196 \u44396 \u48516 \u54644 \u52636 \u47141 \u54620 \u45796 \
\pard\pardeftab560\slleading20\pardirnatural\partightenfactor0
\cf0 \
\pard\pardeftab560\slleading20\partightenfactor0
\cf0 ## \uc0\u44396 \u54788 \u54624 \u44592 \u45733 \u47785 \u47197 \
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls3\ilvl0
\fs24 \cf0 {\listtext \uc0\u8259 }
\fs26 \uc0\u51088 \u46041 \u52264 \u51060 \u47492 \u51077 \u47141 \u48155 \u44592 \
\ls3\ilvl0
\fs24 {\listtext \uc0\u8259 }
\fs26 \uc0\u49892 \u54665 \u54943 \u49688 \u51077 \u47141 \u48155 \u44592 \
\ls3\ilvl0
\fs24 {\listtext \uc0\u8259 }
\fs26 \uc0\u51312 \u44148 \u50640 \u46384 \u46972 \u51204 \u51652 \u54616 \u44592 \
\ls3\ilvl0
\fs24 {\listtext \uc0\u8259 }
\fs26 \uc0\u49892 \u54665 \u44208 \u44284 \u52636 \u47141 \u54616 \u44592 \
\ls3\ilvl0
\fs24 {\listtext \uc0\u8259 }
\fs26 \uc0\u50864 \u49849 \u51088 \u54032 \u48324 \u54616 \u44592 \
\ls3\ilvl0
\fs24 {\listtext \uc0\u8259 }
\fs26 \uc0\u50864 \u49849 \u51088 \u52636 \u47141 \u54616 \u44592 \
\pard\pardeftab560\slleading20\pardirnatural\partightenfactor0
\cf0 \
\pard\pardeftab560\slleading20\partightenfactor0
\cf0 ## \uc0\u50756 \u47308 \u46108 \u44592 \u45733 \
\pard\pardeftab560\slleading20\pardirnatural\partightenfactor0
\cf0 \
\pard\pardeftab560\slleading20\partightenfactor0
\cf0 ## \uc0\u44592 \u53440 \
\pard\pardeftab560\pardirnatural\partightenfactor0
\ls4\ilvl0
\fs24 \cf0 {\listtext \uc0\u8259 }
\f1\fs26 \'c0\'df\'b8\'f8\'b5\'c8
\f0
\f1 \'b0\'aa
\f0
\f1 \'c0\'d4\'b7\'c2\'c7\'d2
\f0
\f1 \'b0\'e6\'bf\'ec
\f0 IllegalArgumentException
\f1 \'c0\'bb
\f0
\f1 \'b9\'df\'bb\'fd\'bd\'c3\'c5\'b2
\f0
\f1 \'c8\'c4
\f0
\f1 \'be\'d6\'c7\'c3\'b8\'ae\'c4\'c9\'c0\'cc\'bc\'c7\'c0\'ba
\f0
\f1 \'c1\'be\'b7\'e1
\f0 \
}
>>>>>>> 1f6cf6e (main application작성)
10 changes: 10 additions & 0 deletions Utech2CarRacing/.classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>
1 change: 1 addition & 0 deletions Utech2CarRacing/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/bin/
17 changes: 17 additions & 0 deletions Utech2CarRacing/.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Utech2CarRacing</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
2 changes: 2 additions & 0 deletions Utech2CarRacing/.settings/org.eclipse.core.resources.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8
11 changes: 11 additions & 0 deletions Utech2CarRacing/.settings/org.eclipse.jdt.core.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=21
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=21
8 changes: 8 additions & 0 deletions Utech2CarRacing/src/module-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
*
*/
/**
*
*/
module Utech2CarRacing {
}
131 changes: 131 additions & 0 deletions Utech2CarRacing/src/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package racingcar;

import camp.nextstep.edu.missionutils.Console;
import camp.nextstep.edu.missionutils.Randoms;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

class Game {
public void start() {
InputView inputView = new InputView();
ResultView resultView = new ResultView();

Cars cars = inputView.inputCarNames();
int rounds = inputView.inputAttemptCount();

resultView.printResultMessage();

for (int i = 0; i < rounds; i++) {
cars.moveAll();
resultView.printRound(cars);
}

resultView.printWinners(cars.findWinners());
}
}

class InputView {
public Cars inputCarNames() {
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
String input = Console.readLine();
List<String> names = Arrays.stream(input.split(","))
.map(String::trim)
.toList();
return new Cars(names);
}

public int inputAttemptCount() {
System.out.println("시도할 횟수는 몇 회인가요?");
String input = Console.readLine();
validateNumeric(input);
return Integer.parseInt(input);
}

private void validateNumeric(String input) {
if (!input.matches("\\d+")) {
throw new IllegalArgumentException("숫자를 입력해야 합니다.");
}
}
}

class ResultView {
public void printResultMessage() {
System.out.println();
System.out.println("실행 결과");
}

public void printRound(Cars cars) {
for (Car car : cars.getCars()) {
System.out.println(car.getName() + " : " + "-".repeat(car.getPosition()));
}
System.out.println();
}

public void printWinners(List<String> winners) {
System.out.println("최종 우승자 : " + String.join(", ", winners));
}
}

class Car {
private static final int MOVE_THRESHOLD = 4;
private final String name;
private int position = 0;

public Car(String name) {
validateName(name);
this.name = name;
}

private void validateName(String name) {
if (name == null || name.isEmpty() || name.length() > 5) {
throw new IllegalArgumentException("자동차 이름은 1~5자여야 합니다.");
}
}

public void move() {
int randomNumber = Randoms.pickNumberInRange(0, 9);
if (randomNumber >= MOVE_THRESHOLD) {
position++;
}
}

public String getName() { return name; }
public int getPosition() { return position; }
}

class Cars {
private final List<Car> cars;

public Cars(List<String> names) {
this.cars = names.stream()
.map(Car::new)
.collect(Collectors.toList());
}

public void moveAll() {
cars.forEach(Car::move);
}

public List<Car> getCars() {
return cars;
}

public List<String> findWinners() {
int max = cars.stream()
.mapToInt(Car::getPosition)
.max()
.orElse(0);
return cars.stream()
.filter(c -> c.getPosition() == max)
.map(Car::getName)
.collect(Collectors.toList());
}
}

public class Application {
public static void main(String[] args) {
Game game = new Game();
game.start();
}
}