[Programmers] 리틀 프렌즈 사천성
Date:
[Programmers] 리틀 프렌즈 사천성
Problem URL : 리틀 프렌즈 사천성
#include <string>
#include <vector>
#include <map>
#define p pair<int, int>
using namespace std;
bool connectable(vector<string> &board, int x1, int y1, int x2, int y2) {
if(x1 == x2) {
if(y1 > y2) {
swap(y1, y2);
}
for(int i = y1 + 1; i < y2; i++) {
if(board[x1][i] != '.') {
return false;
}
}
return true;
}else if(y1 == y2) {
if(x1 > x2) {
swap(x1, x2);
}
for(int i = x1 + 1; i < x2; i++) {
if(board[i][y1] != '.') {
return false;
}
}
return true;
}else {
int dx = x2 > x1 ? 1 : -1;
int dy = y2 > y1 ? 1 : -1;
bool x = true;
for(int i = x1 + dx; i != x2 + dx; i += dx) {
if(board[i][y1] != '.'){
x = false;
break;
}
}
if(x) {
bool y = true;
for(int i = y1 + dy; i != y2; i += dy) {
if(board[x2][i] != '.'){
y = false;
break;
}
}
if(y) {
return true;
}
}
for(int i = y1 + dy; i != y2 + dy; i += dy) {
if(board[x1][i] != '.'){
return false;
}
}
for(int i = x1 + dx; i != x2; i += dx) {
if(board[i][y2] != '.'){
return false;
}
}
return true;
}
}
// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
string solution(int m, int n, vector<string> board) {
string answer = "";
map<char, vector<p>> M;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(board[i][j] != '.' && board[i][j] != '*') {
vector<p> tmp = M[board[i][j]];
tmp.push_back({i,j});
M[board[i][j]] = tmp;
}
}
}
int size = M.size();
int cnt = 0;
for(int i = 0; i < size; i++) {
for(auto j : M) {
if(connectable(board, j.second[0].first, j.second[0].second, j.second[1].first, j.second[1].second)) {
answer += j.first;
M.erase(j.first);
board[j.second[0].first][j.second[0].second] = '.';
board[j.second[1].first][j.second[1].second] = '.';
cnt++;
break;
}
}
}
if(cnt == size) {
return answer;
}else{
return "IMPOSSIBLE";
}
}
Comments
connectable을 좀더 깔끔하게 짜고 싶다 ㅠ
댓글