14503 로봇 청소기
본문 바로가기
알고리즘 모음집/New 알고리즘

14503 로봇 청소기

by KyeongMin 2020. 7. 22.
728x90
반응형

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
#define MAP_SIZE 51
int N, M;//행 열
int map[MAP_SIZE][MAP_SIZE];
int dy[] = { -1,0,1,0 };
int dx[] = { 0,1,0,-1 };
int y, x, dir;
bool safe(int y, int x) {
	return 0 <= y && y < N && 0 <= x && x < M;
}
void init() {
	scanf("%d %d", &N, &M);
	scanf("%d %d %d", &y, &x, &dir);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &map[i][j]);
		}
	}
}
void play() {
	int clean_room = 1;
	while (1) {// 무한 반복
		if (map[y][x] == 0) {//현재 위치를 청소한다.
			map[y][x] = ++clean_room;
		}
		//현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
		int i = 0;
		int cdir = dir;
		for (i = 0; i < 4; i++) {
			cdir--;
			if (cdir == -1)cdir = 3;
			if (safe(y + dy[cdir], x + dx[cdir]));
			//왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
			if (map[y + dy[cdir]][x + dx[cdir]]==0) {
				y = y + dy[cdir]; x = x + dx[cdir];
				dir = cdir;
				break;
			}
		}
		//왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
		if (i == 4) {
			//네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
			if (map[y - dy[dir]][x - dx[dir]] !=1) {
				y -= dy[dir]; x -= dx[dir];
			}
			else {
				break;
			}
			//네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
		}
		//로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.
	}
	cout << clean_room - 1<<endl;
}
int main(void) {
	init();
	play();
	return 0;
}


 

 여기서 포인트는 만약에 맵 상에서 체크하면서 가게 한다면 체크하는 변수의 초기값을 1로 해서

++변수 이렇게 하거나 2로해서 변수++하거나 해서 체크를 해줘야 합니다.

 

이게 무슨 소리지 하시는 분 들이 있는데 배열에 1이라는 벽이 있으니 그 벽이랑 숫자가 안겹치게 배열에

체크해준다 생각하시면 좀더 이해하기 쉽습니다. 

 

그리고 항상 조건에 맞게 시뮬은 주면 문제가 바로 풀리니 걱정하지마시고 최대한 구현력을 높이자.

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

15683 감시  (0) 2020.07.23
프로그래머스 숫자 야구  (0) 2020.07.22
프로그래머스 모의고사  (0) 2020.07.20
프로그래머스 소수찾기  (0) 2020.07.20
17070 파이프 옮기기1  (0) 2020.07.20

댓글