티스토리 뷰

알고리즘/BOJ

[BOJ-1937] 욕심쟁이 판다

개발하는 후딘 2020. 4. 24. 22:14
728x90
반응형

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

 

1937번: 욕심쟁이 판다

n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서 대나무를 먹는다. 그런데 단 조건이 있다. 이 판다는 매우 욕심이 많아서 대나무를 먹고 자리를 옮기면 그 옮긴 지역에 그 전 지역보다 대나무가 많이 있어야 한다. 만약에 그런 지점이 없으면 이 판다는 불만을 가지고 단식 투쟁을 하다가 죽게 된다(-_-) 이

www.acmicpc.net


[코드 - Python3]

 

import sys
sys.setrecursionlimit(10**8)
input = sys.stdin.readline

#상하좌우
dy=(-1,1,0,0)
dx=(0,0,-1,1)

def maxAge(y,x):
    global n, MAP, dp
    #현위치에 대한 최대수명이 0이 아니라면
    if dp[y][x]!=0:
        return dp[y][x]

    #현위치에 대한 최대수명이 0이다.
    dp[y][x]=1 #판다가 살 수 있는 수명은 최소 1일이다.
    for i in range(4):
        nexty=y+dy[i]
        nextx=x+dx[i]
        if (nexty>=0 and nexty<n) and (nextx>=0 and nextx<n):
            #다음위치의 대나무수가 현위치보다 더 많다면
            if MAP[nexty][nextx]>MAP[y][x]:
                #현위치의 최대수명= 현위치최대수명, 다음위치 최대수명+1 중 큰값
                dp[y][x]=max(dp[y][x], maxAge(nexty, nextx)+1)
    return dp[y][x]
                
if __name__=='__main__':
    n=int(input())
    #n*n 맵 입력
    MAP=[ [*map(int, input().strip().split())] for _ in range(n)]

    dp=[ [0]*n for _ in range(n)]
    ans=0
    for y in range(n):
        for x in range(n):
            #현위치(y,x)에 놓였을 때 수명을 구한다.
            ans=max(ans, maxAge(y,x))
    print(ans)

[실패 코드1 - Pypy3 - 시간초과]

- 각 원소별로 최대 수명을 구한다.

- BFS를 이용했다.

- 다음위치의 값(대나무개수)이 현위치의 값보다 크면 큐에 계속 추가하며, 나이를 더한다.

import sys
from collections import deque
input = sys.stdin.readline
q=deque()

#상하좌우
dy=(-1,1,0,0)
dx=(0,0,-1,1)

def bfs(y,x):
    global MAP, n
    max_age=0
    q.append((y,x,1))
    visited=[[False]*n for _ in range(n)]
    
    while q:
        cury, curx, age=q.popleft()
        max_age=max(max_age, age)
        for i in range(4):
            nexty=cury+dy[i]
            nextx=curx+dx[i]

            #다음위치가 n행 n열 배열의 원소에 속하는가?
            if (nexty>=0 and nexty<n) and (nextx>=0 and nextx<n):
                #다음위치가 처음값보다 더 크고, 아직 방문하지 않았는가?
                if (MAP[nexty][nextx]>MAP[cury][curx]) and (not visited[nexty][nextx]):
                    q.append((nexty, nextx, age+1))
    return max_age
        

n=int(input().strip())
MAP=[ [*map(int,input().strip().split())] for _ in range(n)]
dp=[[0]*n for _ in range(n)]
max_age=0
for y in range(n):
    for x in range(n):
        dp[y][x]=bfs(y,x)
        max_age=max(max_age, dp[y][x])
        
print(max_age)

 

[참고]

https://yabmoons.tistory.com/154

 

[ 백준 1937 ] 욕심쟁이 판다 (C++)

백준의 욕심쟁이판다(1937) 문제이다. [ 문제 바로가기 ] [ 문제풀이 ] 1) 얼핏보면, BFS/DFS로 쉽게 풀 수 있는 문제 같지만, BFS/DFS로 풀게될 경우, 시간초과 때문에 통과를 받을 수 없는 문제이다. 따라서, Dy..

yabmoons.tistory.com

 

728x90
반응형

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

[BOJ-2583] 영역구하기  (0) 2020.04.23
[BOJ-1915] 가장 큰 정사각형  (0) 2020.04.20
[BOJ-1339] 단어수학  (0) 2020.04.19
[BOJ-1987] 알파벳  (0) 2020.04.19
[BOJ-2096] 내려가기  (0) 2020.04.19
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함