readline 모듈 : Readable Stream에서 한 번에 한 줄 씩 데이터를 읽기 위한 인터페이스를 제공
//readline 모듈 불러오기
let readline = require('readline');
//인터페이스 생성하기
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
입력값을 받을 때 콘솔에 원하는 문구로 input값을 받고 싶었다.
question과 on, 둘 사이에서 어떤 것을 사용할지 고민했다.
나는 숫자를 맞출 때까지 계속 질문을 돌리고 싶어서 on line을 선택했다.
rl.question(trying + '번째 시도 :', (input) => console.log(input));
rl.on('line', function (line) {
});
다른 조원들의 코드를 보니 question을 사용해서 재귀함수로 다시 질문을 던지는 방법도 가능했다. 나는 아직 콜백함수를 잘 몰라서 시도하기 어려웠지만 다음에는 도전해봐야겠다.
S를 구하는 것은 어렵지 않다. 랜덤값을 받은 배열과 입력값의 배열을 비교하여 같은 수 만큼 S를 늘려준다.
B를 구하는 방법은 사람마다 다를텐데, 나는 랜덤값과 입력값의 교집합을 cross라는 변수에 넣어주었다.
그리고 S와 B의 중복을 피하기 위해 S의 개수가 증가하면 B의 개수를 줄이는 식을 사용하였다.
cross = random.filter((x) => write.includes(x));
for (let i = 0; i < random.length; i++) {
if (random[i] === write[i]) {
answerS.push(write[i]);
cross.pop();
}
}
기능이 구현조차 안됐는데 정리하면서 하기엔 어려우니까. 처음엔 구현에만 집중하였다. 다른 분들의 코드리뷰를 듣고 나서 나도 깔끔한 코드를 쓰고 싶다는 생각이 들었다. 일단 오늘 만든 코드부터 다듬어 보자
function randomBall(min, max) {
for (let i = 0; i < 3; i++) {
const random = Math.floor(Math.random() * (max - min) + min);
// 인덱스와 대조 / 없으면 -1
if (randomArray.indexOf(random) === -1) {
//배열 끝에 값을 넣음
randomArray.push(random);
} else {
//값이 겹쳐서 하나가 없어지면 for문이 한번 더 돌게 i를 -해줌
i--;
}
}
return randomArray;
}
처음 내가 참조한 코드는
.indexOf()를 사용하여 중복되는 숫자를 걸러내려 하였다. 코드 작성후에Set()이라는 집합에 대해 알게되었다. 중복되는 값이 저장이 안된다는 점과 교집합을 뽑아낼 수 있다는 점에서Set()으로 코드를 다르게 짜보고 싶었다.
const randomArray = new Set();
const randomBall = (min, max) => {
while (randomArray.size < 3) {
const random = Math.floor(Math.random() * (max - min) + min);
randomArray.add(random);
}
console.log('정답=>' + [...randomArray]);
};
배열만 써보다가 Set을 쓰니까 여러면이 헷갈렸다
- arr.length => set.size
- arr.push => set.add
- console.log(arr) => [...randomIndexArray]
구현하고 나서 정리하는 것도 어렵다.
평소에 코드를 깔끔하게 쓰는 방법들도 공부해야 한다.