광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 합주
  • 프로그래머스
  • 드린이
  • 개념
  • 컴퓨터 사이언스
  • 애플워치 앱
  • BFS
  • 다이나믹 프로그래밍
  • 파이썬
  • 티스토리챌린지
  • 운영체제
  • 오블완
  • 알고리즘
  • OS
  • DP
  • BOJ
  • 백준
  • 구현
  • 애플워치 앱 만들기
  • 자바

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니

광규니네

알고리즘/문제 풀이

[Java/자바 백준 1520] 내리막 길

2022. 1. 5. 15:18
반응형

풀이

DFS + DP 문제입니다

처음에 DFS로만 풀었는데 메모리 초과가 발생했습니다.

 

이를 보완하기 위해 DP 메모이제이션 방법을 추가했습니다.

 

나보다 더 낮은 경로일 때 탐색을 계속해서 진행했으며,

목적지까지 도착하면 dp +1 시켜주었습니다.

 

DFS방식이기 때문에 dp가 -1 이 아닌 경우는 이미 끝까지 탐색한 경로이기 때문에

해당하는 dp를 바로 return 시켜주었습니다. 

import java.io.*;
import java.util.*;
// dfs + dp 문제 
public class Main{
	static int N, M;
	static int[][] map;
	static int[][] dp;
	static int[] dx = {-1,0,1,0};
	static int[] dy = {0,-1,0,1};
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine() , " ");
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		map = new int[N][M];
		dp = new int[N][M];
		
		for(int i = 0 ; i < N ; i ++) {
			st = new StringTokenizer(br.readLine() , " ");
			for(int j = 0 ; j < M ; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				// -1 로 초기화 , 방문할시 0처리 
				dp[i][j] = -1;
			}
		}
		
		System.out.println(searchDown(0,0));
	}
	private static int searchDown(int x, int y) {
		if(x == N-1 && y == M-1) {
			return 1;
		}
		// dfs 방식이므로 dp가 -1 아니라면 이미 탐색한 경로이므로 return dp;
		if(dp[x][y] != -1) {
			return dp[x][y];
		}
		
		dp[x][y] = 0;
		for(int i = 0 ; i < 4 ; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			if(0 > nx || nx >= N || 0>ny || ny>= M || map[x][y] <= map[nx][ny]) continue;
			// 가능한 경로를 dp += 1
			dp[x][y] += searchDown(nx, ny);
		}
		return dp[x][y];
	}
}
반응형
저작자표시 (새창열림)

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[Java/자바 프로그래머스] 오픈 채팅방  (0) 2022.01.07
[Java/자바 20056 백준] 마법사 상어와 파이어볼  (0) 2022.01.06
[Java/자바 20055 백준] 컨베이어 벨트 위의 로봇  (0) 2022.01.05
[Java/자바 백준 19238] 스타트 택시  (0) 2022.01.04
[Java/자바 백준 2589] 보물섬  (0) 2022.01.03
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 프로그래머스] 오픈 채팅방
    • [Java/자바 20056 백준] 마법사 상어와 파이어볼
    • [Java/자바 20055 백준] 컨베이어 벨트 위의 로봇
    • [Java/자바 백준 19238] 스타트 택시
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바