Sqsung DevLog

[백준] 2503번: 숫자 야구 - Node.js (자바스크립트) 본문

Algorithm

[백준] 2503번: 숫자 야구 - Node.js (자바스크립트)

sqsung 2023. 6. 14. 11:41

1. 문제 ㅡ 2503번: 숫자 야구 (난이도: Silver III)

 

2503번: 숫자 야구

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

www.acmicpc.net

2. 풀이 ㅡ Node.js (자바스크립트)

const input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
const N = +input.shift();
const calls = input.map(row => row.split(' '));

const testViability = stringNum => {
  let count = 0;

  for (let i = 0; i < N; i++) {
    let strike = 0;
    let ball = 0;

    for (let j = 0; j < 3; j++) {
      const jOfCalledNum = calls[i][0][j];
      const jOfParamNum = stringNum[j];

      if (jOfCalledNum === jOfParamNum) {
        strike += 1;
      } else if (stringNum.includes(jOfCalledNum)) {
        ball += 1;
      }
    }

    if (strike !== +calls[i][1] || ball !== +calls[i][2]) break;
    count += 1;
  }

  return count === N ? 1 : 0;
};

const testViableNumbers = () => {
  let answer = 0;

  for (let i = 1; i < 10; i++) {
    for (let j = 1; j < 10; j++) {
      if (i === j) continue;

      for (let k = 1; k < 10; k++) {
        if (k === i || k === j) continue;

        const viableNumber = `${i}${j}${k}`;
        answer += testViability(viableNumber);
      }
    }
  }

  return answer;
};

console.log(testViableNumbers());

2-1. 풀이 설명

함수를 두 개 만들어서 문제에 접근했다. 

 

testViableNumbers 함수에서는 조건에 맞는 숫자를 생성한다. 즉, 서로 다른 세 개의 숫자로 구성된 세 자리 수를 3중 반복문을 통해 생성하고, 해당 숫자를 인수로 testViability 함수를 호출한다.  

 

testViability 함수는 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 나타내는 answer 변수에 1 or 0을 추가할지 결정해주는 헬퍼 함수며, 다음과 같은 역할을 한다. 

 

1. 인수로 받은 숫자(즉, testViableNumbers 함수에서 생성된 임의의 세자리 수)와 영수가 부른 숫자를 비교하여 스트라이크와 볼 개수가 일치하는지 확인한다. 이때 스트라이크와 볼 개수가 일치하면 count를 1씩 증가시킨다. 

 

2. 반복문이 종료된 후 count가 영수의 추측 횟수(N)과 일치하면 1, 아니면 0을 반환하고, 이는 answer 변수에 누적된다. 

 

모든 함수 로직이 끝난 후 answer 변수를 출력하면 된다.