코딩테스트/코드챌린지

[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
반응형