Skip to content

Commit b0cb9cf

Browse files
committed
[Gold V] Title: 진우의 민트초코우유, Time: 632 ms, Memory: 69108 KB -BaekjoonHub
1 parent d1972e4 commit b0cb9cf

2 files changed

Lines changed: 100 additions & 0 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Gold V] 진우의 민트초코우유 - 20208
2+
3+
[문제 링크](https://www.acmicpc.net/problem/20208)
4+
5+
### 성능 요약
6+
7+
메모리: 69108 KB, 시간: 632 ms
8+
9+
### 분류
10+
11+
백트래킹, 브루트포스 알고리즘
12+
13+
### 제출 일자
14+
15+
2025년 4월 25일 21:20:01
16+
17+
### 문제 설명
18+
19+
<p>진우는 민트초코우유를 좋아하는 민초단이다. 힘든 일이 있더라도 민트초코우유 하나를 마시면 기운이 펄펄 솟는다고 한다!</p>
20+
21+
<p>민트초코우유를 너무 좋아하는 나머지 진우는 매일 아침 특정 지역들에서 민트초코우유가 배달된다는 <em>N</em> × <em>N</em> 크기의 2차원 민초마을로 이사를 하였다.</p>
22+
23+
<p>진우는 아침에 눈을 뜨면 집에서 민초마을의 지도를 들고 민트초코우유를 찾으러 출발한다. 이때의 초기 체력은 <em>M</em>이다. 여기에서 체력은 진우가 이동할 수 있는 거리를 나타낸다. 진우는 지도상에서 상, 하, 좌, 우로 1칸씩 이동할 수 있으며 이동하면 체력이 1만큼 줄어든다. 진우가 마을을 돌아다니다가 민트초코우유를 마신다면 체력이 <em>H </em>만큼 증가하며 진우의 체력이 초기체력 이상으로 올라갈 수 있다. 체력이 0이 되는 순간 진우는 이동할 수 없다.</p>
24+
25+
<p>민트초코를 찾으러 돌아다니다가 마을 한복판에서 체력이 0이 되어 집으로 못 돌아가는 상황은 만들어져서는 안된다. 진우가 얼마나 많은 민트초코우유를 마시고 집으로 돌아올 수 있는지 알아보자.</p>
26+
27+
### 입력
28+
29+
<p>첫번째 줄에 민초마을의 크기인 <em>N</em>과 진우의 초기체력 <em>M</em>, 그리고 민트초코우유를 마실때 마다 증가하는 체력의 양 <em>H</em>가 공백을 두고 주어진다. <em>N</em>, <em>M</em>, <em>H</em>는 모두 10보다 작거나 같은 자연수이다.</p>
30+
31+
<p>두번째 줄부터 <em>N</em>+1번째 줄에 <em>N</em>칸에 걸쳐서 민초마을의 지도가 주어진다. 각 칸은 공백을 두고 주어지며 지도상에서 진우의 집은 1, 민트초코우유는 2로 주어지며 빈 땅은 0으로 주어진다. 진우의 집은 무조건 한 곳이 주어지며 마을에 배달되는 민트초코우유의 총합은 10개를 넘지 않는다.</p>
32+
33+
### 출력
34+
35+
<p>진우가 집을 나와서 다시 집으로 돌아올 때 까지 마실 수 있는 민트초코우유의 최대 개수를 출력하자.</p>
36+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
let nmh = readLine()!.split(separator: " ").map { Int($0)! },
2+
n = nmh[0],
3+
m = nmh[1],
4+
h = nmh[2] //마을 크기, 초기 체력, 증가하는 h양
5+
6+
let board = (0..<n).map { _ in readLine()!.split(separator: " ").map { Int($0)! }}
7+
8+
var visited = [[Bool]](repeating: [Bool](repeating: false, count:n), count:n)
9+
10+
var milks = [(Int, Int)]()
11+
var house = (0, 0)
12+
var answer = 0
13+
14+
for i in 0..<n {
15+
for j in 0..<n {
16+
if board[i][j] == 1 {
17+
house = (i, j)
18+
} else if board[i][j] == 2 {
19+
milks.append((i, j))
20+
}
21+
}
22+
}
23+
24+
func permutation(_ left:Int, _ right: Int){
25+
if left == right {
26+
simulation()
27+
return
28+
}
29+
30+
for i in left...right {
31+
milks.swapAt(i, left)
32+
permutation(left+1, right)
33+
milks.swapAt(i, left)
34+
}
35+
}
36+
37+
//num: 초코우유 개수
38+
func simulation() {
39+
var hp = m
40+
var count = 0
41+
42+
var nx = house.0
43+
var ny = house.1
44+
45+
for (i, j) in milks {
46+
let dist = abs(nx-i) + abs(ny-j)
47+
if hp - dist < 0 { return } //체력에서 민트초코간의 거리(민트초코로 이동하기 까지의 소모 체력)을 뺐을 때 떨어지면 찾는 경우의 수가 아니므로 백트랙
48+
49+
hp -= dist //잔여 체력
50+
hp += h //민트초코 먹었으므로 +h
51+
count += 1 //민트초코 개수 + 1
52+
53+
if hp >= abs(house.0-i) + abs(house.1-j) { //현재 체력으로 집으로 갈 수 있다면
54+
answer = max(answer, count)
55+
}
56+
57+
nx = i //그 다음 우유로 이동
58+
ny = j
59+
}
60+
}
61+
62+
if !milks.isEmpty { permutation(0, milks.count-1) }
63+
64+
print(answer)

0 commit comments

Comments
 (0)