알고리즘 문제풀이:: 백준 삼성SW 15686 치킨 배달

2023. 4. 8. 23:41·Problem Solving/문제풀이
반응형

백준 풀이 - DFS / 조합

문제리뷰

15686 치킨 배달 (골드5)

 

피드백

DFS로 치킨 가게의 조합을 구한 후,

각 치킨 가게에서 집까지의 거리를 구해

최솟값을 구하면 되는 문제

 

가장 처음 풀 때는 치킨가게까지 BFS로 구하려다가 꼬였는데 그냥 좌표로 계산하면 간단한 문제였음

  • 이중 for문 인덱스 주의
  • 입력값을 for문에 사용할 때 의미를 제대로 알고 사용해야 실수하지 않음
    • m은 남길 치킨 가게의 개수인데 치킨 가게의 총 개수로 착각해서 헤맸음

 

C++

15686 치킨 배달

#include <iostream>
#include <vector>
#include <deque>
#define MAX 50
#define X first
#define Y second
using namespace std;

struct PLACE {
	int x;
	int y;
	int dist;

	PLACE(int _x, int _y, int _dist) {
		x = _x;
		y = _y;
		dist = _dist;
	}
};

int n, m, answer;
int vis[13];
int board[MAX][MAX];
vector< pair<int, int> > chicken;
vector<PLACE> house;

void input() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> board[i][j];

			if (board[i][j] == 2) {
				chicken.push_back({ i, j });
			}
			else if (board[i][j] == 1) {
				house.push_back(PLACE(i, j, 0));
			}
		}
	}
}

int abs(int a, int b) {
	return (a > b) ? a - b : b - a;
}

void calDist() {
	for (int i = 0; i < house.size(); i++) {
		house[i].dist = 0;
	}

	for (int i = 0; i < chicken.size(); i++) {
		if (!vis[i]) continue;

		pair<int, int> ch = chicken[i];
		for (int j = 0; j < house.size(); j++) {
			PLACE h = house[j];
			int temp = abs(ch.X, h.x) + abs(ch.Y, h.y);

			if (h.dist == 0 || h.dist > temp) {
				house[j].dist = temp;
			}
		}
	}
}

void calAns() {
	int temp = 0;
	for (int i = 0; i < house.size(); i++) {
		temp += house[i].dist;
	}

	if (answer == 0 || answer > temp)
		answer = temp;
}

void dfs(int start, int cnt) {
	if (cnt == m) {
		calDist();
		calAns();
		return;
	}

	for (int i = start; i < chicken.size(); i++) {
		if (vis[i]) continue;		
		vis[i] = 1;
		dfs(i, cnt + 1);
		vis[i] = 0;
	}
}

void solution() {
	dfs(0, 0);
}

void solve() {
	input();
	solution();
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	solve();
	cout << answer << '\n';
}
반응형

'Problem Solving > 문제풀이' 카테고리의 다른 글

알고리즘 문제풀이:: 백준 1024 Z  (0) 2023.12.21
알고리즘 문제풀이:: 백준 삼성SW 21609 상어 중학교  (0) 2023.04.09
알고리즘 문제풀이:: 백준 삼성SW 20057 마법사 상어와 토네이도  (0) 2023.04.08
알고리즘 문제풀이:: 백준 삼성SW 21611 마법사 상어와 블리자드  (0) 2023.04.08
알고리즘 문제풀이:: 프로그래머스 Graph 전력망을 둘로 나누기  (2) 2023.02.17
'Problem Solving/문제풀이' 카테고리의 다른 글
  • 알고리즘 문제풀이:: 백준 1024 Z
  • 알고리즘 문제풀이:: 백준 삼성SW 21609 상어 중학교
  • 알고리즘 문제풀이:: 백준 삼성SW 20057 마법사 상어와 토네이도
  • 알고리즘 문제풀이:: 백준 삼성SW 21611 마법사 상어와 블리자드
나귀당
나귀당
게임 클라이언트 개발자의 개인 블로그 (기술, 개발일지, 성찰)
  • 나귀당
    나귀라 카더라
    나귀당
    • 분류 전체보기 (169)
      • 개발 (26)
        • 게임 (9)
        • 서브 (9)
        • 기타 (8)
      • Computer Science (20)
        • 머신러닝 (5)
        • 정보보안 (6)
        • 컴퓨터비전 (8)
        • 컴퓨터그래픽스 (1)
      • Problem Solving (52)
        • 이론 (17)
        • 문제풀이 (32)
        • 기타 (3)
      • 개인 (56)
        • Careers (1)
        • 회고+계획 (34)
        • 후기 (14)
        • 좌충우돌 (2)
        • 독서 (5)
      • 학교 (업뎃X) (15)
        • 과제 (2)
        • 수업관련 (9)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
나귀당
알고리즘 문제풀이:: 백준 삼성SW 15686 치킨 배달
상단으로

티스토리툴바