<aside>
💬 lv1
, 행렬
과학 연구소에서는 로봇 청소기를 개발하고 있습니다. 이 로봇 청소기는 특정한 크기의 방 안에서 주어진 경로를 따라 움직입니다. 방의 크기는 MxN 행렬로 표현되며, 각 칸은 청소가 필요한 상태(1) 또는 이미 청소된 상태(0)로 표시됩니다. 로봇 청소기는 (0,0)에서 출발하여, 주어진 경로에 따라 움직이며 청소를 진행합니다. 경로가 끝날 때, 로봇이 청소한 칸의 수를 반환하는 코드를 작성해주세요.
입력 (방 상태, 경로) | 출력 (청소한 칸의 수) |
---|---|
([[1,1,0,0], [0,1,1,1], [1,0,0,1]], "RDDRUL") | 4 |
로봇이 "RDDRUL" 경로에 따라 움직이면, 총 5개의 칸을 청소합니다. 경로에 따라 청소한 칸의 수를 반환합니다.
</aside>
def solution(data):
room, path = data **#1 입력 데이터 처리**
rows, cols = len(room), len(room[0]) **#2 초기 변수 설정**
directions = {"U": (-1, 0), "D": (1, 0), "L": (0, -1), "R": (0, 1)}
cleaned_count = 0
x, y = 0, 0
if room[0][0] == 1: **#3 첫번째 칸 청소 여부 확인**
cleaned_count += 1
room[0][0] = 0
for step in path: **#4 이동 경로를 따라 청소 실행**
dx, dy = directions[step]
nx, ny = x + dx, y + dy
# 경로가 방 안에 있고, 아직 청소되지 않은 칸이라면 청소
if 0 <= nx < rows and 0 <= ny < cols and room[nx][ny] == 1:
cleaned_count += 1
room[nx][ny] = 0 # 청소된 상태로 표시
# 로봇 위치 업데이트
if 0 <= nx < rows and 0 <= ny < cols:
x, y = nx, ny
return cleaned_count **#5 결과 반환**
입력 데이터 처리
방의 상태와 로봇의 이동 경로를 입력데이터를 통해 각각 할당해준다. 즉 room
에는 방의 상태가, path
에는 이동할 경로가 할당된다.
초기 변수 설정
방의 크기(행과 열), 이동 방향, 청소한 칸의 수, 로봇의 초기 위치를 설정한다.
행과 열은 같을수도 / 같지 않을수도 있으므로 cols
는 행 하나의 길이값을 기준으로 정한다.
”U”
인 경우 행 하나만큼 줄어들고, "D"
인 경우 행 하나만큼 늘어난다. 같은 방식으로 "L", "R"
에 해당하는 좌표값을 directions
에 지정해준다.
첫번째 칸 청소 여부 확인
로봇이 시작 위치에서 청소가 필요한 경우, 청소를 수행한다.
이동 경로를 따라 청소 실행
로봇이 이동 경로를 따라 이동하면서 청소가 필요한 칸을 청소.
dx, dy = directions[step]
→ path
의 각 요소 step
을 아까 생성해주었던 directions
의 키 값으로 대입하고, 해당하는 값을 dx, dy
에 할당해준다.nx, ny = x + dx, y + dy
→ 현재 좌표(x, y
)값과 step
의 좌표 dx, dy
를 더해준다.nx
의 값이 row
보다 작고, ny
의 값이 cols
보다 작고, 현재좌표+ step
의 좌표값인 dx, dy
의 값이 1이라면 → cleaned_count
의 값을 1 추가해준뒤 0으로 변경해준다.x, y
값에 이동한 후의 값 nx, ny
를 재할당시켜준다.결과 반환
로봇이 청소한 칸의 총 갯수를 반환해준다.
1차원 배열
x[0][1]
→ x의 0번째 인덱스의 1번째 인덱스 → x의 0행 1열에 해당하는 값딕셔너리
기본 형태: { key : value}
개념: { 키 : 값 }
의 형태로 데이터를 저장하는 순회가능한 자료구조이며, 키 값은 중복될 수 없다.
해당 예제에서는 청소기의 이동 방향(’U’, ‘D’, ‘L’, ‘R’)과 해당 방향으로 이동할때의 행과 열 변화량을 매핑하는데에 사용되었다.
조건문과 반복문
if
는 주어진 조건이 “참”인지 “거짓”인지에 따라 코드의 실행 흐름을 제어한다.