코테/프로그래머스
[프로그래머스]퍼즐조각 채우기(BFS)
길용쓰
2023. 3. 2. 17:32
https://school.programmers.co.kr/learn/courses/30/lessons/84021
왼쪽 board의 빈칸에 table의 블럭을 최대 몇칸 넣을 수 있는지 구하는 문제
단 빈칸과 블럭의 모양은 동일해야 한다 (회전 가능, 대칭 불가)
첫번째 접근 - 빈칸을 연결된 빈칸 수로 나타내봄
board를 순서대로 bfs로 탐색,
ㄱ과 같은 모양은 121,
ㅗ과 같은 모양은 1311
ㅁ 모양은 2222
반례가 바로 떠오를정도로 허접했지만 의외로 테케 절반정도를 통과했다
위 방식으로 3칸 블럭까진 구별이 가능하고,
대칭을 무시하면 4칸까지 구별 가능하다
ㅡ = 1111 = 4
ㅁ = 2222 = 8
ㄴ = 1121 / 1211 / 2111 = 5
ㄹ = 1221 / 2121 / 2211 = 6
ㅗ = 1311 = 6
합으로 구분한뒤 3이 있으면 ㅗ 아니면 ㄹ
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
int n;
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
vector<vector<int>> g;
vector<vector<int>> t;
int solution(vector<vector<int>> game_board, vector<vector<int>> table) {
int answer = 0;
int n = game_board.size();
for(int y=0 ; y<n ; y++){
for(int x=0 ; x<n ; x++){
if(game_board[y][x]==0){
game_board[y][x]=2;
queue<pair<int,int>> q;
vector<int> qq;
q.push({y,x});
while(!q.empty()){
int y1 = q.front().first;
int x1 = q.front().second;
q.pop();
int zz=0;
for(int i=0 ; i<4 ; i++){
int ny = y1+dy[i];
int nx = x1+dx[i];
if (nx>-1 && ny>-1 && nx<n && ny<n){
if(game_board[ny][nx]!=1 )
zz++;
}
}
qq.push_back(zz);
for(int i=0 ; i<4 ; i++){
int ny = y1+dy[i];
int nx = x1+dx[i];
if (nx>-1 && ny>-1 && nx<n && ny<n){
if(game_board[ny][nx]==0 ){
game_board[ny][nx]=2;
q.push({ny,nx});
}
}
}
}
g.push_back(qq);
}
}
}
for(int y=0 ; y<n ; y++){
for(int x=0 ; x<n ; x++){
if(table[y][x]==1){
table[y][x]=2;
queue<pair<int,int>> q;
vector<int> qq;
q.push({y,x});
while(!q.empty()){
int y1 = q.front().first;
int x1 = q.front().second;
q.pop();
int zz=0;
for(int i=0 ; i<4 ; i++){
int ny = y1+dy[i];
int nx = x1+dx[i];
if (nx>-1 && ny>-1 && nx<n && ny<n){
if(table[ny][nx]!=0 )
zz++;
}
}
qq.push_back(zz);
for(int i=0 ; i<4 ; i++){
int ny = y1+dy[i];
int nx = x1+dx[i];
if (nx>-1 && ny>-1 && nx<n && ny<n){
if(table[ny][nx]==1 ){
table[ny][nx]=2;
q.push({ny,nx});
}
}
}
}
t.push_back(qq);
}
}
}
int counts = 0;
for(int y=0 ; y<n ; y++){
for(int x=0 ; x<n ; x++){
if(game_board[y][x]!=1)
counts++;
}
}
cout<<counts<<"\n";
for(int y=0 ; y<g.size() ; y++){
for(int x=0 ; x<g[y].size() ; x++){
cout<<g[y][x]<<" ";
}
cout<<"\n";
}
for(int y=0 ; y<t.size() ; y++){
for(int x=0 ; x<t[y].size() ; x++){
cout<<t[y][x]<<" ";
}
cout<<"\n";
}
for(int x=0 ; x<g.size() ; x++){
for(int y=0 ; y<t.size() ; y++){
if(g[x]==t[y]){
cout<<"aa"<<g[x].size()<<"\n";
answer += g[x].size();
cout<<"answer"<<answer<<"\n";
g[x]={-1};
t[y]={-2};
}
}
}
return answer;
}
코드 백업