<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는 주어진 조건이 “참”인지 “거짓”인지에 따라 코드의 실행 흐름을 제어한다.