반응형
문제 링크 : https://www.acmicpc.net/problem/14503
난이도 : 하
* 문제에서 방향을 북동남서 순서로 줬는데, 북서남동으로 풀어서 헤맴..
1. 북,동,남,서 방향으로 한 칸을 움직일 때의 인덱스 변화를 vector<pair<int,int>> dirs;에 저장해 두고(setDir()부분) 인덱스를 계산함
2. 문제의 지시대로 로봇 청소기의 움직임을 cleanNext에 구현
/* 로봇 청소기 */
#include <iostream>
#include <stdio.h>
#include <vector>
#define FOR(i, n) for(int i = 0 ; i < n ; i ++)
using namespace std;
int n, m, r, c, d, rslt;
int board[52][52];
//direction 0: 북, 1:동, 2:남, 3:서 /* 북동남서로 주어졌는데 방향을 거꾸로 보고함... 계속 2%에서 걸림!*/
vector<pair<int,int>> dirs;
void printBoard() {
FOR(i, n) {
FOR(j, m)
printf("%d ", board[i][j]);
cout << endl;
}
}
void setDir() {
dirs.push_back(make_pair(-1, 0));
dirs.push_back(make_pair(0, 1));
dirs.push_back(make_pair(1, 0));
dirs.push_back(make_pair(0, -1));
}
int leftDir(int d) {
if (d == 0) return 3;
else return (d - 1);
}
void getInput() {
// get Input
scanf("%d %d", &n, &m);
scanf("%d %d %d", &r, &c, &d);
FOR(i, n)
FOR(j, m)
cin >> board[i+1][j+1];
}
void cleanNext(int r, int c, int d, int allDir) {
if (board[r][c] == 0) {
rslt++;
board[r][c] = 2;
}
// 왼쪽 방향으로 회전하고 하나 전진했을 때 위치
int r2 = r + dirs[leftDir(d)].first;
int c2 = c + dirs[leftDir(d)].second;
// 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
if (board[r2][c2] == 0)
return cleanNext(r2, c2, leftDir(d), 0);
// 왼쪽 방향이 벽이거나 이미 청소되어있으면
// 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
else if(allDir == 3) {
d = leftDir(d);
// 방향을 유지하면서 후진했을 때의 위치
int r3 = r - dirs[d].first;
int c3 = c - dirs[d].second;
//후진도 못하는 경우에는 작동을 멈춤
if (board[r3][c3] == 1) return;
else return cleanNext(r3, c3, d, 0);
}
// 아직 네 방향 다 본 건 아니면 왼쪽 방향으로 회전하고 2번으로 돌아간다.
else
return cleanNext(r, c, leftDir(d), allDir + 1);
}
int main() {
rslt = 0;
getInput();
setDir();
cleanNext(r+1, c+1, d, 0);
// printBoard();
cout << rslt << endl;
return 0;
}
반응형
'알고리즘 > 삼성sw역량테스트 기출' 카테고리의 다른 글
삼성 SW 역량테스트 기출 :: 연구소 (0) | 2018.04.09 |
---|---|
삼성 SW 역량테스트 기출 :: 퇴사 (0) | 2018.04.09 |
삼성 SW 역량테스트 기출 :: 연산자 끼워넣기 (0) | 2018.04.09 |
삼성 SW 역량테스트 기출 :: 경사로 (0) | 2018.04.09 |