study
지게차와 크레인[프로그래머스]
Date: 2026-05-31 17:07
Update: 2026-05-31 18:00
지게차와 크레인[프로그래머스]
접근법:
- 요청에 따라서 지게차를 쓸지 크레인을 쓸지 결정한다.
- 지게차를 쓸경우 대상이 외부에서 접근이 가능해야한다.
- 크레인을 쓸경우 어떤 위치이던간에 접근이 가능하다.
- 지게차의 경우 현재 칸이 외부에서 접근 가능한지 판별한다.
- 상하좌우를 살펴보고 창고의 경계선인지 확인한다. 경계선이라면 외부에서 접근 가능하다.
- 만약에 상하좌우가 바로 외부가아니라 창고의 비어있는 칸이라면 그 칸에 대하여 경계선여부를 판단한다.
- 이를 반복적으로 수행하여 결정한다.
- 이때, 배열에 순차적으로 접근하기때문에 순차적으로 접근하여 바로 문자를 없애면 외부와 통하는 길이 생길 수 도 있다.
- 그래서 배열에 저장한뒤 탐색이 끝난뒤 조건에 해당하는 컨테이너만 없앤다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
bool canPull(int x, int y, int n, int m, const vector<string>& storage, vector<vector<bool>>& visited)
{
visited[x][y] = true;
for(int i = 0; i < 4; ++i)
{
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= n || ny >= m)
{
return true;
} else if(storage[nx][ny] == '.' && !visited[nx][ny])
{
if(canPull(nx, ny, n, m, storage, visited))
return true;
}
}
return false;
}
int solution(vector<string> storage, vector<string> requests) {
int answer = 0;
int n = storage.size();
int m = storage[0].size();
int r = requests.size();
for(int i = 0; i < r; ++i)
{
char request = requests[i][0];
if(requests[i].size() == 1)
{
vector<pair<int, int>> canPullList;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m; ++j)
{
if(storage[i][j] == request)
{
vector<vector<bool>> visited(n, vector<bool>(m, false));
if(canPull(i, j, n, m, storage, visited))
{
canPullList.push_back({i, j});
}
}
}
}
for(int i = 0; i < canPullList.size(); ++i)
{
storage[canPullList[i].first][canPullList[i].second] = '.';
}
}
else
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m; ++j)
{
if(storage[i][j] == request)
{
storage[i][j] = '.';
}
}
}
}
}
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m; ++j)
{
if(storage[i][j] != '.')
{
// cout << storage[i][j];
answer++;
}
}
// cout << endl;
}
return answer;
}
.gif)