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
108 changes: 108 additions & 0 deletions 백성현/java-racingcar-6/src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,115 @@
package racingcar;

import racingcar.race.raceCar.RaceCar;
import racingcar.race.raceCar.RaceCarService;
import racingcar.race.raceCar.RaceCarServiceImpl;
import racingcar.race.raceMain.RaceService;
import racingcar.race.raceMain.RaceServiceImpl;
import racingcar.race.raceMain.RaceState;

import java.util.*;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현

RaceService raceService = new RaceServiceImpl();
RaceCarService raceCarService = new RaceCarServiceImpl();


Scanner car_scanner = new Scanner(System.in);
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
String car_input = car_scanner.nextLine(); // 입력받은 자동차 이름
String[] cars = car_input.split(",");

System.out.print("시도할 회수는 몇회인가요? ");
Scanner N_canner = new Scanner(System.in);
int N = N_canner.nextInt(); // 진행 횟수 입력


Map<String, RaceCar> carMap = new HashMap<>();

// Map에 저장
for (String car : cars) {
carMap.put(car, new RaceCar(car));
}

System.out.println("실행결과\n");
for (int i = 0; i < N; i++) {

for (String car : cars) {

RaceState currState = raceService.getState(); // GO or STAY
// System.out.println("현재 State: " + currState);

// RaceCar input_car = raceCarService.saveCarInfo(car, currState); // 이름, GO or STAY 입력
// => for문마다 객체가 새로 생성돼서 count가 누적되지 않음

RaceCar input_car = carMap.get(car);

raceCarService.savaCurrentState(input_car, currState);

if (input_car.getState().equals(RaceState.GO)) {
input_car.setCount(input_car.getCount() + 1);
input_car.getBar().append("-"); // GO이면 바로 "-" 추가 => 아래 문제 해결
}

// System.out.println(input_car.getCar_name() + " count : " + input_car.getCount());

// "-"가 중복적으로 추가되었던 이유
// for (int j = 0; j < input_car.getCount(); j++) {
// input_car.getBar().append("-");
// }


// System.out.println(input_car.getCar_name() + "의 현재 Bar: " + input_car.getBar());
System.out.println(input_car.getCar_name() + ": " + input_car.getBar());
}

System.out.println("\n------------------------------------------\n");
}

Map<RaceCar, Integer> winnerCar = new HashMap<>();

int[] count_val = new int[cars.length];
int carIdx = 0;

// count 값을 count_val에 넣기
for (RaceCar car : carMap.values()) {
count_val[carIdx] = car.getCount();
carIdx++;
}

// count_val에서 최대 count 찾기
int max = Arrays.stream(count_val).max().getAsInt();

for (RaceCar car : carMap.values()) {
if (car.getCount() == max) {
winnerCar.put(car, carIdx);
}
}

// 우승자 출력
// System.out.print("우승자: ");
// for (RaceCar car : winnerCar.keySet()) {
// System.out.print(car.getCar_name() + " ");
// }

// 깔끔하게 출력하기!!
System.out.print("우승자: ");
List<String> car_names = new ArrayList<>();
for (RaceCar car : winnerCar.keySet()) {
car_names.add(car.getCar_name());
}

System.out.println(String.join(", ", car_names));

// stream 이용하기!!
// System.out.print("우승자: ");
// System.out.println(
// winnerCar.keySet().stream()
// .map(RaceCar::getCar_name)
// .collect(Collectors.joining(", "))
// );
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package racingcar.race.raceCar;

import racingcar.race.raceMain.RaceState;

public class RaceCar {
private String car_name;
private int count; // "-" 출력할 개수
private RaceState state;
private StringBuilder bar = new StringBuilder("");
private RaceState curr_state;


public RaceState getCurr_state() {
return curr_state;
}

public void setCurr_state(RaceState curr_state) {
this.curr_state = curr_state;
}

public StringBuilder getBar() {
return bar;
}

public void setBar(StringBuilder bar) {
this.bar = bar;
}


public RaceCar(RaceState state) {
this.state = state;
}

public RaceCar(String car_name) {
this.car_name = car_name;
}

public RaceCar(String car_name, int total_count) {
this.car_name = car_name;
this.count = total_count;
}

public RaceCar(String car_name, RaceState state) {
this.car_name = car_name;
this.state = state;
}

public String getCar_name() {
return car_name;
}

public void setCar_name(String car_name) {
this.car_name = car_name;
}

public int getCount() {
return count;
}

public void setCount(int count) {
this.count = count;
}

public RaceState getState() {
return state;
}

public void setState(RaceState state) {
this.state = state;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package racingcar.race.raceCar;


import racingcar.race.raceMain.RaceState;

public interface RaceCarService {

// 자동차 이름 등록
RaceCar saveCarName(String name);

RaceCar saveCarInfo(String name, RaceState state);

RaceCar saveTotalCount(int total_count);

void savaCurrentState(RaceCar car, RaceState state);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package racingcar.race.raceCar;

import racingcar.race.raceMain.RaceState;

public class RaceCarServiceImpl implements RaceCarService {


// 사용자에게 차량 이름만 입력받기
@Override
public RaceCar saveCarName(String car_name) {
return new RaceCar(car_name);
}


@Override
public RaceCar saveCarInfo(String car_name, RaceState state) {
return new RaceCar(car_name, state);
}

@Override
public RaceCar saveTotalCount(int total_count) {
return null;
}

@Override
public void savaCurrentState(RaceCar car, RaceState state) {
car.setState(state);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package racingcar.race.raceMain;

import racingcar.race.raceCar.RaceCar;

public class Race {
private String car_name;
private int random_number;
private RaceState check_state;
private RaceCar race_car;


// getter
public String getCar_name() {
return car_name;
}

public int getRandom_number() {
return random_number;
}

public RaceState getCheck_state() {
return check_state;
}

public RaceCar getRace_car() {
return race_car;
}


// setter
public void setCar_name(String car_name) {
this.car_name = car_name;
}

public void setCheck_state(RaceState check_state) {
this.check_state = check_state;
}

public void setRandom_number(int random_number) {
this.random_number = random_number;
}

public void setRace_car(RaceCar race_car) {
this.race_car = race_car;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package racingcar.race.raceMain;

public interface RaceService {

// 자동차 상태 조회
RaceState getState(); // GO, STAY 구분
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package racingcar.race.raceMain;

import camp.nextstep.edu.missionutils.Randoms;

public class RaceServiceImpl implements RaceService {

@Override
public RaceState getState() {
int random_number = Randoms.pickNumberInRange(0,9);
// System.out.println(random_number); // 디버깅용

if(random_number >= 4) {
return RaceState.GO;
} else {
return RaceState.STAY;
}
}




}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package racingcar.race.raceMain;

public enum RaceState {
GO, STAY
// random number >= 4: GO
}