반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 사회조사분석사 2급 독학
- BFS
- 머신러닝
- 사회조사분석사 2급 필기 요약정리
- DFS
- 시물레이션
- 공모주
- 사회조사분석사 2급
- 벽부수고이동하기 파이썬
- 사회조사분석사2급실기신청꿀팁
- 공모주 청약
- 공모주청약
- 사회조사분석사 2급 기출문제집
- 현대엔지니어링 수요예측
- 사회조사분석사 2급 필기 공부방법
- 정렬
- 현대엔지니어링
- 백준
- 사회조사분석사 2급 공부방법
- 사회조사분석사2급실기신청
- 오미크론 자가격리
- 알고리즘
- 2월공모주
- 사회조사분석사 2급 필기 시험시간
- 그리디
- 백준 알고리즘
- 사이킷런
- 사회조사분석사 2급 접수
- 너비우선탐색
- 파이썬 정렬
Archives
- Today
- Total
세상을 바꾸는 데이터
[백준 14503번] 로봇청소기 - 파이썬 본문
문제 링크:
https://www.acmicpc.net/problem/14503
풀이 과정:
이 문제는 ★전형적인 시물레이션 문제★이다.
별도의 알고리즘이 필요하기보다는 문제에서 요구하는 내용을 오류 없이 성실하게 구현만 할 수 있다면 풀 수 있다.
<문제 풀이를 위한 테크닉>
1. 방향을 설정해서 이동하는 문제 유형에서는 dx, dy라는 별도의 리스트를 만들어 방향을 정하는 것이 효과적이다.
2. 리스트 컴프리헨션 문법을 이용해 2차원 리스트를 초기화하면 효율적이다.
풀이 코드:
# 14503번 로봇청소기
# 세로 크기와 가로 크기 입력받기
n, m = map(int, input().split())
# 로봇청소기 이동표시 여부 지도 생성
vaccum_move_map = [[0] * m for _ in range(n)]
# 로봇 청소기가 있는 칸의 좌표와 바라보는 방향 입력받기
x, y, direction = map(int, input().split())
# 현재 좌표 이동 처리
vaccum_move_map[x][y] = 1
# 지도 입력받기
vaccum_map = []
for i in range(n):
vaccum_map.append(list(map(int, input().split())))
# 북, 동, 남, 서의 좌표 위치 정의
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
# 로봇청소기 왼쪽으로 회전
def turn_left():
global direction
direction -= 1
if direction == -1:
direction = 3
# 처음 로봇청소기 위치 청소
cnt = 1
# 회전한 횟수
turn_time = 0
# 시물레이션 시작
while True:
# 왼쪽으로 회전
turn_left()
# 이동할려는 로봇청소기의 x, y 좌표
nx = x + dx[direction]
ny = y + dy[direction]
# 로봇청소기가 이동할려는 칸이 청소하지 않았으며 빈칸인 경우
if vaccum_move_map[nx][ny] == 0 and vaccum_map[nx][ny] == 0:
# 이동할려는 칸을 청소
vaccum_move_map[nx][ny] = 1
# 청소한 칸 추가
cnt += 1
# 로봇청소기 위치 이동
x, y = nx, ny
# 회전 횟수 초기화
turn_time = 0
continue
# 그 외의 경우 회전한 횟수 1 증가
else:
turn_time += 1
# 네 방향 모두 돌았을 때 청소할 구역이 없는 경우
if turn_time == 4:
# 후진하는 방향의 x, y 좌표
nx = x - dx[direction]
ny = y - dy[direction]
# 뒤쪽 방향으로 이동이 가능하다면
if vaccum_map[nx][ny] == 0:
x, y = nx, ny
# 그렇지 않다면
else:
break
turn_time = 0
# 정답 출력
print(cnt)
728x90
반응형
'PS Study > BOJ(백준)' 카테고리의 다른 글
[백준 2847번] 게임을 만든 동준이 - 파이썬 (45) | 2022.02.08 |
---|---|
(알고리즘 공부점검) [백준 1260번] DFS와 BFS - 파이썬 (33) | 2022.02.08 |
[백준 1783번] 병든 나이트 - 파이썬 (43) | 2022.02.07 |
[백준 1543번] 문서 검색 - 파이썬 (37) | 2022.02.07 |
[백준 1476번] 날짜 계산 - 파이썬 (27) | 2022.02.05 |
Comments