Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[자동차경주] 조윤정 미션 제출합니다. #1459

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
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
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
# java-racingcar-precourse

1. 자동차 이름과 시도 횟수를 입력받는다. 이름은 쉼표로 구분되며 5글자 이하이다. 이 단계에서는 조건과 함께 시도한 횟수만큼 출력이 오류없이 실행 되는지 확인한다.
2. 횟수를 입력할 때 camp.nextstep.edu.missionutils.Randoms으로 난수를 생성한다. 0~9 사이에서 무작위 값을 구한 후 값이 4 이상일 경우만 전진한다.
3. 우승자를 출력한다. 우승자는 한명 이상일 수 있으며 여러명일 경우 쉼표를 이용하여 구분한다.

1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ repositories {

dependencies {
implementation 'com.github.woowacourse-projects:mission-utils:1.2.0'

}

test {
Expand Down
124 changes: 123 additions & 1 deletion src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,129 @@
package racingcar;

import camp.nextstep.edu.missionutils.Randoms;
import camp.nextstep.edu.missionutils.Console;

import java.util.ArrayList;

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

System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
String[] nameList = splitName(getName());
System.out.println("시도할 횟수는 몇 회인가요?");
int num = Integer.parseInt(getNum());
result(nameList, num);

}

// 이름을 입력하는 메소드
public static String getName() {
String name = Console.readLine();

if (name.trim().isEmpty() || name.matches(",+") || !name.contains(",")){
throw new IllegalArgumentException("이름이 공백이거나, 구분자가 없거나, 구분자로만 입력되어 있습니다.");
}
return name;
}

// 몇 회 실행할건지 입력하는 메소드
public static String getNum() {
String num = Console.readLine(); // 사용자 입력 받기

try {
int number = Integer.parseInt(num);

if (number <= 0) {
throw new IllegalArgumentException("음수 혹은 0은 입력할 수 없습니다.");
}
return num;
} catch (NumberFormatException e) {
throw new IllegalArgumentException("숫자가 아닌 값을 입력할 수 없습니다."); // 숫자가 아닌 경우
}
}

// 랜덤 숫자 생성 메소드
public static int randomNum(){
int a = Randoms.pickNumberInRange(0,9);
return a;
}

// 랜덤 숫자가 4 이상인 경우 "-"를 리턴하는 메소드
public static String numBar(int randomNum){
String bar;
if(randomNum>3){
return "-";
}
return "";
}

// "-"의 갯수를 숫자로 변환하고 최댓값의 인덱스를 구하는 메소드
public static ArrayList<Integer> barToNum(String[] barList){

int[] numbers = new int[barList.length];

for(int i = 0; i < barList.length; i++){
numbers[i] = barList[i].length();
}

// 변환된 숫자 중 최댓값의 인덱스를 배열에 할당
ArrayList<Integer> indexNum = new ArrayList<>();

int maxValue = 0;
for (int value : numbers){
if(value > maxValue) {
maxValue = value;
}
}

for(int i =0; i < numbers.length; i++){
if (numbers[i] == maxValue){
indexNum.add(i);
}
}

return indexNum;
}

// 이름을 , 단위로 구분하는 메소드
public static String[] splitName(String name){
return name.split(",");
}

// 결과를 출력하는 메소드
public static void result(String[] nameList, int num){
System.out.println("실행 결과");

String[] barList = new String[nameList.length];
for(int j = 0; j< barList.length; j ++){
barList[j] = "";
}

int i = 0;
while(i<num){
for(int j =0; j< nameList.length; j++){
barList[j] +=numBar(randomNum());
System.out.println(nameList[j] +" : " + barList[j]);
}
System.out.println();
i++;
}
ArrayList<Integer> winnerNum = barToNum(barList);
ArrayList<String> winnerName = new ArrayList<>();

for(int n : winnerNum){
winnerName.add(nameList[n]);
}

String result = String.join(", ", winnerName);

// 결과출력
if(winnerName.size() == nameList.length){
System.out.println("전부 동점입니다");
} else{
System.out.println("최종 우승자 : " + result);
}

}

}
89 changes: 68 additions & 21 deletions src/test/java/racingcar/ApplicationTest.java
Original file line number Diff line number Diff line change
@@ -1,38 +1,85 @@
package racingcar;

import camp.nextstep.edu.missionutils.test.NsTest;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest;
import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

class ApplicationTest extends NsTest {
private static final int MOVING_FORWARD = 4;
private static final int STOP = 3;
class ApplicationTest {

void clearInputStream() {
System.setIn(new ByteArrayInputStream(new byte[0])); // 빈 스트림으로 설정
}

@Test
void 올바른_이름_입력() {
// given
String input = "car1,car2,car3\n"; // Console 입력을 위해 줄바꿈 추가
InputStream in = new ByteArrayInputStream(input.getBytes());
System.setIn(in);

// when
String result = Application.getName();

// then
assertThat(result).isEqualTo(input.trim());
}

@Test
void 올바르지_않은_이름_입력() {
// given
String input = ""; // 빈 문자열 입력
InputStream in = new ByteArrayInputStream(input.getBytes());
System.setIn(in);

// when & then
assertThatThrownBy(Application::getName)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("이름이 공백이거나, 구분자가 없거나, 구분자로만 입력되어 있습니다.");
}

@Test
void 기능_테스트() {
assertRandomNumberInRangeTest(
() -> {
run("pobi,woni", "1");
assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi");
},
MOVING_FORWARD, STOP
);
void 올바른_숫자_입력() {
// given
String input = "5\n";
InputStream in = new ByteArrayInputStream(input.getBytes());
System.setIn(in);

// when
String result = Application.getNum();

// then
assertThat(result).isEqualTo("5");
}

@Test
void 예외_테스트() {
assertSimpleTest(() ->
assertThatThrownBy(() -> runException("pobi,javaji", "1"))
void 올바르지_않은_숫자_입력() {
// given
String input = "0\n"; // 0 입력
InputStream in = new ByteArrayInputStream(input.getBytes());
System.setIn(in);

// when & then
assertThatThrownBy(Application::getNum)
.isInstanceOf(IllegalArgumentException.class)
);
.hasMessage("음수 혹은 0은 입력할 수 없습니다.");
}

@Override
public void runMain() {
Application.main(new String[]{});
@Test
void result_allCarsTied_printsTiedMessage() {
// given
String[] nameList = {"car1", "car2", "car3"};
int num = 3;

// when
Application.result(nameList, num);

//then 결과출력

}
}