Search
Duplicate

로봇 청소기

주차
0
문제번호
14503
언어
티어
골드
유형
구현
시뮬레이션
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

Memo

언뜻 보면 BFS 문제 같지만, stpe이 나눠져 있고 자신의 방향에 따라서 조사해야하는 곳이나 움직여야 하는 곳이 다르다는 점에서 로봇의 상태에 따른 코드를 작성하면 되겠다 생각이 들었습니다.
재귀적으로 문제를 풀어낼 수 있었습니다.
return (5)를 해준 이유는 step_two의 return type이 int이기 때문에 어쩔수 없이 아무 값이나 리턴해 주었습니다. 더 좋은 방법이 있다면 dm 부탁드립니다.

Code

(+ 2021/04/07 파이썬 코드로 다시 풀어봤습니다)
import sys N, M = map(int, input().split()) r, c, d = map(int, input().split()) dy = [-1, 0, 1, 0] #NESW dx = [0, 1, 0, -1] g_map = [] ans = 0 for i in range(N): g_map.append(list(map(int, sys.stdin.readline().split()))) visited = [[1 for _ in range(M)] for _ in range(N)] def get_left_index(d): return (d + 3) % 4 def get_back_index(d): return (d + 2) % 4 def operation(depth): global r, c, d, N, M, ans if (visited[r][c]): visited[r][c] = 0 #1 ans += 1 if (depth == 4): back_index = get_back_index(d) r += dy[back_index] c += dx[back_index] if (r < 0 or r >= N or c < 0 or c >= M or g_map[r][c]): return (0) return (1) d = get_left_index(d) ny = r + dy[d] nx = c + dx[d] if (ny < 0 or ny >= N or nx < 0 or nx >= M or g_map[ny][nx] or not visited[ny][nx]): return(operation(depth + 1)) r = ny c = nx return (1) while (operation(0)): pass print(ans)
Python
복사

제출 날짜

@3/18/2021

메모리

2020 KB

시간

0 ms
#include <iostream> int N, M; bool visited[51][51]; bool g_map[51][51]; int r_i, r_j, r_d; int ans; int step_two(int cnt); void input_faster() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } void input() { input_faster(); std::cin >> N >> M; std::cin >> r_i >> r_j >> r_d; for(int i = 0 ; i < N; i++) for(int j = 0 ; j < M ; j++) std::cin >> g_map[i][j]; ans = 0; } void step_one() { visited[r_i][r_j] = 1; ans++; step_two(0); } std::pair<int, int> step_two_left_direction(int i, int j) { if (r_d == 0)//북 return (std::make_pair(i, j - 1)); else if (r_d == 1)//동 return (std::make_pair(i - 1, j)); else if (r_d == 2)//남 return (std::make_pair(i, j + 1)); else//서 return (std::make_pair(i + 1, j)); } std::pair<int, int> step_two_back(int i, int j) { if (r_d == 0)//북 return (std::make_pair(i + 1, j)); else if (r_d == 1)//동 return (std::make_pair(i, j - 1)); else if (r_d == 2)//남 return (std::make_pair(i - 1, j)); else//서 return (std::make_pair(i, j + 1)); } void step_two_direction_left_change() { if (r_d == 0)//북 r_d = 3; else if (r_d == 1)//동 r_d = 0; else if (r_d == 2)//남 r_d = 1; else//서 r_d = 2; } int step_two(int cnt) { std::pair<int, int>left = step_two_left_direction(r_i, r_j); int dy = left.first; int dx = left.second; if (dy < 0 || dy >= N || dx < 0 || dx >= M || g_map[dy][dx] || visited[dy][dx]) { if (cnt == 4) { std::pair<int, int>back = step_two_back(r_i, r_j); dy = back.first; dx = back.second; if (dy < 0 || dy >= N || dx < 0 || dx >= M || g_map[dy][dx]) { std::cout << ans; return (5); } r_i = dy; r_j = dx; step_two(0); } else { step_two_direction_left_change(); step_two(cnt + 1); } } else { step_two_direction_left_change(); r_i = dy; r_j = dx; step_one(); } return (5); } void solve() { step_one(); } int main() { input(); solve(); return (0); }
C++
복사