180802 TIL 숫자 야구 구현
Aug 2, 2018
»
1막,
TIL (Today I Learned)
숫자야구 구현
- 오늘은 꼭 마스터즈 레벨2 과제인 숫자 야구를 뿌시겠다는 일념으로 집을 나섰다. (feat.공대친구)
- 과제: https://github.com/code-squad/test-item-pool/blob/master/level2-common/level2.md
- 디테일은 일단 생략하고 프로그램 구현부터 성공해보기로!
- 순서: 1) 1~9까지 중 겹치지 않는 random 수 3개 뽑고 2) 1~9까지 겹치지 않는 수 3개 입력받고 3) 입력 = random (스트라이크, 볼) 확인하고 4) 3 스트라이크일때까지 2~3번 반복 5) 3 스트라이크 되면 끝
TIL 1 : array내 shuffle
function shuffle(arr) {
var j, x, i;
for (i = arr.length; i; i -= 1) { // i = 0 이 굳이 아닌 이유는 어차피 나중에 0이 되니까.
j = Math.floor(Math.random() * i); // 랜덤한 값을 하나 뽑고
x = arr[i - 1]; //배열의 가장 마지막 인덱스 위치
arr[i - 1] = arr[j]; // 배열의 가장 마지막 인덱스 위치에 [j] 값 넣기
arr[j] = x; //인덱스[j]에 기존 x값 넣기
}
}
예)
길이가 3인 배열에 2,4,6 이라는 숫자가 들어있고 arr = [2,4,6]
j에는 0부터 2까지 숫자중 1이 뽑혔다고 치면, j = 1
x = arr[2] <- (6)
arr[2]= arr[1] <- (4)
--> arr = [2,4,4]
arr[1] = x
--> arr = [2,6,4]
-
이게 swap 개념이라고 한다고 한다. 컴퓨터에서 x = y 를 바로 바꿀 수 없기 때문에 (기존 x값이 사라지므로), 가상의 (temp)에 x 값을 넣어주어야 한다는 것!
-
Math.floor(Math.random() * i) random 함수는 0부터 1 사이의 실수를 뽑을 수 있다. 여기에 배열 길이를 곱하여 앞자리를 1이상으로 만들어 준 후, 실수이므로 Math.floor (=버림)로 소숫점 이하를 버려준다. 예: 0.12~~~ -> 곱하기 3하면 3.12~~~~ –> floor 하면 3
TIL 2 : 연속되는 숫자 입력받은 후 array에 각각 넣어주기
- 맨 처음엔 alert를 세 번 띄워서 각각 수를 입력받으려고 했는데, 한번에 입력받는 것이 좋을 것 같아서 ‘각기 다른 수를 연속되게 입력’받도록 하였다. (예: 123)
- 구글링 해보니 input.split(‘’) 이렇게 하면 각각의 원소로 배열에 넣을 수 있다고 하여 넣었는데, 넣고보니 String으로 들어가있더라.
- 찾아보니 input.split(‘’).map(Number) <- 요렇게 해주면 str->number 로 변환가능하다고 하여 사용함
TIL 3 : 스트라이크 & 볼 찾기
var strike = 0;
var ball = 0;
for (var i = 0; i < 3; i++) {
if (value[i] === extract[i]) {
strike++;
} else {
if (value.includes(extract[i])) {
ball++;
}
}
}
console.log(strike + '스트라이크 ' + ball + '볼');
}
document.write('축하합니다! 3 스트라이크!!')
- 짜기 가장 힘들었던 알고리즘인데 일단 indent가 3번이나 들어가있어서 함수로 수정하는 방법을 찾아봐야한다.
오늘의 깨달음: 안되는 게 당연하다고 생각하고 끝까지 포기하지 않는 습관을 들이자! 공대생 마인드!!
다짐: 나만 생각하고 공부하기. 비교하는 순간 재앙.
칭찬: 어제까지만 해도 2차원 배열도 이해 못해서 버벅거렸는데, 이렇게 일단 돌아가는 프로그램을 구현했다는 게 자랑스럽다! (물론 4시간 넘게 걸리긴 했지만..) 확실히 옆에서 이런 식으로 찾아봐 라고 조언해주니까 진행이 잘되고 포기하지 않게된다. 공대친구 짱짱맨. 하지만 그는 나에게 ‘나약하다’고 꾸짖었다.
반성: 나약해지지 말자! 안되는 게 당연한 것(?)
TO DO: 1) 함수로 고치기 2) 전역변수 안쓰기 <- 근데 이건 못할 것 같음…ㅠㅠ
#끝!