백준 15686 치킨 배달(c++)

2022. 8. 9. 20:50·PS/깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]

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

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net

<코드>

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <cmath>
using namespace std;

vector<pair<int,int>> house, chicken ,pick;
int n,m,t;
int ret = 100000000;
void dfs(int pos)
{
	if(pick.size()==m){
		int candi = 0;
		for(int i=0;i<house.size();i++){
			int min_dist = 1000000;
			for(int j=0;j<pick.size();j++){
				min_dist = min(min_dist,abs(house[i].second - pick[j].second) + abs(house[i].first - pick[j].first));
			}
			candi += min_dist;
		}
		if(ret>candi){
			ret = candi;
		}
		return;
	}
	
	for(int i=pos;i<chicken.size();i++)
	{
		pick.push_back(make_pair(chicken[i].first,chicken[i].second));
		dfs(i+1);
		pick.pop_back();
	}
}
int main()
{
	
	cin>>n>>m;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>t;
			if(t==1){
				house.push_back(make_pair(i,j));
			}
			if(t==2){
				chicken.push_back(make_pair(i,j));
			}
		}
	}
	
	dfs(0);
	
	cout<<ret<<'\n';
}

<풀이 과정>

이 문제는 dfs(깊이 우선 탐색)을 활용한 문제이다.

우선적으로 치킨과 집의 좌표를 push 해주고 가장 가까운 치킨집의 개수만큼 새로운 pair 벡터에 push 해주어야 한다. 

그 부분이 dfs함수안에 있는 for문이다. dfs는 재귀함수 기반으로 풀어나가는 방식이므로 처음에 chicken의 좌표를 새로운 pick 벡터에 push하고 dfs를 한번 재귀호출 시켜야 한다. 그리고 치킨의집의 개수가 m개가 되면 좌표간(house, chicken)의 거리가 최소가 되는 점들을 하나씩 더해주면 된다. 

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

'PS > 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]' 카테고리의 다른 글

백준 1260 DFS와 BFS(c++)  (0) 2022.08.12
백준 14502 연구소(c++)  (0) 2022.08.09
백준 7562 나이트의 이동(c++)  (0) 2022.08.06
백준 1012 유기농 배추(c++)  (0) 2022.08.05
백준 4963 섬의 개수(c++)  (0) 2022.08.04
'PS/깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]' 카테고리의 다른 글
  • 백준 1260 DFS와 BFS(c++)
  • 백준 14502 연구소(c++)
  • 백준 7562 나이트의 이동(c++)
  • 백준 1012 유기농 배추(c++)
SeungbeomKim
SeungbeomKim
[IT(PS, CS, SW, etc.) 지식 기록] Github : https://github.com/daily1313/
  • SeungbeomKim
    개발 블로그
    SeungbeomKim
  • 전체
    오늘
    어제
    • 분류 전체보기 (383)
      • 일상 (33)
        • 여행 (17)
        • 회고록 (9)
        • 리뷰 (7)
      • PS (138)
        • 그리디 알고리즘[Greedy] (25)
        • 정렬 알고리즘[Sort] (18)
        • 문자열 알고리즘[String] (14)
        • 동적 계획 알고리즘[DP] (17)
        • 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS.. (34)
        • 재귀[Recursion] (2)
        • 백트래킹[Backtracking] (5)
        • 브루트포스 알고리즘[Bruteforce] (16)
        • 자료 구조[Data Structure] (4)
        • 분할 정복 알고리즘[Divide & Conquer.. (3)
      • CS (22)
      • Network (11)
      • Database (8)
        • Elasticsearch (3)
      • Linux (2)
      • JavaScript (4)
        • AngularJS (1)
      • Java (92)
        • Effective Java (5)
        • Java Concept (20)
        • Spring (61)
        • Design Pattern (3)
      • Python (2)
      • Vscode (1)
      • DevOps (43)
        • AWS (27)
        • Git (7)
        • Docker (6)
        • Nginx (1)
      • 자격증 (10)
        • SQL (4)
      • 사이드 프로젝트 (2)
        • MatJido (2)
      • 기타 (9)
  • 블로그 메뉴

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

    • Github
  • 공지사항

  • 인기 글

  • 태그

    springboot
    docker
    sqld
    Wi-Fi
    Spring
    정보처리기사
    메타코딩
    다이나믹 프로그래밍
    컴퓨터구조
    dfs
    이펙티브 자바
    정보처리기사 필기
    AWS
    백트래킹
    dp
    정보처리기사 실기
    너비 우선 탐색
    Effective Java
    BFS
    일본여행
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
SeungbeomKim
백준 15686 치킨 배달(c++)
상단으로

티스토리툴바