[백준] 1937번 - 욕심쟁이 판다 (C언어) [Gold3]

2023. 5. 29. 18:47·알고리즘

input output
4
14 9 12 10
1 11 5 4
7 15 2 13
6 3 16 8
4

해당 문제를 먼저 해석하면, n x n 크기의 대나무 숲은 2차원 배열로 정의한다. 판다는 대나무가 많은 곳으로 이동하기 때문에 판다가 이동하는 만큼 생존한다고 볼 수 있다. 판다가 생존 가능한 최대 일 수는 아래 표로 정리하였다.

 

해당 문제는 DFS와 동적 계획법을 사용한다면 해결가능한 문제이다. 만약, DFS만을 진행한다면 이미 탐색한 곳에 대해서 다시 탐색하는 의미없는 탐색을 진행하기 때문에 최대 깊이까지 탐색한 후 백트래킹을 통해 동적계획법의 값을 저장한다. 백트래킹시에 현재 값에 1을 더해준 값을 반환한다. 

 

전체 소스 코드는 아래와 같다.

#include <stdio.h>
#define max(X,Y) ((X) > (Y) ? (X) : (Y)) // max 정의
#pragma warning(disable:4996)

int n;
int bamboo[1001][1001]; // 대나무 좌표
int sum[1001][1001]; // 판다 생존 일수

int dx[] = { -1,1,0,0 }; // x 좌표
int dy[] = { 0,0,1,-1 }; // y 좌표

int dfs(int x, int y) { // dfs 와 동적 계획법 사용
    if (sum[x][y] != 0) 
        return sum[x][y];

    sum[x][y] = 1; // 초깃값 설정
    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i]; 
        int ny = y + dy[i];
        

        if (ny < 0 || nx < 0 || nx >= n || ny >= n) // 범위를 벗어난 경우
            continue;
        if (bamboo[nx][ny] > bamboo[x][y]) { // 판다가 생존할 수 있는 일 수 갱신 
            sum[x][y] = max(sum[x][y], dfs(nx, ny) + 1 );
        }
    }
    return sum[x][y];
}


int main() {

	scanf("%d", &n);

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			scanf("%d", &bamboo[i][j]);
		}
	}

	int result = 0;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            result = max(result, dfs(j, i)); // 최댓값 갱신
        }
    }

    printf("%d", result);

	return 0;
}

[동적계획법]

https://hongjw1938.tistory.com/47

 

알고리즘 - Dynamic Programming(동적 계획법)

1. 개요 DP, 즉 다이나믹 프로그래밍(또는 동적 계획법)은 기본적인 아이디어로 하나의 큰 문제를 여러 개의 작은 문제로 나누어서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 것으로

hongjw1938.tistory.com

 

[1937번]

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

 

1937번: 욕심쟁이 판다

n × n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에

www.acmicpc.net

 

[github]

https://github.com/MinWook6457

 

MinWook6457 - Overview

MinWook6457 has 18 repositories available. Follow their code on GitHub.

github.com

 

 

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

[백준] 2042번 - 구간 합 구하기 (C언어) [Gold1]  (0) 2023.05.31
[백준] 1918번 - 후위 표기식 (C언어) [Gold2]  (0) 2023.05.30
[백준] 1260번 - DFS와 BFS (C언어) [Silver2]  (0) 2023.05.28
[백준] 1407번 - 2로 몇 번 나누어질까 (C언어) [Gold4]  (0) 2023.05.27
[백준] 1197번 - 최소 스패닝 트리 (C언어) [Gold4]  (0) 2023.05.26
'알고리즘' 카테고리의 다른 글
  • [백준] 2042번 - 구간 합 구하기 (C언어) [Gold1]
  • [백준] 1918번 - 후위 표기식 (C언어) [Gold2]
  • [백준] 1260번 - DFS와 BFS (C언어) [Silver2]
  • [백준] 1407번 - 2로 몇 번 나누어질까 (C언어) [Gold4]
min._.uuk_
min._.uuk_
하루 하나 기록하기
  • min._.uuk_
    기록하는 습관
    min._.uuk_
  • 전체
    오늘
    어제
    • 분류 전체보기 (33)
      • 알고리즘 (15)
      • 자바 스크립트 (2)
      • 인실리코젠 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    백준 #1407번 #재귀함수
    백준 #MST #최소비용신장트리 #크루스칼 #그리디 #알고리즘
    #BOJ #백준 #10989번 #C언어 #카운팅정렬 #정렬
    JS #테트리스 #HTML #CSS #추억의 게임
    백준 #후위표기식 #스택 #중위표기식 #우선순위 #1918번
    인실리코젠 #크롤링 #SpringBoot #MVC #jQuery
    Apache #POI #JAVA #maven
    백준 #동적계획법 #dp #백트래킹 #dfs
    백준 #BOJ #스택 #수열
    백준 #세그먼트 트리 #구간합 #c언어 #골드1 #탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
min._.uuk_
[백준] 1937번 - 욕심쟁이 판다 (C언어) [Gold3]
상단으로

티스토리툴바