오늘 뭐했냐/기억하면 좋을 문제들

숫자야구

스스로에게 2023. 6. 14. 19:21

랜덤한 3자리 숫자가 만들어지고 숫자를 입력받아 비교해서 각자리의 위치와 숫자가 같은면 S를 숫자만 같으면 B로 알려준다 랜덤한 숫자는 중복되지 않게 만들어진다 3자리 숫자가 일치하면 몇 번 째 시도에 맞춘건지 알려주며 게임 종료 기회는 무제한

  1. 중복되지 않는 랜덤 숫자 3자리 생성
  2. S와 B 값을 위한 비교 
  3. 3S면 시도 횟수 알려주고 종료 기회 무제한 
  • 랜덤 숫자 생성은 구글링을 찾아서 해결했다 
  • 반목문으로 같은 인덱스의 값을 찾아 S를 구했다
  • B는 전에 풀었던 문제에서 두 배열을 비교하는게 있어서 이걸로 구했는데 이러면 S랑 겹치는 값도 나와 S를 빼준다

이렇게 일단 구성해서 입력을 따로 받지 않는 상태에서 내가 임의의 값을 변수로 해서 테스트가 되는지 해보니까 큰 문제는 없었고 비교를 하는데 숫자와 문자열 데이터 타입이 달라서 카운터가 안올라가는 등의 자잘한 문제는 생략한다

 

근데 이제 입력을 받는 게 문제다 이것도 전혀 알지 못해서 구글링을 통해 readline 사용을 어떻게 하는지 따라했다 이해는 안되지만 내가 필요한 부분에 있어서 먼저 입력을 받을 때 어떻게 작동되는지 테스트 했다 

 

  • 입력을 받을 때마다 내가 실행할 함수가 해로 호출된다 => 시도 횟수(count)를 외부에 선언해야 누적이 된다
  • 하지만 B와 S는 내부에 선언해야 매번 초기화 된다
  • 입력값은 문자열로 받아들여진다 => 비교를 위해 배열로 만들어 주면서 랜덤 숫자의 타입도 고려해야한다

이렇게 다 콘솔로 찍어보면서 readline에서 내가 필요한 부분을 테스트 했고 솔직히 아직도 어떻게 굴러가는지 사용하는지는 모르겠지만 일단 내가 필요한 부분의 검사는 끝났으니 준비된 코드를 여기에 맞게 추가해주고 종료해도 괜찮지만 문제에 주어진 조건이 입력받는 값의 중복을 허용하는지 3자리 이상도 괜찮은지 등의 조건이 없기에 추가하는 건 어려워도 빼는 건 상대적으로 쉽다고 생각해서 추가해주었다 그리고 구글링을 통해 가져온 랜덤 번호 생성도 기존에 외부에 추가적으로 중복을 확인하는 함수를 만들어 사용하는게 아니라 내가 Set를 활용해 조금 변형해 봤다

 

const readline = require('readline');
// 리드라인을 불러온다? 

const rl = readline.createInterface({ // 인터페이스를 반든다
    input: process.stdin,
    // 입력
    output: process.stdout,
    // 출력
});
// 숫자 생성 시작 num이 숫자 
let j = 0
let setNum = new Set()
let randomNum = []
while (j < 3) {
    let n = Math.floor(Math.random() * 9)+1 
    
    setNum.add(n)
    if (setNum.size === j+1) { // Set 활용 외부에 함수를 가져올 필요가 없다
        randomNum.push(n + '') // 인풋이 문자열이기에 비교를 위해 문자열로
        j++
    }
}

function notSeme(NSnum) { // 기존 중복확인
    return randomNum.every((e) => NSnum !== e)
}
// 숫자 생성 종료 ['n1', 'n2', 'n3']
// 비교를 위해 배열로 생성
//  Set를 만들어 entries로 배열로 바꿔도 된다

let count = 1
// 시도 횟수

rl.on('line', (line2) => {
    // 인풋 받은 걸 어떻게 할까? 

    line = line2.split('')
    // 문자열을 배열로 바꾼다['in1', 'in2', 'in3']

    setLine = new Set(line) // Set로 전환
    if (setLine.size === 3 && line.length === 3) { // 중복된 값이 없고 3자리만 입력 받았는지
        function result() {
            let sCount = 0 // 스트라이크 값
            let bCount = 0 // 볼 값

            for (let i = 0; i < 3; i++) {
                if (randomNum[i] === line[i]) { // 같은 인덱스에 같은 값이 있는가
                    sCount++ 
                }
            }

            if (sCount === 3) { // 종료 조건 
                console.log(`3S
            ${count}번만에 맞추셨습니다
            게임을 종료합니다`)
                rl.close() // 인풋을 빠져나가는 것

            } else {
                bCount = randomNum.filter(c => line.includes(c)).length - sCount // 입력받은 숫자와 랜덤생성숫자를 비교 같은 숫자가 몇갠지  
                console.log(`S : ${sCount}, B : ${bCount}`)
                ++count
            }
            console.log('in:', line) // 콘솔 출력
            console.log(randomNum) // 랜덤 숫자 확인 겸 실행 테스트용
        }
        result(line)
    } else { // 입력에 중복 혹은 3자리가
        console.log(`중복되지 않는 3자리 숫자를 입력해주세요`)
    }

});

rl.on('close', () => { //'close'일 때 
    process.exit() // 프로그램을 나간다
});

'오늘 뭐했냐 > 기억하면 좋을 문제들' 카테고리의 다른 글

스코프 활용  (0) 2023.06.15
대소문자 반대로  (0) 2023.06.14
map 사용  (0) 2023.06.14
배열의 앞 뒤 추가 제거  (0) 2023.06.14
정해진 수의 반복  (0) 2023.06.14