티스토리 뷰
백준 1347번: 미로 만들기 (파이썬 풀이)
문제 개요
백준 1347번 "미로 만들기" 문제는 홍준이가 이동한 경로를 따라 최소한의 직사각형 미로 지도를 생성하는 문제입니다. 홍준이는 처음 **남쪽**을 바라보고 있으며, 주어진 명령에 따라 움직입니다. 그가 지나간 모든 칸은 '.'으로, 그렇지 않은 칸은 '#'으로 표시해야 합니다.
핵심 아이디어
이 문제를 해결하기 위해 다음과 같은 단계별 접근을 사용합니다.
1. 방향 및 좌표 관리
홍준이의 방향을 인덱스로 관리하고, 각 방향에 따른 좌표 변화량을 배열에 저장합니다. 홍준이는 처음 남쪽을 바라보므로, 이를 인덱스 0으로 설정하여 방향을 순환시킵니다.
북 (index = 2) (0,-1) 서 (index = 1) 동 (index = 3) (-1,0) (1,0) 남 (index = 0) (0,1)
- dx, dy 배열: `dx = [0, -1, 0, 1]`, `dy = [1, 0, -1, 0]`
- 회전: 'R' 명령은 `index`를 1 증가시키고, 'L' 명령은 1 감소시킵니다. 인덱스가 0~3 범위를 벗어나지 않도록 모듈러 연산으로 처리합니다.
2. 이동 경로 시뮬레이션 및 기록
주어진 입력 문자열을 순회하며 홍준이의 이동을 시뮬레이션합니다. 'F' 명령 시 현재 방향에 맞게 좌표를 업데이트하고, 방문한 모든 좌표를 리스트에 기록합니다.
3. 미로 크기 결정 및 좌표 보정
기록된 모든 좌표를 탐색하여 최소 x, 최대 x, 최소 y, 최대 y 값을 찾습니다. 이 값들을 이용해 미로의 가로, 세로 길이를 결정합니다. 이 때, 음수 좌표가 배열 인덱스로 사용될 수 없으므로, 모든 좌표를 최소 x, 최소 y 값만큼 이동시켜 0 이상의 값으로 보정합니다.
4. 미로 지도 생성 및 출력
계산된 크기의 2차원 리스트를 생성하고, 기본값을 '#'으로 채웁니다. 이후, 보정된 방문 좌표에 해당하는 칸을 '.'으로 변경합니다. 마지막으로, 완성된 미로를 한 줄씩 출력합니다.
전체 코드 (Python)
N = int(input())
st = input()
arr = []
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
index = 0
current = [0, 0]
min_x = 0
max_x = 0
min_y = 0
max_y = 0
arr.append([current[0], current[1]])
for i in st:
if i == 'R':
if index == 3:
index = 0
else:
index += 1
elif i == 'L':
if index == 0:
index = 3
else:
index -= 1
elif i == 'F':
current[0] = current[0] + dx[index]
current[1] = current[1] + dy[index]
arr.append([current[0], current[1]])
if current[0] > max_x:
max_x = current[0]
if current[0] < min_x:
min_x = current[0]
if current[1] > max_y:
max_y = current[1]
if current[1] < min_y:
min_y = current[1]
col = max_x - min_x + 1
row = max_y - min_y + 1
miro = [['#' for _ in range(col)] for _ in range(row)]
for i in range(len(arr)):
x = arr[i][0] - min_x
y = arr[i][1] - min_y
miro[y][x] = '.'
for i in range(row):
a = ''
for j in range(col):
a += miro[i][j]
print(a)
코드 해설
dx, dy
: 남(0), 서(1), 북(2), 동(3) 순서의 방향 벡터를 저장합니다.current
: 홍준이의 현재 좌표를 나타내는 리스트입니다.arr
: 홍준이가 방문한 모든 좌표를 기록하는 리스트입니다.min_x, max_x, min_y, max_y
: 시뮬레이션 중 방문한 좌표의 최소/최대 값을 실시간으로 업데이트합니다.- `for i in st:`: 입력 문자열을 순회하며 'R', 'L', 'F' 명령을 처리합니다. 'F' 명령 시 현재 좌표를 업데이트하고 `arr`에 추가합니다.
- `col`과 `row`: 최소/최대 좌표를 이용해 필요한 미로의 크기를 계산합니다.
- `miro = [['#'] * col for _ in range(row)]`: 미로 지도를 `#`로 초기화합니다.
- `for i in range(len(arr))`: `arr`에 저장된 모든 좌표를 순회하며 `.으로` 표시합니다. 이때 `min_x`, `min_y`를 빼서 **좌표를 보정**합니다.
- 최종적으로 이중 루프를 통해 완성된 미로를 출력합니다.
'백준 스터디' 카테고리의 다른 글
백준 17266번: 어두운 굴다리 (python 풀이) (3) | 2025.08.26 |
---|---|
백준 17266번: 어두운 굴다리 (C++ 풀이) (1) | 2025.08.26 |
백준 1347번 미로 만들기 C++ (2) | 2025.08.25 |
백준 2885번: 초콜릿 식사 (파이썬 (0) | 2025.08.24 |
백준 2885번: 초콜릿 식사 (C++) (0) | 2025.08.24 |
- Total
- Today
- Yesterday
- 백준
- 프로그래밍
- 동적계획법
- 객체지향
- 문제 풀이
- 알고리즘문제풀이
- Python
- C++
- dfs
- 그리디알고리즘
- C++ 알고리즘
- c언어
- c++알고리즘
- 문자열처리
- 알고리즘기초
- 파이썬코딩
- 인접 행렬
- python 알고리즘
- DP
- 동적 계획법
- 브루트포스
- 코딩 테스트
- 코딩테스트
- 알고리즘 문제풀이
- 문제풀이
- 그래프 탐색
- 파이썬
- 코딩
- 그리디
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |