mooni
[JavaScript] 2025 프로그래머스 코드챌린지 1차 예선 - 비밀 코드 해독 본문
Q. 문제
당신은 비밀 조직의 보안 시스템을 뚫고 중요한 정보를 해독해야 합니다. 시스템은 1부터 n
까지의 서로 다른 정수 5개가 오름차순으로 정렬된 비밀 코드를 가지고 있으며, 당신은 이 비밀 코드를 맞혀야 합니다.
당신은 비밀 코드를 알아내기 위해 암호 분석 도구를 사용하며, m
번의 시도를 할 수 있습니다. 각 시도마다 서로 다른 5개의 정수를 입력하면, 시스템은 그 중 몇 개가 비밀 코드에 포함되어 있는지 알려줍니다.
- 만약 비밀 코드가 [3, 5, 7, 9, 10]이고, 입력한 정수가 [1, 2, 3, 4, 5]라면 비밀 코드에 포함된 정수는 3, 5 두 개이므로 시스템은 2를 응답합니다.
당신은 m
번의 시도 후, 비밀 코드로 가능한 정수 조합의 개수를 알고 싶습니다.
비밀 코드에 사용된 정수의 범위가 1~10일 때, 아래와 같이 5번의 시도를 했다고 가정해 보겠습니다.
입력한 정수 | 시스템 응답(일치하는 개수) |
---|---|
[1, 2, 3, 4, 5] | 2개 |
[6, 7, 8, 9, 10] | 3개 |
[3, 7, 8, 9, 10] | 4개 |
[2, 5, 7, 9, 10] | 3개 |
[3, 4, 5, 6, 7] | 3개 |
비밀 코드로 가능한 정수 조합은 아래와 같이 3개가 있습니다.
- [3, 4, 7, 9, 10]
- 첫 번째 시도에서 비밀 코드에 포함된 정수가 3, 4로 2개 있습니다.
- 두 번째 시도에서 비밀 코드에 포함된 정수가 7, 9, 10으로 3개 있습니다.
- 세 번째 시도에서 비밀 코드에 포함된 정수가 3, 7, 9, 10으로 4개 있습니다.
- 네 번째 시도에서 비밀 코드에 포함된 정수가 7, 9, 10으로 3개 있습니다.
- 다섯 번째 시도에서 비밀 코드에 포함된 정수가 3, 4, 7로 3개 있습니다.
- [3, 5, 7, 8, 9]
- 첫 번째 시도에서 비밀 코드에 포함된 정수가 3, 5로 2개 있습니다.
- 두 번째 시도에서 비밀 코드에 포함된 정수가 7, 8, 9로 3개 있습니다.
- 세 번째 시도에서 비밀 코드에 포함된 정수가 3, 7, 8, 9로 4개 있습니다.
- 네 번째 시도에서 비밀 코드에 포함된 정수가 5, 7, 9로 3개 있습니다.
- 다섯 번째 시도에서 비밀 코드에 포함된 정수가 3, 5, 7로 3개 있습니다.
- [3, 5, 7, 8, 10]
- 첫 번째 시도에서 비밀 코드에 포함된 정수가 3, 5로 2개 있습니다.
- 두 번째 시도에서 비밀 코드에 포함된 정수가 7, 8, 10으로 3개 있습니다.
- 세 번째 시도에서 비밀 코드에 포함된 정수가 3, 7, 8, 10으로 4개 있습니다.
- 네 번째 시도에서 비밀 코드에 포함된 정수가 5, 7, 10으로 3개 있습니다.
- 다섯 번째 시도에서 비밀 코드에 포함된 정수가 3, 5, 7로 3개 있습니다.
정수 n
, 입력한 정수를 담은 2차원 정수 배열 q
와 시스템 응답을 담은 1차원 정수 배열 ans
가 매개변수로 주어집니다. 이때, 비밀 코드로 가능한 정수 조합 개수를 return 하도록 solution 함수를 완성해 주세요.
* 문제해결의 흐름
1. 1 ~ n 숫자로 이루어진 조합 생성
2. q 배열과 ans 배열에서 하나씩 뽑아 조건에 맞는 조합만 남김
3. 남은 조합의 개수 반환
A. 풀이
function solution(n, q, ans) {
var answer = 0;
// 1부터 n까지의 숫자로 이루어진 배열에서 5개를 뽑는 모든 조합을 생성
var allCombinations = getCombinations([...Array(n).keys()].map(i => i + 1), 5);
// 주어진 조건 (q와 ans)을 만족하는 조합만 남김
for(let i = 0; i < q.length; i++) {
allCombinations = allCombinations.filter(code => countMatches(code, q[i]) === ans[i])
}
// 최종적으로 남은 조합의 개수를 반환
answer = allCombinations.length;
return answer;
}
function getCombinations(arr, k) {
if (k === 0) return [[]]; // k가 0이면 빈 배열을 포함한 배열 반환
if (arr.length === 0) return []; // 더 이상 선택할 원소가 없으면 빈 배열 반환
const [first, ...rest] = arr; // 첫 번째 원소를 분리하고 나머지를 rest로 저장
// 첫 번째 원소를 포함하는 경우의 조합
const withFirst = getCombinations(rest, k - 1).map(comb => [first, ...comb]);
// 첫 번째 원소를 포함하지 않는 경우의 조합
const withoutFirst = getCombinations(rest, k);
return withFirst.concat(withoutFirst); // 두 경우를 합쳐 반환
}
function countMatches(code, guess) {
return code.filter(num => guess.includes(num)).length;
}
'Coding Test' 카테고리의 다른 글
[JavaScript] 2023 KAKAO BLIND RECRUITMENT - 이모티콘 할인행사 (0) | 2025.03.23 |
---|---|
[JavaScript] 2025 프로그래머스 코드챌린지 1차 예선 - 지게차와 크레인 (1) | 2025.03.17 |
[JavaScript] 2025 프로그래머스 코드챌린지 1차 예선 - 유연근무제 (1) | 2025.03.05 |
[Section05] Python 알고리즘 문제풀이 09~10 (1) | 2024.06.14 |
[Section05] Python 알고리즘 문제풀이 07~08 (1) | 2024.06.11 |