비밀 코드 해독을 풀어봤다.너무풀고싶게생김..ㅋ_ㅋ
이 문제힌트는 범위 제한이다. 범위가 10,30이므로 적으므로.가자 브루투포스!
자바로도 풀어보고 느낀점: 모듈로 퉁치면되니까 파이썬 사기네;자바는 얼른 조합라이브러리를 내놔라..
Python
from itertools import combinations
def solution(n, q, ans):
answer = 0
guess_sets = [set(guess) for guess in q]
count = 0
for comb in combinations(range(1, n + 1),5):
is_valid = True # 이 조합이 모든 시도 조건을 만족하는지
for i, guess_set in enumerate(guess_sets):
match_cnt = len(set(comb) & guess_set)
if match_cnt != ans[i]:
is_valid = False
break
if is_valid:
count += 1
return count
Java
import java.util.*;
public class 비밀_코드_해독 {
/**
* 가능한 비밀 코드(5개 조합)의 개수를 구한다.
* @param n 숫자 범위 상한 (1~n)
* @param q 사용자가 시도한 숫자들(m×5 배열)
* @param ans 각 시도에서 맞힌 개수 배열
* @return 조건을 모두 만족하는 조합의 총 개수
*/
public int solution(int n, int[][] q, int[] ans) {
// 1) q 배열을 Set으로 변환 (교집합 연산용)
List<Set<Integer>> querySets = new ArrayList<>();
for (int[] arr : q) {
Set<Integer> s = new HashSet<>();
for (int x : arr) {
s.add(x);
}
querySets.add(s);
}
// 2) 1~n 중 5개 뽑는 모든 조합 생성
List<Set<Integer>> candidates = new ArrayList<>();
combination(1, n, 5, new ArrayList<>(), candidates);
// 3) 각 조합별로 시도 결과와 비교하여 유효성 검사
int count = 0;
for (Set<Integer> candidate : candidates) {
if (isValid(candidate, querySets, ans)) {
count++;
}
}
return count;
}
/**
* 백트래킹으로 r개짜리 조합을 모두 생성해 result에 담는다.
* @param start 이번 단계에서 고를 수 있는 최소 숫자
* @param n 숫자 범위 상한
* @param r 조합 크기
* @param current 현재까지 선택한 숫자 리스트
* @param result 완성된 조합을 저장할 리스트
*/
private void combination(int start, int n, int r,
List<Integer> current,
List<Set<Integer>> result) {
if (current.size() == r) {
result.add(new HashSet<>(current));
return;
}
for (int i = start; i <= n; i++) {
current.add(i);
combination(i + 1, n, r, current, result);
current.remove(current.size() - 1); // 백트래킹
}
}
/**
* 후보 조합이 모든 시도 결과(ans)와 일치하는지 검사
* @param candidate 5개 숫자 집합
* @param querySets 시도별 숫자 집합 리스트
* @param ans 시도별 맞힌 개수 배열
* @return 모든 시도에서 교집합 크기가 ans[i]와 같으면 true
*/
private boolean isValid(Set<Integer> candidate,
List<Set<Integer>> querySets,
int[] ans) {
for (int i = 0; i < querySets.size(); i++) {
// candidate와 querySets.get(i)의 교집합 크기 계산
Set<Integer> tmp = new HashSet<>(candidate);
tmp.retainAll(querySets.get(i));
if (tmp.size() != ans[i]) {
return false;
}
}
return true;
}
}
'자료구조&알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 선입 선출 스케줄링 풀이 과정 기록 (Python,Java)_자바풀이추가예정 (1) | 2025.07.13 |
---|---|
[프로그래머스] 단어 퍼즐 풀이 과정 기록 (Python,Java) (1) | 2025.06.17 |
[programmers] 지게차와 크레인 (Python, Java풀이) (1) | 2025.04.22 |
[프로그래머스] 131702번 고고학 최고의 발견 풀이 (Python) (0) | 2025.04.02 |
[Programmers] 요격 시스템 (PYTHON, JAVA) (1) | 2024.10.02 |