코딩테스트/코드챌린지
[2025 프로그래머스 코드챌린지 1차 예선] 비밀 코드 해독 (Java)
haleylog
2025. 2. 18. 15:26
요구사항
1부터 n까지의 서로 다른 5개의 정수로 이루어진 비밀 코드를 맞추기 위한 시도를 하면
시도마다 입력된 5개의 정수 중 몇 개가 비밀 코드에 포함되어 있는지 알려준다.
이때 주어진 시도 후 가능한 오름차순 비밀 코드의 조합 수를 구하기
입력 값
int n | 비밀 코드 범위 1~n 까지 |
int[][] q | 시도한 비밀코드 배열 q[i] 는 i+1 회차 시도한 암호 q[i][j] 는 i+1 회차 j+1 번째 암호 |
int[] ans | 시도한 비밀코드와 정답 코드와의 매치 개수 배열 ans[i]는 i+1 회차 시도한 암호와 정답코드 간 매치된 코드 개수 |
풀이
1. 서로 다른 5개 오름차순 숫자 선택
2. 선택된 비밀코드와 시도한 비밀코드 비교
3. 비밀코드와 시도한 비밀코드 간 동일한 일치하는 숫자가 매치 개수와 동일하면 카운팅
4. 전체 확인 후 return
728x90
Java 코드 1 (재귀함수)
class Solution {
int count = 0;
public int solution(int n, int[][] q, int[] ans) {
int answer = 0;
pickNumber(1, 1, n, q, ans, new boolean[n+1]);
answer = count;
return answer;
}
private void pickNumber(int position, int min, int n, int[][] q, int[] ans, boolean[] pickedNumbers) {
// 숫자 5개 모두 뽑은 후엔 검증
if(position > 5) {
for(int o=0;o < q.length;o++) {
int matchCnt = 0;
for(int p=0;p < 5;p++) {
if(matchCnt > ans[o]) break;
if(pickedNumbers[q[o][p]]) matchCnt++;
}
if(ans[o] != matchCnt) return;
}
count++;
return;
}
// 1~n 까지 loop 돌려서 숫자 뽑기
for(int i=min;i<=n;i++) {
pickedNumbers[i] = true;
pickNumber(position+1, i+1, n, q, ans, pickedNumbers);
pickedNumbers[i] = false;
}
}
}
Java 코드 2 (다중 for 문)
class Solution {
public int solution(int n, int[][] q, int[] ans) {
int answer = 0;
for(int i=1;i<=n-4;i++){ // 첫번째 선택
for(int j=i+1;j<=n-3;j++){ // 두번째 선택
for(int k=j+1;k<=n-2;k++){ // 세번째 선택
for(int l=k+1;l<=n-1;l++){ // 네번째 선택
for(int m=l+1;m<=n;m++){ // 다섯번째 선택
boolean check = true;
// 검증
for(int o=0;o < q.length;o++) {
int matchCnt = 0;
for(int p=0;p < 5;p++) {
if(matchCnt > ans[o]) break;
if( q[o][p] == i
|| q[o][p] == j
|| q[o][p] == k
|| q[o][p] == l
|| q[o][p] == m) matchCnt++;
}
if(ans[o] != matchCnt) {
check = false;
break;
}
}
if(check) answer++;
}
}
}
}
}
return answer;
}
}
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/388352
728x90
반응형