티스토리 뷰
반응형
7/26(수) 제출
뒤쪽 칸을 후진할 수 있는지만 체크하고 벽인지 체크하지 않아서 2차 제출만에 성공 (114488kb, 136ms)
import sys
def check4direction(matrix, r, c):
for i in range(4):
if 0 <= r+dx[i] < N and 0 <= c+dy[i] < M and matrix[r+dx[i]][c+dy[i]] == 0:
return False # 청소 안 되어 있음
return True
input = sys.stdin.readline
N, M = map(int, input().split())
r, c, d = map(int, input().split())
dx, dy = [-1, 0, 1, 0], [0, 1, 0, -1]
answer = 0
matrix = [list(map(int, input().split())) for _ in range(N)]
while True:
# 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
if matrix[r][c] == 0:
answer += 1
matrix[r][c] = 2
else:
# 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
if not check4direction(matrix, r, c):
# 반시계 방향으로 90도 회전한다.
d = 3 if d == 0 else d-1
# 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
if 0 <= r+dx[d] < N and 0 <= c+dy[d] < M and matrix[r+dx[d]][c+dy[d]] == 0:
r, c = r+dx[d], c+dy[d]
# 1번으로 돌아간다.
# 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
else:
# 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
if 0 <= r-dx[d] < N and 0 <= c-dy[d] < M and matrix[r-dx[d]][c-dy[d]] != 1:
r, c = r-dx[d], c-dy[d]
# 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
elif not (0 <= r-dx[d] < N and 0 <= c-dy[d] < M)\
or (0 <= r-dx[d] < N and 0 <= c-dy[d] < M and matrix[r-dx[d]][c-dy[d]] == 1):
print(answer)
break
9/12(화) 제출
3차 제출: (25분 소요) 113112kb, 116ms
과거 코드와의 차이
- 주변 4칸을 청소할 수 있는지 함수로 빼지 않고 그냥 써내려감
- 벽을 미리 만들어서 범위 체크를 하지 않아도 되게 만듬
- 탐색만 하면 되므로 input 받을때 string 그대로 받음
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
r, c, d = map(int, input().split())
DIRTY, WALL, CLEAN = '0', '1', '2'
dt = ((-1,0),(0,1),(1,0),(0,-1)) # ^ > v <
matrix = [[WALL]*(M+2)] + [[WALL] + list(input().split()) + [WALL] for _ in range(N)] + [[WALL]*(M+2)]
answer = 0
r, c = r+1, c+1
while True:
# 1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
if matrix[r][c] == DIRTY:
matrix[r][c] = CLEAN
answer += 1
# 3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
for dx, dy in dt:
if matrix[r+dx][c+dy] == DIRTY:
# 반시계 방향으로 90도 회전한다.
d = (d-1)%4
# 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
dx, dy = dt[d]
if matrix[r+dx][c+dy] == DIRTY:
r, c = r+dx, c+dy
# 1번으로 돌아간다.
break
# 2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
else:
# 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
dx, dy = dt[d]
if matrix[r-dx][c-dy] != WALL:
r, c = r-dx, c-dy
# 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
else: break
print(answer)
반응형
'IT > Python' 카테고리의 다른 글
[코드트리] 술래잡기 - 파이썬 (0) | 2023.09.13 |
---|---|
[백준] 20327 배열 돌리기 6 - 파이썬 (1) | 2023.09.12 |
퀵 정렬 / 병합 정렬 (0) | 2023.09.12 |
[Python] M1 Mac에서 Konlpy 오류 (0) | 2022.10.04 |
[Plotly] Choropleth Map(코로플레스 맵) 그리기 (0) | 2022.04.06 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- polyfill
- Polygon
- react
- architecting
- 블로그플랫폼
- wkt
- Plotly
- 렌더트리
- choropleth
- 도커컨테이너
- svelte
- cssom
- DOM
- 카이제곱검정
- konlpy
- SCSA
- GeoPolygon
- graphql
- aws
- submodule
- 역량테스트
- 삼전
- docker
- 삼성
- 삼성전자
- SW역량테스트
- Python
- ReactDOM
- tsconfig
- Next.js
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함