취준생의 코딩테스트 연습기

[백준] 9184번 신나는 함수 실행 / 파이썬(python) 본문

코딩테스트/백준

[백준] 9184번 신나는 함수 실행 / 파이썬(python)

Jiwon_C 2021. 3. 14. 23:39

# 문제 링크

www.acmicpc.net/problem/9184

 

9184번: 신나는 함수 실행

입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.

www.acmicpc.net

# Soultion(실패)

단순 재귀를 이용하여 시간초과 문제 발생

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def w(a,b,c):
    if a <= 0 or b <= 0 or c <= 0:
        return 1
 
    if a > 20 or b > 20 or c > 20:
        return w(202020)
 
    if a < b and b < c:
        return w(a, b, c-1+ w(a, b-1, c-1- w(a, b-1, c)
 
    else:
        return w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1- w(a-1, b-1, c-1)
 
while(1):
    a,b,c = map(int,input().split())
    if a==-1 and b==-1 and c==-1:
        break
    else:
        print(w(a,b,c))
        
cs
 

# Soultion(성공)

튜플을 이용하여 한번 사용한 w(a,b,c)값은 w_li에 저장하여 호출하여 사용

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
w_li = {} #값 저장
 
def w(a,b,c):
    if (a,b,c) in w_li:
        return w_li[(a,b,c)]
    
    else:
        if a <= 0 or b <= 0 or c <= 0:
            w_li[(a,b,c)] = 1
            return 1
 
        if a > 20 or b > 20 or c > 20:
            w_li[(a,b,c)] = w(202020)
            return w(202020)
 
        if a < b and b < c:
            w_li[(a,b,c)] = w(a, b, c-1+ w(a, b-1, c-1- w(a, b-1, c)
            return w(a, b, c-1+ w(a, b-1, c-1- w(a, b-1, c)
 
        else:
            w_li[(a,b,c)] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1- w(a-1, b-1, c-1)
 
            return w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1- w(a-1, b-1, c-1)
 
while(1):
    a,b,c = map(int,input().split())
    if a==-1 and b==-1 and c==-1:
        break
    else:
        print("w(%d, %d, %d) = %d"%(a,b,c,w(a,b,c)))
        
cs

 

1. 이전에 사용한 값을 저장하기 위한 튜플생성

4. 튜플안에 이미 값이 저장되어있으면 재귀함수를 사용하지않고 바로 호출하여 사용

7. 각각의 경우를 계산하여 w_li 튜플에 저장

25. 무한루프를 사용하여 -1 -1 -1이 들어오면 멈추도록 작성

Comments