문제 링크
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
문제


문제 풀이
# 세로 크기 n, 가로 크기 m
n, m = map(int, input().split())
# 방문 위치 저장
visited = [[0] * m for _ in range(n)]
# 로봇 청소기 좌표와 바라보는 방향
x, y, direction = map(int, input().split())
# 현재 좌표 방문 처리
visited[x][y] = 1
# 전체 맵
array = []
for i in range(n):
array.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
# 청소한 칸 수 (현재 위치 1번)
count = 1
# 회전 수
turn_time = 0
while True:
# 왼쪽으로 회전
turn_left()
nx = x + dx[direction]
ny = y + dy[direction]
# 이동하려는 칸이 청소하지 않았으며 빈칸일 경우
if visited[nx][ny] == 0 and array[nx][ny] == 0:
# 해당 칸 청소
visited[nx][ny] = 1
# 로봇 청소기 위치 이동
x, y = nx, ny
# 청소한 칸 수 증가
count += 1
# 회전 횟수 초기화
turn_time = 0
continue
# 그렇지 않을 경우, 회전한 횟수만 1 증가
else:
turn_time += 1
# 네 방향 모두 회전한 후 청소할 구역이 없을 경우
if turn_time == 4:
# 후진하는 방향의 x, y 좌표
nx = x - dx[direction]
ny = y - dy[direction]
# 후진이 가능하다면
if array[nx][ny] == 0:
x, y = nx, ny
# 그렇지 않다면
else:
break
turn_time = 0
# 정답 출력
print(count)
삼성 기출문제를 풀다보니 구현 문제가 많이 나오는데 봐도봐도 어렵다..
그래도 보다보니 비슷한 유형이 많이 보이는 것을 발견했다
그 중에서도 해당 유형에서의 가장 기초가 되는 문제가 이거였다!
dx, dy라는 리스트를 설정해서 x, y 좌표를 이동할 수 있도록 하는 것이 포인트!
visited = [[0] * m for _ in range(n)]
위의 문법으로 사용하는 것을 자연스럽게 블로그들을 보다 터득했는데,
정식 명칭은 리스트 컴프리헨션 문법이라고 한다.
위 코드는 리스트 컴프리헨션을 사용해서 2차원 리스트를 초기화하는 방법이다.
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 15686 치킨 배달 (파이썬 python) (0) | 2022.03.05 |
---|---|
[백준] 2178 미로 탐색(파이썬 python) (0) | 2022.02.28 |
[백준] 1476 날짜 계산 (파이썬 python) (0) | 2022.02.01 |
[백준] 11399 ATM (파이썬 python) (0) | 2022.02.01 |
[백준] 10610 30(파이썬 python) (0) | 2022.02.01 |
문제 링크
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
문제


문제 풀이
# 세로 크기 n, 가로 크기 m
n, m = map(int, input().split())
# 방문 위치 저장
visited = [[0] * m for _ in range(n)]
# 로봇 청소기 좌표와 바라보는 방향
x, y, direction = map(int, input().split())
# 현재 좌표 방문 처리
visited[x][y] = 1
# 전체 맵
array = []
for i in range(n):
array.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
# 청소한 칸 수 (현재 위치 1번)
count = 1
# 회전 수
turn_time = 0
while True:
# 왼쪽으로 회전
turn_left()
nx = x + dx[direction]
ny = y + dy[direction]
# 이동하려는 칸이 청소하지 않았으며 빈칸일 경우
if visited[nx][ny] == 0 and array[nx][ny] == 0:
# 해당 칸 청소
visited[nx][ny] = 1
# 로봇 청소기 위치 이동
x, y = nx, ny
# 청소한 칸 수 증가
count += 1
# 회전 횟수 초기화
turn_time = 0
continue
# 그렇지 않을 경우, 회전한 횟수만 1 증가
else:
turn_time += 1
# 네 방향 모두 회전한 후 청소할 구역이 없을 경우
if turn_time == 4:
# 후진하는 방향의 x, y 좌표
nx = x - dx[direction]
ny = y - dy[direction]
# 후진이 가능하다면
if array[nx][ny] == 0:
x, y = nx, ny
# 그렇지 않다면
else:
break
turn_time = 0
# 정답 출력
print(count)
삼성 기출문제를 풀다보니 구현 문제가 많이 나오는데 봐도봐도 어렵다..
그래도 보다보니 비슷한 유형이 많이 보이는 것을 발견했다
그 중에서도 해당 유형에서의 가장 기초가 되는 문제가 이거였다!
dx, dy라는 리스트를 설정해서 x, y 좌표를 이동할 수 있도록 하는 것이 포인트!
visited = [[0] * m for _ in range(n)]
위의 문법으로 사용하는 것을 자연스럽게 블로그들을 보다 터득했는데,
정식 명칭은 리스트 컴프리헨션 문법이라고 한다.
위 코드는 리스트 컴프리헨션을 사용해서 2차원 리스트를 초기화하는 방법이다.
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 15686 치킨 배달 (파이썬 python) (0) | 2022.03.05 |
---|---|
[백준] 2178 미로 탐색(파이썬 python) (0) | 2022.02.28 |
[백준] 1476 날짜 계산 (파이썬 python) (0) | 2022.02.01 |
[백준] 11399 ATM (파이썬 python) (0) | 2022.02.01 |
[백준] 10610 30(파이썬 python) (0) | 2022.02.01 |