Skip to content

Commit 03fb03d

Browse files
committed
[Gold V] Title: 치킨 배달, Time: 16 ms, Memory: 69108 KB -BaekjoonHub
1 parent aaccabd commit 03fb03d

2 files changed

Lines changed: 132 additions & 0 deletions

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# [Gold V] 치킨 배달 - 15686
2+
3+
[문제 링크](https://www.acmicpc.net/problem/15686)
4+
5+
### 성능 요약
6+
7+
메모리: 69108 KB, 시간: 16 ms
8+
9+
### 분류
10+
11+
백트래킹, 브루트포스 알고리즘, 구현
12+
13+
### 제출 일자
14+
15+
2025년 4월 10일 01:57:07
16+
17+
### 문제 설명
18+
19+
<p>크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸, 왼쪽에서부터 c번째 칸을 의미한다. r과 c는 1부터 시작한다.</p>
20+
21+
<p>이 도시에 사는 사람들은 치킨을 매우 좋아한다. 따라서, 사람들은 "<strong>치킨 거리</strong>"라는 말을 주로 사용한다. <strong>치킨 거리</strong>는 집과 가장 가까운 치킨집 사이의 거리이다. 즉, 치킨 거리는 집을 기준으로 정해지며, 각각의 집은 <strong>치킨 거리</strong>를 가지고 있다. <strong>도시의 치킨 거리</strong>는 모든 집의 <strong>치킨 거리</strong>의 합이다.</p>
22+
23+
<p>임의의 두 칸 (r<sub>1</sub>, c<sub>1</sub>)과 (r<sub>2</sub>, c<sub>2</sub>) 사이의 거리는 |r<sub>1</sub>-r<sub>2</sub>| + |c<sub>1</sub>-c<sub>2</sub>|로 구한다.</p>
24+
25+
<p>예를 들어, 아래와 같은 지도를 갖는 도시를 살펴보자.</p>
26+
27+
<pre>0 2 0 1 0
28+
1 0 1 0 0
29+
0 0 0 0 0
30+
0 0 0 1 1
31+
0 0 0 1 2
32+
</pre>
33+
34+
<p>0은 빈 칸, 1은 집, 2는 치킨집이다.</p>
35+
36+
<p>(2, 1)에 있는 집과 (1, 2)에 있는 치킨집과의 거리는 |2-1| + |1-2| = 2, (5, 5)에 있는 치킨집과의 거리는 |2-5| + |1-5| = 7이다. 따라서, (2, 1)에 있는 집의 치킨 거리는 2이다.</p>
37+
38+
<p>(5, 4)에 있는 집과 (1, 2)에 있는 치킨집과의 거리는 |5-1| + |4-2| = 6, (5, 5)에 있는 치킨집과의 거리는 |5-5| + |4-5| = 1이다. 따라서, (5, 4)에 있는 집의 치킨 거리는 1이다.</p>
39+
40+
<p>이 도시에 있는 치킨집은 모두 같은 프랜차이즈이다. 프렌차이즈 본사에서는 수익을 증가시키기 위해 일부 치킨집을 폐업시키려고 한다. 오랜 연구 끝에 이 도시에서 가장 수익을 많이 낼 수 있는 치킨집의 개수는 최대 M개라는 사실을 알아내었다.</p>
41+
42+
<p>도시에 있는 치킨집 중에서 최대 M개를 고르고, 나머지 치킨집은 모두 폐업시켜야 한다. 어떻게 고르면, <strong>도시의 치킨 거리</strong>가 가장 작게 될지 구하는 프로그램을 작성하시오.</p>
43+
44+
### 입력
45+
46+
<p>첫째 줄에 N(2 ≤ N ≤ 50)과 M(1 ≤ M ≤ 13)이 주어진다.</p>
47+
48+
<p>둘째 줄부터 N개의 줄에는 도시의 정보가 주어진다.</p>
49+
50+
<p>도시의 정보는 0, 1, 2로 이루어져 있고, 0은 빈 칸, 1은 집, 2는 치킨집을 의미한다. 집의 개수는 2N개를 넘지 않으며, 적어도 1개는 존재한다. 치킨집의 개수는 M보다 크거나 같고, 13보다 작거나 같다.</p>
51+
52+
### 출력
53+
54+
<p>첫째 줄에 폐업시키지 않을 치킨집을 최대 M개를 골랐을 때, 도시의 치킨 거리의 최솟값을 출력한다.</p>
55+
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
let nm = readLine()!.split { $0 == " " }.map { Int(String($0))! },
2+
n = nm[0],
3+
m = nm[1]
4+
// 첫째 줄에 N(2 ≤ N ≤ 50)과 M(1 ≤ M ≤ 13)이 주어진다.
5+
// 집의 개수는 2N개를 넘지 않으며, 적어도 1개는 존재한다.
6+
// 치킨집의 개수는 M보다 크거나 같고, 13보다 작거나 같다.
7+
let grid = (0..<n).map { _ in readLine()!.split { $0 == " " }.map { Int(String($0))! }} //[[Int]]
8+
// 치킨거리 = |x2 - x1| + |y2 - y1|
9+
// 치킨집 중 최대 m개만 남겼을 때, 도시의 치킨 거리의 합을 최소로 하시오.
10+
// 각 집에서 가장 가까운 치킨집까지의 거리가 치킨 거리.
11+
// 모든 치킨 거리의 합이 도시의 치킨 거리
12+
// 치킨집을 하나씩 선택해서, k개까지 선택했을 때의 모든 경우 까지 최소 도시 치킨 거리를 갱신한다.
13+
14+
struct Point {
15+
init(_ y: Int, _ x: Int) {
16+
self.y = y
17+
self.x = x
18+
}
19+
let y: Int
20+
let x: Int
21+
22+
static func - (lhs: Point, rhs: Point) -> Int {
23+
abs(lhs.x - rhs.x) + abs(lhs.y - rhs.y)
24+
}
25+
}
26+
27+
var placeList = [Point]()
28+
var homeList = [Point]()
29+
// 치킨집의 위치를 등록한다.
30+
for y in 0..<n {
31+
for x in 0..<n {
32+
if grid[y][x] == 2 {
33+
placeList.append(Point(y, x))
34+
continue
35+
}
36+
if grid[y][x] == 1 {
37+
homeList.append(Point(y, x))
38+
continue
39+
}
40+
}
41+
}
42+
43+
var minTotalDistance = Int.max
44+
// 1...m까지 치킨집을 뽑고, minTotalDistance를 계속해서 갱신한다.
45+
var selected = [Bool](repeating: false, count: placeList.count)
46+
47+
48+
func selectChickens(_ idx: Int, _ selectedCount: Int) {
49+
if selectedCount == nm[1] {
50+
// 최소값
51+
minTotalDistance = min(minTotalDistance, clacDistance())
52+
return
53+
}
54+
if idx >= placeList.count { return }
55+
selected[idx] = true
56+
selectChickens(idx+1, selectedCount+1)
57+
selected[idx] = false
58+
selectChickens(idx+1, selectedCount)
59+
}
60+
61+
func clacDistance() -> Int {
62+
var totalDist = 0
63+
for home in homeList {
64+
var minDist = Int.max
65+
for i in placeList.indices {
66+
guard selected[i] else { continue }
67+
let dist = placeList[i] - home
68+
minDist = dist < minDist ? dist : minDist
69+
}
70+
totalDist += minDist
71+
}
72+
return totalDist
73+
}
74+
75+
selectChickens(0,0)
76+
77+
print(minTotalDistance)

0 commit comments

Comments
 (0)