알고리즘

양궁 대회(프로그래머스)

쥐4 2024. 10. 7. 02:23

https://school.programmers.co.kr/learn/courses/30/lessons/92342?language=java

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

요구사항 분석

어피치의 결과가 주어짐.

한 점수를 더 많이 맞춰서 내 점수로 만들 수 있음.

어떻게 해도 라이언이 이길 수 없는 경우 -1을 return

라이언이 이기는 경우 똑같은 점수로 이긴다면, 가장 낮은 점수를 더 많이 맞힌 경우를 return

과녁은 0~10점, 화살의 갯수는 최악 10. 즉, 매우 낮은 시간 복잡도 = 완전 탐색

dp로도 시도 해 보았지만, 쉽지 않았음.

 

사고의 흐름

우선, 완전 탐색에서는 조합을 만들어서 탐색한다.

즉, 10점(index == 0)부터 시작해서 재귀를 통해 선택, 선택x인 재귀를 계속 호출해준다.

죠큼 까다로운 문제였다. 가장 낮은 점수를 더 많이 맞힌 경우 return에서 막힌 것 같다.

->완탐에서 사이즈가 명확한 조합은 for문 돌리는 게 더 쉬웠지만, 이 문제처럼, 사이즈가 명확하지 않은 조합은 선택x와 선택의 재귀를 돌리는게 더 쉬운 것 같다.

 

 

코드

import java.util.*;

class Solution {
    private int diff = 0;
    private int[] result = new int[11]; // 결과를 저장할 배열
    
    public int[] solution(int n, int[] info) {
        // 탐색을 시작할 때 크기 11인 배열을 사용
        search(n, info, 0, new int[11]);
        
        // 결과가 없으면 -1 반환
        if (diff == 0) {
            return new int[] {-1};
        }
        
        return result; // 결과 반환
    }
    
    public void search(int n, int[] info, int index, int[] arr) {
        if (index > 10 || n <= 0) {
            int apeach = 0;
            int lion = 0;
            for (int i = 0; i <= 10; i++) {
                if (info[i] == 0 && arr[i] == 0) continue;
                if (info[i] >= arr[i]) {
                    apeach += 10 - i;
                } else {
                    lion += 10 - i;
                }
            }
            if (lion > apeach && (lion - apeach >= diff)) {
                     if(n != 0){
                    arr[10] = n;
                }
                if(lion-apeach == diff){
                    for(int i = 10; i >= 0; i--){
                        if(result[i] == arr[i])continue;
                        if(result[i] < arr[i]){
                            diff = lion - apeach;
                            result = Arrays.copyOf(arr, arr.length);
                            return;
                        }else{
                            return;
                        }
                    }
                }
                diff = lion - apeach;
                result = Arrays.copyOf(arr, arr.length); // 결과 배열 복사
            }
            return;
        }
        
        search(n, info, index + 1, arr);    //그냥 넘어가던가

        if (n > info[index]) {  //선택 후 넘어가던가.
            arr[index] = info[index] + 1;
            search(n - (info[index] + 1), info, index + 1, arr);
            arr[index] = 0;
        }
    }
}