Skip to content

Commit b295c3f

Browse files
authored
고생하셨습니다.
🎉 PR 머지 완료! 🎉
1 parent e2e18ab commit b295c3f

File tree

5 files changed

+163
-7
lines changed

5 files changed

+163
-7
lines changed

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,10 @@
99
4. Java Style Guide를 기반으로 자바 코드 컨벤션을 지킴
1010
5. indent depth는 2를 넘지 않는다 -> 함수로 분리
1111
6. 3항 연산자, else 예약어 금지
12-
7. 함수의 길이는 15라인을 넘어가지 않는다. -> 한 가지 일만 하도록 구현
12+
7. 함수의 길이는 15라인을 넘어가지 않는다. -> 한 가지 일만 하도록 구현
13+
14+
## 2단계 : 우승 자동차 구하기
15+
요구사항
16+
1. n대의 자동차가 참여할 수 있다
17+
2. 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다
18+
3. 자동차 경주 게임을 완료한 후 누가 우승했는지 구할 수 있다. 우승자는 1명 이상일 수 있다.

src/main/java/Car.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,29 @@ public class Car {
22
private static final int MOVE_THRESHOLD = 4;
33

44

5-
private String carName;
6-
private int carPosition = 0;
5+
private String name;
6+
private int position = 0;
77
private final MoveCondition moveCondition;
88

99
public Car(String carName, MoveCondition moveCondition) {
1010
if (carName == null || carName.trim().isEmpty()) {
1111
throw new IllegalArgumentException("차의 이름이 비어있습니다");
1212
}
13-
this.carName = carName;
13+
this.name = carName;
1414
this.moveCondition = moveCondition;
1515
}
1616

1717
public int getPosition() {
18-
return carPosition;
18+
return position;
1919
}
2020

2121
public String getName() {
22-
return carName;
22+
return name;
2323
}
2424

2525
public void move(int value){
2626
if (moveCondition.isMovable(value)) {
27-
carPosition++;
27+
position++;
2828
}
2929
}
3030
}

src/main/java/CarWinner.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import java.util.ArrayList;
2+
3+
public class CarWinner {
4+
private Car[] cars; //참가한 자동차들
5+
private int winnerPosition; //우승 자동차의 위치(최대값)
6+
private int winnerCnt; //우승 자동차의 수
7+
private ArrayList<String> winnerNames; //우승 자동차의 이름
8+
9+
public CarWinner(Car[] cars) {
10+
this.cars = cars;
11+
winnerCnt = 0;
12+
winnerPosition = Integer.MIN_VALUE;
13+
winnerNames = new ArrayList<>();
14+
}
15+
16+
public int getWinnerCnt() {
17+
return winnerCnt;
18+
}
19+
20+
public int getWinnerPosition() {
21+
return winnerPosition;
22+
}
23+
24+
public ArrayList<String> getWinnerName() {
25+
return winnerNames;
26+
}
27+
28+
public void whichWinner(int testRounds){
29+
//1. 모든 자동차를 주어진 횟수만큼 이동
30+
moveAllCars(testRounds);
31+
//2. 우승자의 수와 자동차의 위치(최대값) 계산
32+
countWinners();
33+
//3. 우승자 이름 저장
34+
saveWinnerName();
35+
}
36+
37+
//1. 모든 자동차를 주어진 횟수만큼 이동
38+
private void moveAllCars(int testRounds){
39+
for (Car car : cars) {
40+
for (int i = 0; i < testRounds; i++) {
41+
car.move(RandomUtil.randomGenerator());
42+
}
43+
}
44+
}
45+
46+
//2. 우승자의 수와 자동차의 위치(최대값) 계산
47+
private void countWinners(){
48+
for (Car car : cars) {
49+
updateWinnerCount(car);
50+
}
51+
}
52+
53+
//2-1. 자동차 한 대씩 우승자의 수와 최고 위치 갱신
54+
private void updateWinnerCount(Car car) {
55+
int position = car.getPosition();
56+
if (position > winnerPosition) {
57+
winnerCnt = 1;
58+
winnerPosition = position;
59+
return;
60+
}
61+
if (position == winnerPosition) {
62+
winnerCnt++;
63+
}
64+
}
65+
66+
//3. 우승자 이름 저장
67+
private void saveWinnerName(){
68+
for (Car car : cars) {
69+
if (car.getPosition() == winnerPosition) {
70+
winnerNames.add(car.getName());
71+
}
72+
}
73+
}
74+
}
75+
76+

src/main/java/Cars.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import java.util.*;
2+
import java.util.stream.Collectors;
3+
import java.util.stream.IntStream;
4+
5+
public class Cars {
6+
//자동차 경주에 참가하는 자동차들의 집합
7+
private List<Car> cars;
8+
9+
public Cars(List<Car> cars) {
10+
this.cars = cars;
11+
}
12+
13+
//자동차 이동
14+
public void moveAll(int testRounds) {
15+
for (Car car : cars) {
16+
IntStream.range(0, testRounds)
17+
.forEach(i -> car.move(RandomUtil.randomGenerator()));
18+
}
19+
}
20+
21+
//이동된 자동차들의 최대위치 구하기
22+
private int getMaxPosition() {
23+
return cars.stream()
24+
.mapToInt(Car::getPosition)
25+
.max()
26+
.orElse(0);
27+
}
28+
29+
//우승 자동차 목록
30+
public List<Car> getWinners() {
31+
int max = getMaxPosition();
32+
return cars.stream()
33+
.filter(car -> car.getPosition() == max)
34+
.collect(Collectors.toList());
35+
}
36+
37+
//우승 자동차 이름 목록
38+
public List<String> getWinnerNames() {
39+
return getWinners().stream()
40+
.map(Car::getName)
41+
.collect(Collectors.toList());
42+
}
43+
44+
//우승 자동차의 수
45+
public int getWinnerCount() {
46+
return getWinners().size();
47+
}
48+
49+
}

src/test/java/CarTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import org.junit.jupiter.api.DisplayName;
22
import org.junit.jupiter.api.Test;
3+
import org.junit.jupiter.params.ParameterizedTest;
4+
import org.junit.jupiter.params.provider.ValueSource;
5+
6+
import java.util.List;
37

48
import static org.junit.jupiter.api.Assertions.*;
59

@@ -56,6 +60,27 @@ void carMultipleMove() {
5660
assertThat(car.getPosition()).isEqualTo(2);
5761
}
5862

63+
@ParameterizedTest
64+
@ValueSource(ints = {1, 2, 3})
65+
@DisplayName("주어진 횟수 동안 n대의 자동차 중에 우승자가 m명 이상 나온다")
66+
void whichCarsIsWin(int value) {
67+
Car carA = new Car("A",moveCondition);
68+
Car carB = new Car("B",moveCondition);
69+
Car carC = new Car("C",moveCondition);
70+
71+
Cars cars = new Cars(List.of(carA, carB, carC));
72+
73+
int testRounds = 1;
74+
cars.moveAll(testRounds);
75+
76+
//우승자는 n명 이상 나온다
77+
assertThat(cars.getWinnerCount()).isGreaterThanOrEqualTo(value);
78+
//우승자의 수와 이름의 수가 같아야 한다
79+
assertThat(cars.getWinnerCount()).isEqualTo(cars.getWinnerNames().size());
80+
}
81+
82+
83+
5984

6085
}
6186

0 commit comments

Comments
 (0)