본문 바로가기
알고리즘/알고리즘 설명

20230829 [Java] 문제풀이

by JayAlex07 2023. 8. 29.

20230829 [Java] 문제풀이

[프로그래머스] 양궁대회

아직 백트래킹, 완전 탐색이 많이 약한 것 같다 (그래도 전보다 어느 정도 생각을 할 수 있게 되었다)

먼저 shoot을 통해서 n번 동안 라이언이 쏠 수 있는 모든 경우를 배열로 구한다

그리고 compare을 통해서 라이언과 아파치가 맞춘 과녁을 비교하면서, 두 명의 점수를 비교해준다

import java.util.*;

class Solution {

    public static int[] answer;
    public static int maxDif = 0;
    public static int[] lionArrow = new int[11];

    public void shoot(int s, int limit, int[] info) {
        if (s == limit) {
            int dif = compare(info);
            if (dif >= maxDif) {
                maxDif = dif;
                answer = lionArrow.clone();
            }
            return;
        }

        for (int i = 0; i < info.length && lionArrow[i] <= info[i]; i++) {
            lionArrow[i] ++;
            shoot(s+1, limit, info);
            lionArrow[i] --;
        }

    }

    public int compare(int[] info) {
        int apeach = 0;
        int lion = 0;

        for (int i = 0; i < info.length; i++) {
            if (info[i] == 0 && lionArrow[i] == 0) continue;
            if (info[i] >= lionArrow[i]) {
                apeach += (10 - i);
            } else {
                lion += (10 - i);
            }
        }

        return lion - apeach;
    }


    public int[] solution(int n, int[] info) {

        shoot(0, n, info);

        if(maxDif == 0) {
            answer = new int[1];
            answer[0] = -1;
        }

        return answer;
    }
}

'알고리즘 > 알고리즘 설명' 카테고리의 다른 글

20230905 [Java] 문제풀이  (0) 2023.09.08
20230904 [Java] 문제풀이  (0) 2023.09.08
20230828 [Java] 문제풀이  (1) 2023.08.28
20230822 [Java] 문제풀이  (0) 2023.08.22
20230821 [Java] 문제풀이  (0) 2023.08.21