Algorithm/시뮬레이션

BOJ#14503 로봇 청소기

밤이2209 2017. 4. 22. 15:01

BOJ#14503 로봇 청소기


* 문제



* 풀이

2017년 상반기 삼성전자 SW 역량테스트 기출문제입니다.
설명할 것이 없는 문제입니다. 문제 조건에 맞게 구현하시면 됩니다.



* 나의 코드



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
* BOJ#14503 로봇청소기
* https://www.acmicpc.net/problem/14503
*/

public class Main {

//static final int NORTH = 0;
//static final int EAST = 1;
//static final int SOUTH = 2;
//static final int WEST = 3;

static final int BLANK = 0;
static final int WALL = 1;
static final int CLEANED = 2;

static int[] dRow = {-1, 0, 1, 0};
static int[] dCol = {0, 1, 0, -1};

static int N, M;
static int[][] map = new int[51][51];

public static void main(String[] args) throws IOException {

int cRow, cCol;
int cDir;
int cnt = 0;

// input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());

st = new StringTokenizer(br.readLine());

cRow = Integer.parseInt(st.nextToken());
cCol = Integer.parseInt(st.nextToken());
cDir = Integer.parseInt(st.nextToken());

for (int i = 0; i < N; i++) {

st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {

map[i][j] = Integer.parseInt(st.nextToken());
}
}

// solve
while (true) {

// 1. 현재 위치를 청소한다
if (map[cRow][cCol] == BLANK) {

cnt++;
map[cRow][cCol] = CLEANED;
}

boolean ret = false;
// 2. 현재 방향에서 왼쪽 방향으로 탐색을 진행한다
for (int i = 0; i < 4; i++) {

int nextDir = (cDir - 1 + 4) % 4;
int nextRow = cRow + dRow[nextDir];
int nextCol = cCol + dCol[nextDir];

// 2-1.왼쪽방향에 아직 청소하지 않은 공간이 존재하면, 그 방향으로 회전한다음 한 칸을 전진하고 청소한다
if (map[nextRow][nextCol] == BLANK) {

cDir = nextDir;
cRow = nextRow;
cCol = nextCol;

ret = true;
break;
}
// 2-2. 그 방향에 청소할 방향이 없다면, 그 방향으로 그냥 회전한다
else {

cDir = nextDir;
}
}

if (!ret) {

// 2-4. 4방향 청소할 곳이 없고, 후진도 불가능한 경우 종료
if (map[cRow - dRow[cDir]][cCol - dCol[cDir]] == WALL) {

System.out.println(cnt);
break;
}
// 2-3. 4방향 청소할 곳이 없고 후진이 가능한 경우에 그냥 후진
else {

cRow = cRow - dRow[cDir];
cCol = cCol - dCol[cDir];
}
}

} // ~ while loop
}
}



'Algorithm > 시뮬레이션' 카테고리의 다른 글

BOJ#4920 테트리스 게임  (0) 2017.10.17
BOJ#11559 Puyo Puyo  (0) 2017.09.21
BOJ#3190 뱀  (5) 2017.04.15
BOJ#2931 가스관  (1) 2017.04.14
BOJ#10875 뱀  (0) 2017.04.14