일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- java알고리즘
- 코딩부트캠프후기
- 격파르타장점
- java최솟값구하기
- 프로그래머스
- java set 출력
- java list 출력
- 격파르타후기
- java참조자료형
- 인터프린터언어
- 노베이스부트캠프
- 격파르타합격후기
- java map 출력
- 격파르타비전공자
- java map
- java 자료구조 활용
- sqld자격증합격
- java set 저장
- 컴파일
- java list 저장
- java map 저장
- javaJRE
- 비전공자sqld
- 프로그래머스제일작은수
- 항해99후기
- java기본자료형
- javaJVM
- java알고리즘문제풀이
- 항해15기
- 작은수제거하기
- Today
- Total
코딩과 결혼합니다
230614 - 대망의 Java 야구 게임 본문
To do : 조건
진행 방식
내가 짠 코드 (랜덤한 숫자 생성하기)
for (int i = 0; i < n.length; i++) {
if (n[i] == index)
return true;
}
return false;
}
이건 다른 사람이 만든 코드를 가져온 것인데, 나중에 이 함수를 없애고 더 간단하게 코드 구현을 해보았다.(그 내용은 뒤에에서 다뤄보겠습니다.★)
1. exists 안에 매개변수 int n[ ] (= 랜덤 숫자들), int index (=랜덤 숫자)를 선언 해주고
2. 조건이 만족하면 for문 안을 돈다.
3. n[i]가 index 의 값과 같으면 true 값을 리턴
//컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑습니다. (ex) 123, 759
int n[] = new int[3];
int index = 0;
for (int i = 0; i < n.length; i++) {
do {
index = (int) (random() * 10);
} while (exists(n, index));
n[i] = index;
}
System.out.println(value);
}
4. 3개의 숫자가 필요하므로 int n[] (= 랜덤 숫자들)의 배열의 크기를 3으로 설정.
5. for문을 int n[] 의 크기만큼 도는데 먼저 선행(do)으로 index = (int) (random() * 10); 를 실행.
6. 다음 while (exists(n, index) -> n 안에 index의 요소가 있다면 다시 위로 올라가 랜덤한 숫자를 뽑아내고 n안에 index의 요소가 없으면 n[i] = index; -> n의 i번째 배열에 순서대로 숫자를 넣어줌. == 중복된 숫자가 없도록 하기 위함.

수정 코드 & 알게 된 내용 (랜덤한 숫자 생성하기)
int randomNumber;
for (int i = 0; i < 3; i++) {
do {
randomNumber = (int) (random() * 10);
} while (randomNumbers.contains(randomNumber));
randomNumbers.add(randomNumber);
}
1. 먼저, 변수명을 직관적으로 바꿔 주었다. int n[] , int index 라고 해놓고 코드를 작성하다보니 이게 뭘 나타내는 거였더라? 하면서 계속 위를 올려다 보게 되었다. 그래서 각각 변수명을 randomNumbers 와 randomNumber 로 변경해 주었다.
2. 함수를 쓰지 않고 코드를 간략하게 쓰는 방법은 없을까? 해서 randomNumbers를 List<Integer>형태로 바꿔주고 새로운 기능들을 사용해 보았다.
3. contains 기능 : randomNumbers 안에 randomNumber가 있는지 즉 '특정 문자열이 포함되어 있는지 확인하는 기능'
4. add 도 arrayList의 기능으로 데이터를 추가해주는 기능을 가졌다.
5. contains 로 중복된 숫자가 있으면 다른 랜덤 숫자를 뽑게 하고 중복된 숫자가 없으면 add !
이렇게 위의 기나긴 코드들을 보다 간단하게 그리고 알아보기 편하게 수정하였다.
++ 알게 된 것
randomNumber = (int) (random() * 10);
왜 10을 곱한 후에 (int)로 형변환을 해준것인가? random() 으로 랜덤한 수를 10개 정도 뽑아내 본다.
double dValue = Math.random();
System.out.println(dValue);
}

