본문 바로가기
개발 노트/백준, 프로그래머스 풀이

[백준 2503/javascript] 숫자 야구

by tokkiC 2022. 10. 29.

구현 + 브루트포스 문제

구현은 기본적으로 머리 아픈데 브루트포스는 내가 약해서 생각보다 시간이 걸린 문제다

다음엔 브루트포스 문제 위주로 좀 풀어봐야겠다

https://www.acmicpc.net/problem/2503

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트

www.acmicpc.net

let input = [];

const readline = require("readline").createInterface({
  input: process.stdin,
  output: process.stdout,
});

readline.on("line", (line) => {
  input.push(line);
});

readline.on("close", () => {
  solution(input);
  process.exit();
});

const solution = (inp) => {
  inp.shift();
  let arr = Array(1000).fill(1);
  let cnt = 0;

  // 숫자가 중복이거나, 0을 포함하는 숫자는 제외
  for (let i = 123; i < 1000; i++) {
    let si = String(i);
    if (si[0] === si[1] || si[1] === si[2] || si[2] === si[0]) {
      arr[i] = 0;
    }
    let stri = String(i);
    if (stri[0] === "0" || stri[1] === "0" || stri[2] === "0") {
      arr[i] = 0;
    }
  }

  // 매 줄을 돌며 조건에 안맞는 수는 걸러낸다
  for (el of inp) {
    let [num, s, b] = el.split(" ");
    let ns = Number(s);
    let nb = Number(b);

    for (let i = 123; i < 1000; i++) {
      let scnt = 0;
      let bcnt = 0;
      let si = String(i);

      // 걸러지지 않은 수만 체크한다
      if (arr[i]) {
        for (let j = 0; j < 3; j++) {
          for (let k = 0; k < 3; k++) {
            // 자리수와 숫자가 모두 같으면 스트라이크
            if (j === k && num[j] === si[k]) {
              scnt++;
            }
            // 자리수는 다르고 숫자만 같으면 볼
            if (j !== k && num[j] === si[k]) {
              bcnt++;
            }
          }
        }

        // 입력 숫자와 스크라이크, 볼 수가 다르면
        if (scnt !== ns || bcnt !== nb) {
          arr[i] = 0;
        }
      }
    }
  }
  for (let i = 123; i < 1000; i++) {
    if (arr[i]) {
      cnt++;
    }
  }
  console.log(cnt);
};

댓글