Skip to content

Commit 03b8ca5

Browse files
committed
[Gold III] Title: 소코반, Time: 8 ms, Memory: 79520 KB -BaekjoonHub
1 parent 8c20b77 commit 03b8ca5

2 files changed

Lines changed: 180 additions & 0 deletions

File tree

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# [Gold III] 소코반 - 4577
2+
3+
[문제 링크](https://www.acmicpc.net/problem/4577)
4+
5+
### 성능 요약
6+
7+
메모리: 79520 KB, 시간: 8 ms
8+
9+
### 분류
10+
11+
구현, 시뮬레이션
12+
13+
### 제출 일자
14+
15+
2026년 3월 9일 09:38:27
16+
17+
### 문제 설명
18+
19+
<p><img alt="" src="" style="float:right; height:178px; width:200px">소코반은 1982년에 일본에서 만들어진 게임으로, 일본어로 창고지기라는 뜻이다. 이 게임은 캐릭터를 이용해 창고 안에 있는 박스를 모두 목표점으로 옮기는 게임이다. 목표점의 수와 박스의 수는 같다. 플레이어는 화살표(위, 아래, 왼쪽, 오른쪽)를 이용해 캐릭터를 아래와 같은 규칙으로 조정할 수 있다.</p>
20+
21+
<ul>
22+
<li>캐릭터에게 지시한 방향이 빈 칸(박스나 벽이 아닌 곳)인 경우에는 그 칸으로 이동한다.</li>
23+
<li>지시한 방향에 박스가 있는 경우에는, 박스를 민다. 이 경우에는 박스가 이동할 칸도 비어있어야 한다.</li>
24+
<li>지시한 방향이 벽인 경우, 또는 박스가 있는데, 박스가 이동할 칸에 다른 박스나 벽이 있는 경우에는 키를 눌러도 캐릭터는 이동하지 않는다.</li>
25+
</ul>
26+
27+
<p>모든 박스를 목표점으로 이동시킨 경우에 게임은 끝난다. 게임이 끝난 후에 입력하는 키는 모두 무시된다.</p>
28+
29+
<p>준규는 소코반으로 고통받는 친구들을 위해서 소코반의 해를 찾는 프로그램을 작성하려고 한다. 하지만, 소코반의 해를 찾는 문제는 NP-hard와 PSPACE-complete에 속하고, 매우 어려운 문제이다. 따라서, 간단한 소코반 프로그램을 작성해보려고 한다.</p>
30+
31+
<p>사용자가 입력한 키가 순서대로 주어졌을 때, 게임이 어떻게 진행되는지를 구하는 프로그램을 작성하시오.</p>
32+
33+
<p>게임의 상태는 아래와 같은 문자로 나타낼 수 있다.</p>
34+
35+
<table class="table table-bordered" style="width:50%">
36+
<thead>
37+
<tr>
38+
<th style="width:20%">문자</th>
39+
<th style="width:40%">뜻</th>
40+
</tr>
41+
</thead>
42+
<tbody>
43+
<tr>
44+
<td>.</td>
45+
<td>빈 공간</td>
46+
</tr>
47+
<tr>
48+
<td>#</td>
49+
<td>벽</td>
50+
</tr>
51+
<tr>
52+
<td>+</td>
53+
<td>비어 있는 목표점</td>
54+
</tr>
55+
<tr>
56+
<td>b</td>
57+
<td>박스</td>
58+
</tr>
59+
<tr>
60+
<td>B</td>
61+
<td>목표점 위에 있는 박스</td>
62+
</tr>
63+
<tr>
64+
<td>w</td>
65+
<td>캐릭터</td>
66+
</tr>
67+
<tr>
68+
<td>W</td>
69+
<td>목표점 위에 있는 캐릭터</td>
70+
</tr>
71+
</tbody>
72+
</table>
73+
74+
<p>첫 번째 입력은 문제의 그림과 같다.</p>
75+
76+
### 입력
77+
78+
<p>입력은 여러 개의 테스트 케이스로 이루어져 있다.</p>
79+
80+
<p>각 테스트 케이스의 첫째 줄에는 행과 열의 수 R, C가 주어진다. (4 ≤ R ≤ 15, 4 ≤ C ≤ 15) 다음 R개 줄에는 현재 게임의 상태가 주어진다. 모든 줄은 C개의 문자로 이루어져 있다. 마지막 줄에는 플레이어가 입력한 키가 순서대로 주어지며 길이는 최대 50이다. 위, 아래, 왼쪽, 오른쪽은 U, D, L, R로 나타낸다.</p>
81+
82+
<p>입력의 마지막 줄에는 0 0이 주어진다.</p>
83+
84+
<p>입력으로 주어지는 모든 데이터는 항상 캐릭터가 한 명이고, 박스의 수와 목표점의 수는 같다. 또, 목표점 위에 올라가 있지 않은 박스는 적어도 한 개 이며, 가장 바깥쪽 칸은 항상 벽이다.</p>
85+
86+
### 출력
87+
88+
<p>각각의 게임에 대해서, 게임 번호를 출력한 다음에 게임이 끝났으면 complete를, 아니면 incomplete를 출력한다. 그 다음 줄부터 R개 줄에는 게임의 상태를 출력한다.</p>
89+
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import Foundation
2+
3+
var game = 1
4+
5+
while true {
6+
let rc = readLine()!.split(separator: " ").map { Int($0)! }
7+
let R = rc[0],
8+
C = rc[1]
9+
10+
if R == 0 && C == 0 { break }
11+
12+
var board = [[Character]]()
13+
var px = 0, py = 0
14+
15+
for i in 0..<R {
16+
let row = Array(readLine()!)
17+
for j in 0..<C {
18+
if row[j] == "w" || row[j] == "W" {
19+
px = i
20+
py = j
21+
}
22+
}
23+
board.append(row)
24+
}
25+
26+
let commands = Array(readLine()!)
27+
28+
let dir: [Character: (Int,Int)] = [
29+
"U":(-1,0), "D":(1,0),
30+
"L":(0,-1), "R":(0,1)
31+
]
32+
33+
func complete() -> Bool {
34+
for r in board {
35+
for c in r {
36+
if c == "b" { return false }
37+
}
38+
}
39+
return true
40+
}
41+
42+
for cmd in commands {
43+
if complete() { break }
44+
45+
let (dx,dy) = dir[cmd]!
46+
let nx = px + dx
47+
let ny = py + dy
48+
49+
let next = board[nx][ny]
50+
51+
if next == "." || next == "+" {
52+
if board[px][py] == "w" { board[px][py] = "." }
53+
else { board[px][py] = "+" }
54+
55+
if next == "." { board[nx][ny] = "w" }
56+
else { board[nx][ny] = "W" }
57+
58+
px = nx
59+
py = ny
60+
}
61+
62+
else if next == "b" || next == "B" {
63+
let bx = nx + dx
64+
let by = ny + dy
65+
let next2 = board[bx][by]
66+
67+
if next2 == "." || next2 == "+" {
68+
69+
if next2 == "." { board[bx][by] = "b" }
70+
else { board[bx][by] = "B" }
71+
72+
if next == "b" { board[nx][ny] = "w" }
73+
else { board[nx][ny] = "W" }
74+
75+
if board[px][py] == "w" { board[px][py] = "." }
76+
else { board[px][py] = "+" }
77+
78+
px = nx
79+
py = ny
80+
}
81+
}
82+
}
83+
84+
print("Game \(game): \(complete() ? "complete" : "incomplete")")
85+
86+
for r in board {
87+
print(String(r))
88+
}
89+
90+
game += 1
91+
}

0 commit comments

Comments
 (0)