dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • HackerRank mysql
  • Hackerrank
  • 백준 DP
  • BFS
  • 백준
  • AI Tech
  • 부스트캠프
  • dp
  • c++
  • Baekjoon
  • 그래프탐색
  • 서블릿
  • 프로그래머스 SQL
  • 스프링
  • 기록
  • 네이버 부스트캠프
  • 프로그래머스
  • 일기
  • 회고
  • 반성

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

[프로그래머스] 등굣길 (DP, DFS) [C++]
문제 풀이/프로그래머스 알고리즘, SQL

[프로그래머스] 등굣길 (DP, DFS) [C++]

2021. 3. 12. 22:02
728x90

programmers.co.kr/learn/courses/30/lessons/42898

 

코딩테스트 연습 - 등굣길

계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다. 아래 그림은 m =

programmers.co.kr

웅덩이를 피해서 목적지까지의 경로의 수를 세야 한다.

다른 분들은 DP를 이용해서 쉽게 풀었지만, 나는 DP+DFS로 풀었다.

 

#include <string>
#include <vector>
#define MOD 1000000007

using namespace std;

int dp[101][101], arr[101][101], N, M, xmove[2] = {1, 0}, ymove[2] = {0, 1};

int DFS(int startX, int startY){
    if(dp[startX][startY] != -1){
        return dp[startX][startY];
    }
    if(startX == N && startY == M)
        return 1;
    
    dp[startX][startY] = 0;
    
    for(int i = 0 ; i < 2 ; i++){
        int nx = startX + xmove[i];
        int ny = startY + ymove[i];
        
        if(nx >= 1 && nx <= N && ny >= 1 && ny <= M){
            if(arr[nx][ny] == 1){
                dp[startX][startY] += (DFS(nx, ny) % MOD);
            }
        }
    }
    return dp[startX][startY] % MOD;
}

int solution(int m, int n, vector<vector<int>> puddles) {
    int answer = 0;
    N = n;
    M = m;
    
    for(int i = 1 ; i <= n ; i++){
        for(int j = 1 ; j <= m ; j++){
            dp[i][j] = -1;
            arr[i][j] = 1;
        }
    }
    
    for(int i = 0 ; i < puddles.size() ; i++){
        int x = puddles[i][1];
        int y = puddles[i][0];
        arr[x][y] = 0;
    }
    
    answer = DFS(1,1);
    
    return answer;
}

일단 DFS를 하기 위해 arr배열을 모두 1로 초기화해주었고, DP 배열은 -1로 초기화해주었다. (미방문은 -1, 방문은 n)

또한 puddles의 원소들을 통해 방문 못하는 x, y를 arr배열에 0으로 업데이트해주었다.

 

그러고 나서 1,1부터 DFS로 그래프 순환을 해주었는데, 여기서 DP개념을 이용했다.

만약 매번 경로를 찾기 위해 백트래킹을 이용해서 모두 세면 너무나도 많이 탐색을 해야 한다.

따라서 특정 x, y까지 방문할 수 있는 경우의 수를 dp배열에 저장해두어서 만약 이미 탐색이 끝난 곳을 방문했다면 그 배열에 저장되어있는 경로의 수를 더해준다.

 

그렇게 탐색을 하다가 목표인 M과 N에 도착하면 1을 리턴해주는데, dp[startX][startY] += DFS(nx, ny)에서 볼 수 있듯이 현재 지점에서 목표 지점까지의 경우의 수를 누적해서 저장해준다.

또한, 더 이상 방문할 곳이 없다면 현재 dp의 값을 반환해준다.

그래서 결과적으로

4 3 3 1
1 -1 2 1
1 1 1 -1

이 완성된다. (도착점에 도착하면 1을 반환하면서 역순으로 경로에 더해간다.)

728x90
저작자표시 비영리 변경금지 (새창열림)

'문제 풀이 > 프로그래머스 알고리즘, SQL' 카테고리의 다른 글

[프로그래머스 LV4] 3 x n 타일링 (DP) [C++]  (0) 2021.03.16
[프로그래머스] 여행경로 (문자열, BFS) [C++]  (0) 2021.03.12
[프로그래머스 SQL] 입양 시각 구하기(2) group by, recursive  (0) 2021.02.26
[프로그래머스 SQL] DATETIME에서 DATE로 형 변환 (DATE, DATE_FORMAT)  (0) 2021.02.23
[프로그래머스 SQL] 오랜 기간 보호한 동물(2) (date, innerJoin)  (0) 2021.02.23
    '문제 풀이/프로그래머스 알고리즘, SQL' 카테고리의 다른 글
    • [프로그래머스 LV4] 3 x n 타일링 (DP) [C++]
    • [프로그래머스] 여행경로 (문자열, BFS) [C++]
    • [프로그래머스 SQL] 입양 시각 구하기(2) group by, recursive
    • [프로그래머스 SQL] DATETIME에서 DATE로 형 변환 (DATE, DATE_FORMAT)
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바