본문 바로가기

algorithm

백준 3109 빵집 (greedy, dfs)

728x90

문제 : 3109번: 빵집 (acmicpc.net)

 

3109번: 빵집

유명한 제빵사 김원웅은 빵집을 운영하고 있다. 원웅이의 빵집은 글로벌 재정 위기를 피해가지 못했고, 결국 심각한 재정 위기에 빠졌다. 원웅이는 지출을 줄이고자 여기저기 지출을 살펴보던

www.acmicpc.net

 

풀이과정

첫 번째 열 -> 마지막 열 까지 파이프를 겹치지 않게 연결하면서 구할 수 있는 최대 파이프 수를 구하는 문제입니다.

 

건물이 있는 곳은 1, 지나갈 수 있는 곳은 0으로 채워줬으며, visited 배열을 사용해서 한번 방문한 곳은 다시 방문하지 않도록 했습니다.

 

탐색하는 순서를 오른쪽 위, 오른쪽, 오른쪽 아래 순서대로 탐색하기 때문에 greedy 알고리즘이 적용됩니다

#include <iostream>
#include <set>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int R,C;
int A[10001][501];
int visited[10001][501];
// 무조건 오른쪽 위, 오른쪽, 오른쪽 아래 순으로 탐색해서
// greedy하게 답을 찾아야한다
int dy[3] = {-1,0,1};
int dx[3] = {1,1,1};
int flag = false;
int answer = 0;

void solution(int y, int x) {
    visited[y][x] = 1;
    if(x == C-1) {
        flag = true;
        answer++;
        return;
    }

    for(int i=0; i<3; i++) {
        int ny = y+dy[i];
        int nx = x+dx[i];
        if(ny >= R || ny < 0) continue;
        if(visited[ny][nx] || A[ny][nx] == 1) continue;

        solution(ny,nx);
        if(flag) return;
    }
}

int main()
{
    string s;
    scanf("%d %d",&R,&C);
    for(int i=0; i<R; i++) {
        cin >> s;
        for(int j=0; j<s.size(); j++) {
            if(s[j] == '.') A[i][j] = 0;
            else A[i][j] = 1;
        }
    }
    for(int i=0; i<R; i++) {
        flag = false;
        solution(i,0);
    }
    printf("%d\n",answer);
}
728x90

'algorithm' 카테고리의 다른 글

백준 12904 - A와 B (greedy)  (0) 2021.09.04
백준 10775 공항 (union-find algorithm)  (0) 2021.08.25
백준 1202 - 보석 도둑  (0) 2021.08.18
c++) 알고스팟 - 도시락 데우기 (greedy)  (0) 2021.08.15
1495 기타리스트 (dp)  (0) 2021.08.10