코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.
(지문 하단에 별도 저작권 표시 문제 제외)
코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.

코딩테스트 정보


문제

프로그래머스 문제 참고 (내용이 길어서..)


풀이 코드

풀이 코드

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
77
78
79
80
81
82
83
84
# n발을 발사하는 모든 경우의 수 만드는 메서드 정의
def make_lists(n):
    list_ = []
    for a in range(n+1):
        for b in range(n-a+1):
            for c in range(n-a-b+1):
                for d in range(n-a-b-c+1):
                    for e in range(n-a-b-c-d+1):
                        for f in range(n-a-b-c-d-e+1):
                            for g in range(n-a-b-c-d-e-f+1):
                                for h in range(n-a-b-c-d-e-f-g+1):
                                    for i in range(n-a-b-c-d-e-f-g-h+1):
                                        for j in range(n-a-b-c-d-e-f-g-h-i+1):
                                            k = a+b+c+d+e+f+g+h+i+j
                                            if k < n:
                                                list_.append([a, b, c, d, e, f, g, h, i, j, n-k])
                                            elif k >= 0:
                                                list_.append([a, b, c, d, e, f, g, h, i, j, 0])
                                            else:
                                                pass
    return list_


# 서로 다른 리스트 간 비교 메서드 정의
def vs_shoots(list1, list2):
    for i in range(11):
        if list1[-i-1] > list2[-i-1]:
            return list1
        elif list1[-i-1] < list2[-i-1]:
            return list2
        else:
            pass


# 메인 메서드
def solution(n, info):
    answer = []
    ryan_shoots = []
    ryan_scores = []
    apeach_scores = []
    score_subs = []
    answer_list = []
    idx_list = []
    
    # 모든 발사 경우의 수 생성
    ryan_shoots = make_lists(n)
    
    # 모든 발사 경우의 수에서 ryan이 승리하는 경우 추출
    for i, shoot in enumerate(ryan_shoots):
        score_ryan = 0
        score_apeach = 0
        for x in range(11):
            if shoot[x] == 0 and info[x] == 0:
                pass
            elif shoot[x] > info[x]:
                score_ryan += 10 - x
            else:
                score_apeach += 10 - x
                
        if score_ryan > score_apeach:
            answer_list.append(shoot)
            ryan_scores.append(score_ryan)
            apeach_scores.append(score_apeach)
            score_subs.append(score_ryan - score_apeach)
    
    # 최대 점수차인 경우 중 낮은 점수에 많이 맞춘 경우를 추출
    # ryan이 패배한 경우는 [-1] 반환
    if len(answer_list) != 0:
        max_score = max(score_subs)
        for i, sub in enumerate(score_subs):
            if sub == max_score:
                idx_list.append(i)
        for i, idx in enumerate(idx_list):
            if i != 0:
                answer = vs_shoots(answer, answer_list[idx])
            else:
                answer = answer_list[idx]
    else:
        answer = [-1]
    
    return answer



리뷰

어우 빡세지만 재밌는 문제였다.