Game Develop

[Algorithm] Programmers :: 양궁대회 본문

Algorithm/Programmers

[Algorithm] Programmers :: 양궁대회

MaxLevel 2023. 6. 6. 01:45

https://school.programmers.co.kr/learn/courses/30/lessons/92342

 

프로그래머스

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

programmers.co.kr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
vector<int> curRoute = { 0,0,0,0,0,0,0,0,0,0,0 };
vector<int> answerRoute;
int maxScoreGap = -1;
 
int Check(vector<int>& info)
{
    int aSum = 0;
    int lSum = 0;
 
    for (int i = 0; i < 10++i) 
    {
        if (curRoute[i] == 0 && info[i] == 0continue;
        if (curRoute[i] > info[i]) lSum += 10 - i;
        else aSum += 10 - i;
    }
 
    if (lSum > aSum) return lSum - aSum;
    else return 0;
}
 
void DFS(int n, int index, vector<int>& info)
{
    if (n == 0// 다 쏘면
    {
        int check = Check(info); // 어피치보다 점수높은지 체크.
 
        if (check)
        {
            if (check > maxScoreGap)
            {
                maxScoreGap = check;
                answerRoute = curRoute;
            }
        }
 
        return;
    }
 
    for (int i = index - 1; i >= 0--i)
    {
        if (n >= info[i] + 1)
        {
            curRoute[i] = info[i] + 1;
            DFS(n - (info[i] + 1), i, info);
            curRoute[i] = 0;
        }
    }
}
 
vector<int> solution(int n, vector<int> info)
{
    vector<int> answer = { -1 };
 
    for (int i = 10; i >= 0--i) // 점수 낮은것부터 갱신.(조건에 만족하기위해서)
    {
        if (i == 10// 0점짜리면
        {
            for (int j = 0; j <= n - 1++j) // 0점짜리에 n-1발까지 쏴보
            {
                curRoute[i] = j;
                DFS(n - j, i, info);
                curRoute[i] = 0;
            }
        }
        else if (n >= info[i] + 1)
        {
            curRoute[i] = info[i] + 1;
            DFS(n - (info[i] + 1), i, info);
            curRoute[i] = 0;
        }
 
    }
 
    if (answerRoute.size() > 0return answerRoute;
    else return { -1 };
}
cs

그리디문젠가? 하다가 여러가지 경우의수를 검사해야한다는걸 깨닫고 DFS로 완전탐색을 수행했다.

여기서 중요한건, '최대 점수차'를 구함과 동시에 루트가 두개이상일 경우, 최대한  '낮은 점수'의 과녁을 맞춘 경로를 리턴해야한다는 것이였다.

 

그래서 아예 낮은과녁부터 맞추면서 수행했는데 여기서 또 명심해야할 것은, n발을 전부 쏴야한다는 것.

즉 이미 '최대 점수차'를 구했는데 화살이 남는 경우가 있다. 이럴경우에는 남는 화살을 전부 0점짜리에 쏴버려야 한다.

그래서 아예 0점짜리를 0발부터 n-1발까지 전부 쏘는 경우도 추가했다.

1점이라도 더 높긴해야하니까 n발을 쏘면 안되고 n-1발까지만 쏴야한다.