알고리즘

백준 17297 - Messi Messi Gimossi (Python)

jamie2779 2023. 7. 27. 06:35

문제

https://www.acmicpc.net/problem/17297

 

17297번: Messi Gimossi

N이 충분히 클 때, messi(N)의 M번째 글자가 공백(' ')이 아닐 경우에는 그 글자를 출력한다. M번째 글자가 공백(' ')일 경우에는 Messi Messi Gimossi를 출력한다. 정답은 대소문자를 구분하므로 출력에

www.acmicpc.net

풀이

#오답, 6을 입력했을 때 공백이 출력됨
n = int(input())
ls = [5,13]
while ls[-1] < n:
    ls.append(ls[-1]+ls[-2]+1)
def f(k,c):
    if k<2:
        return 'Messi Gimossi'[c-1]
    
    if ls[k-1]+1 == c:
        return "Messi Messi Gimossi"
    elif ls[k-1] >= c:
        return f(k-1,c)
    else:
        return f(k-2,c-1-ls[k-1])
print(f(len(ls)-1,n))

재귀함수를 이용하여 풀이하였다.

문자열을 직접 만들어서 구할경우 메모리가 초과되므로 다른 방식을 사용하였다.

 

ls에는 messi(i)의 글자수를 저장하였다.

f(k, c)는  messi(k+1)의 c번째 글자를 의미한다.

함수내에서 점점 k를 줄여나가는 과정을 수행한다.

예를 들어,

messi(3) 은 messi(2) + ' ' + messi(1)이므로 

f(2, 16) = f(0,2) 으로 나타낼 수 있다.

k를 줄여나가면서 0또는 1이 되었을 때, "Messi Gimossi" 의 c번째 글자를 출력하면 된다.

공백의 경우 줄여나가는 과정에서 바로 판단이 되고, Messi Messi Gimossi 를 바로 반환시키면 된다.

 

처음 제출했던 코드는 위와 같은데, 이는 6이 입력되었을 때, 공백을 그대로 출력하여 오답 처리되었다.

따라서, k가 0 또는 1일때 c를 비교하여 6이면 Messi Messi Gimossi 를 출력하는 과정을 추가해주었다.

#정답
n = int(input())
ls = [5,13]
while ls[-1] < n:
    ls.append(ls[-1]+ls[-2]+1)
def f(k,c):
    if k<2:
        if c == 6:
            return "Messi Messi Gimossi"
        else:
            return 'Messi Gimossi'[c-1]

    
    if ls[k-1]+1 == c:
        return "Messi Messi Gimossi"
    elif ls[k-1] >= c:
        return f(k-1,c)
    else:
        return f(k-2,c-1-ls[k-1])
print(f(len(ls)-1,n))