그럼 이런 결과 값들을 확인할 수 있다.
// random() * 10 => 0부터 10사이의 랜덤한 실수값을 내어주더. (0초과 10미만) -> (0.xxxx ~ 9.xxxxx)
// random() * 100 => 0부터 100사이의 랜덤한 실수값을 내어주더라 (0초과 100미만)
0초과 10 미만 사이의 숫자가 필요하므로 10을 곱해주고, 소수점 아래로는 필요 없으니 int형으로 변환한다.
내가 짠 코드 (유저가 입력한 숫자와 랜덤숫자 비교)
System.out.println("컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!");
int ball = 0;
int strike = 0;
while (strike != 3) {
System.out.print( ++count +"번째 시도 : ");
String number = sc.nextLine();
if (number.length() == 3) {
ball = 0;
strike = 0;
1. strike 가 3이면 유저가 입력한 숫자가 정답이 되므로 게임이 끝난다. 그러므로 strike가 3이 아닐 때에 while문을 돌게 하며 시도한 횟수 (++count => ++을 먼저 해준 이유는 '0'번째 시도가 아닌 '1'번째 시도를 나타내기 위함)를 세어주고
2. 계속해서 유저가 입력한 숫자를 비교하여 ball과 strike의 값을 돌 때마다 새로 업데이트 해준다.
3. if문 안에 ball=0, strike=0을 다시 넣은 이유는 이렇게 설정해 주지 않으면 다음 게임에 영향을 줄 수 있기 때문이다.
4. String 타입으로 유저의 입력 값을 받아서 그 입력 값이 length =3 을 만족하면
int first_num = number.charAt(0) - '0';
int second_num = number.charAt(1) - '0';
int third_num = number.charAt(2) - '0';
int[] box = {first_num, second_num, third_num};
5. 하나씩 쪼개주고 box라는 배열 안에 담는다.
for (int i = 0; i < 3; i++) {
if (box[i] == randomNumbers.get(i)) {
strike++;
} else if (box[i] == randomNumbers.get(0)) {
ball++;
} else if (box[i] == randomNumbers.get(1)) {
ball++;
} else if (box[i] == randomNumbers.get(2)) {
ball++;
}
}
System.out.println(ball+"B"+strike+"S");
} else {
System.out.println("숫자의 개수가 맞지 않습니다");
}
6. for문으로 box의 요소들을 하나씩 돌며 숫자와 위치가 모두 맞았을 때는 strike 값을
7. 위치는 맞지 않아도 숫자가 맞을 때는 ball값을 더하도록 하였다. (arrayList를 사용하고 있기 때문에 arrayList의 기능 .get() 을 써주어야 한다.)
8. 숫자의 개수 number.length() 가 3이 아닌 경우에는 "숫자의 개수가 맞지 않습니다" 를 print 한다.
수정 코드 & 알게 된 내용 (유저가 입력한 숫자와 랜덤숫자 비교)
.stream(number.split(""))
.map((element) -> {
return Integer.parseInt(element);
}).toList();
number.charAt()으로 하나 하나씩 따로 변수로 만들어 box에 집어 넣지 않고 List의 기능을 이용하여 담아 보았다.
.stream 으로 받은 값을 하나씩 쪼개주고
쪼개진 값을 .paraseInt로 int형식으로 형변환을 해서 .toList()로 만들어 box에 담아준다.
int targetNumber = box.get(i);
int currentRandomNumber = randomNumbers.get(i);
if(targetNumber == currentRandomNumber) {
strike++;
} else if (randomNumbers.contains(targetNumber)){
ball++;
}
}
System.out.println(ball+"B"+strike+"S");
} else {
System.out.println("숫자의 개수가 맞지 않습니다");
}
1. box안의 요소를 하나씩 돌면서 targetNumber에 넣고
2. randomNumbers안의 요소를 하나씩 돌면서 currentRandomNumber 에 넣어준다.
3. 다음 targetNumber == currentRandomNumber 일 때는 같은 만큼 strike 를 더해주고
4. randomNumbers.contains(targetNumber) 일 때, 즉 targetNumber의 요소가 randomNumbers에 포함된 요소일 때(= 위치는 다르지만 숫자가 같은게 존재할 때)는 포함된 요소의 수 만큼 ball을 더해준다.
++ 알게 된 것
List의 유용한 기능들을 알게 되었다. 아직 완벽하게 이해를 하지는 못했지만, 어떻게 기능이 구현되는지 스스로 생각해보는 기회를 가지며 다음에 이 부분에 대해 공부를 하게 된다면 좀 더 쉽게 다가오지 않을까 싶었다.
System.out.println( "게임을 종료합니다.");
}
}
마지막으로 strike가 3을 만족했을 때.
실행(완성)
'2세 > 기타' 카테고리의 다른 글
230616 - 프로그래머스 알고리즘 문제 풀기 (1) | 2023.06.16 |
---|---|
230615 - 자료구조 요리 레시피 메모장 만들기 (2) | 2023.06.15 |
230613 (0) | 2023.06.13 |
java: non-static variable passNum cannot be referenced from a static context (0) | 2023.06.13 |
230612 (0) | 2023.06.12 |