https://www.acmicpc.net/problem/1347
1347번: 미로 만들기
홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍
www.acmicpc.net
구현 문제에 해당한다. 홍준이의 이동방향을 어떻게 구현할지 고민했던 문제다.
풀이
시작지점이 지도의 어느 부분인지 알 수 없다. 따라서 시작 지점에서 최대 이동 범위인 50칸을 상하좌우로 확장한 상태에서 시작하여 지도를 그려낸 뒤 방문했던 x, y값의 최대, 최소 좌표 영역을 출력했다.
미로 탐색 부분의 구현은 BFS를 사용할 때 자주 사용하던 dx, dy배열을 사용하여 "L"이나 "R"이 입력되면 배열의 인덱스를 변경하는 방법으로 구현했다.
정답 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
let n = Int(readLine()!)! | |
let cmd = readLine()!.map{String($0)} | |
var map = Array(repeating: Array(repeating: "#", count: 101), count: 101) | |
var x = 51 | |
var y = 51 | |
var xMin = 51 | |
var xMax = 51 | |
var yMin = 51 | |
var yMax = 51 | |
let dx = [1,0,-1,0] | |
let dy = [0,-1,0,1] | |
var direction = 0 | |
map[x][y] = "." | |
for cmd in cmd{ | |
if cmd == "F"{ | |
x += dx[direction] | |
y += dy[direction] | |
map[x][y] = "." | |
xMin = min(xMin, x) | |
xMax = max(xMax, x) | |
yMin = min(yMin, y) | |
yMax = max(yMax, y) | |
} | |
if cmd == "R"{ | |
direction += 1 | |
if direction>3{ | |
direction = 0 | |
} | |
continue | |
} | |
if cmd == "L"{ | |
direction -= 1 | |
if direction<0{ | |
direction = 3 | |
} | |
continue | |
} | |
} | |
for x in xMin...xMax{ | |
for y in yMin...yMax{ | |
print(map[x][y],terminator: "") | |
} | |
print("") | |
} |

'Problem Solving > BOJ' 카테고리의 다른 글
[1195] 킥다운 (1) | 2022.11.02 |
---|---|
[1915] 가장 큰 정사각형 (0) | 2022.11.01 |
[1388] 바닥 장식 (0) | 2022.10.31 |
[1063] 킹 (1) | 2022.10.28 |
[16920] 확장게임 (0) | 2022.10.26 |