반응형
문제
https://www.acmicpc.net/problem/2503
풀이
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let [n, ...arr] = fs.readFileSync(filePath).toString().trim().split("\n");
const N = +n;
const response = arr.map((row) => row.split(" ").map(Number));
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 (i === k || j === k) continue;
const curNum = i * 100 + j * 10 + k; // 현재 만든 숫자
const curNumStr = String(curNum);
let sameCnt = 0;
// 각 응답마다 현재 만든 숫자와 스트라이크, 볼 개수 일치 확인
for (let l = 0; l < N; l++) {
let cnt = [0, 0]; // [스트라이크, 볼]
for (let m = 0; m < curNumStr.length; m++) {
const curResponseNum = String(response[l][0])[m]; // 응답 중 m번째 숫자
// 스트라이크
if (curResponseNum === curNumStr[m]) cnt[0]++;
// 볼
else if (curNumStr.includes(curResponseNum)) cnt[1]++;
}
if (cnt[0] !== response[l][1] || cnt[1] !== response[l][2]) break;
sameCnt++;
}
if (sameCnt === N) answer++;
}
}
}
console.log(answer);
민혁이와 영수는 서로 다른 세 자리 수를 생각한다. 영수는 민혁이가 생각한 숫자에 대해 스트라이크(동일 위치 같은 숫자) 개수와 볼(다른 위치 같은 숫자)의 개수를 답해주는데, 이때 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 세는 문제이다. 완전 탐색을 통해 모든 수를 만들고 조건을 비교해 답을 구할 수 있다.
1. 먼저 가능한 세 자리 숫자를 만든다.
2. 해당 숫자와 입력 값을 비교하여 스트라이크와 볼 개수가 일치하는지 확인한다.
2-1. 일치하지 않는다면 반복문을 탈출해 다음으로 가능한 숫자를 찾는다.
2-2. 만약 일치한다면 sameCnt를 1 증가시킨다.
3. sameCnt가 응답 개수와 일치한다면(모든 입력의 [스트라이크, 볼] 개수를 만족) 가능한 답이므로 answer을 1 증가시킨다.
숫자의 각 자리에서 값을 비교해야하기 때문에 String으로 변환하여 비교하였다. 그리고 각 입력값(한 줄)마다 [스트라이크, 볼]의 개수를 비교해야 하므로 입력 값을 반복하는 for문 안에서 cnt를 [0, 0]으로 초기화하였다.
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[알고리즘/백준/17626] Four Squares(Nodejs, DP) (0) | 2023.06.13 |
---|---|
[알고리즘/백준/16439] 치킨치킨치킨(Nodejs, 완전탐색) (0) | 2023.06.12 |
[알고리즘/백준/5568] 카드 놓기(Nodejs, 완전탐색) (0) | 2023.06.09 |
[알고리즘/백준/6187] DNA(Nodejs, 완전탐색) (0) | 2023.06.08 |
[알고리즘/백준/7569] 토마토 (0) | 2023.06.06 |