코딩테스트/C++
[프로그래머스 Level 3] 아이템 줍기 (C++)
최-코드
2024. 11. 17. 13:32
https://school.programmers.co.kr/learn/courses/30/lessons/87694
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
특정 좌표에서 이동을 bfs를 이용했다. 동서남북으로 이동할 수 있도록 만들었고, 이 때 도형 내부와 외부에 들어갔을 때를 대비해 도형 내부와 도형 테두리에 대해 bool 타입 변수를 선언하여 이동한 좌표가 도형 내부이거나 테두리가 아닐 경우 queue에 안 넣는 방식으로 진행했다. 구현을 완료하고 테스트해보니 이상한 값이 나와 살펴보던 중, 아래 사진과 같이 길이가 테두리를 통해 이동하지 않고 한 칸 위로 건너 뛰었는데 테두리인 경우에도 bfs가 통과되는 것을 발견했다. 이를 위해 중간에 중간에 0.5 값을 줘야겠다 생각했는데 배열에 소수값을 줄 수 없어 좌표 평면을 2배씩 확장하여 이 문제를 해결했더니 문제가 풀렸다.
#include <queue>
using namespace std;
bool edge[101][101];
bool interior[101][101];
bool checked[101][101];
int moveX[4] = {1,-1,0,0};
int moveY[4] = {0,0,1,-1};
queue<pair<int, pair<int, int>>> q;
int bfs(int x, int y, int a, int b) {
q.push({0, {x,y}});
checked[x][y]=true;
while(!q.empty()){
int val = q.front().first;
int nodeX = q.front().second.first;
int nodeY = q.front().second.second;
q.pop();
if(nodeX==a && nodeY==b){
return val;
}
for(int i = 0; i<4; i++){
int newX = nodeX+moveX[i];
int newY = nodeY+moveY[i];
if(checked[newX][newY]||(interior[newX][newY]||!edge[newX][newY])){
continue;
}
checked[newX][newY]=true;
q.push({val+1, {newX, newY}});
}
}
return 0;
}
int solution(vector<vector<int>> rectangle, int characterX, int characterY, int itemX, int itemY) {
int answer = 0;
for(int i = 0 ; i< rectangle.size(); i++){
for(int m = rectangle[i][1]*2; m<=rectangle[i][3]*2; m++){
for(int n = rectangle[i][0]*2; n<=rectangle[i][2]*2; n++){
if(n==rectangle[i][0]*2 || n==rectangle[i][2]*2 ||
m==rectangle[i][1]*2 || m==rectangle[i][3]*2){
edge[n][m] = true;
}else {
interior[n][m]=true;
}
}
}
}
answer = bfs(characterX*2, characterY*2, itemX*2, itemY*2)/2;
return answer;
}