Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions 08/1325.c++
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#include <iostream>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>

using namespace std;
typedef pair<int,int> p;

//1. 컴퓨터들의 신뢰관계를 vector<vector<int>>에 저장하여 신뢰 방향을 알아볼 수 있도록 한다.
//2. 모든 컴퓨터를 한 번씩 해킹하여 각 컴퓨터에 따라 해킹할 수 있는 컴퓨터 수를 모두 구한다.
//3. 해킹할 수 있는 컴퓨터 수는 bfs 탐색을 통해 찾는다. (queue와 해킹 여부 bool vector 사용)
//4. 정렬하여 출력한다.

bool cmp(p& p1, p&p2){
if(p1.first!=p2.first){
return p1.first>p2.first;
}
return p1.second<p2.second;
}

int hack(int node, vector<vector<int>>&v, int n){ //bfs 탐색으로 해킹한다.
queue<int> q; //해킹된 컴퓨터를 queue에 저장한다. (해당 컴퓨터를 신뢰하는 다른 컴퓨터를 찾는 용도)
vector<bool> hacked(n+1, false); //해킹 여부를 bool vector에 저장한다.
q.push(node);
hacked[node]=true;
int cnt=1;
while(!q.empty()){
int node = q.front();
q.pop();
//해킹된 컴퓨터를 신뢰하는 모든 컴퓨터를 해킹한다.
for(const auto& next : v[node]){
if(!hacked[next]){
q.push(next);
hacked[next]=true;
cnt++;
}
}
}
return cnt;
}

int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);

int n, m;
cin >> n >> m;
vector<vector<int>> v(n+1,vector<int>(0));

//신뢰 방향이 있으므로, 신뢰 받는 컴퓨터 인덱스에 신뢰하는 컴퓨터를 value로 넣는다.
while(m--){
int a, b;
cin >> a >> b;
v[b].push_back(a);
}

vector<p> ans;
for(int i=n;i>0;i--){ //모든 컴퓨터를 한 번씩 해킹하여 전파된 컴퓨터 개수를 처음 해킹한 컴퓨터 번호와 함께 저장한다.
int h = hack(i,v,n);
ans.push_back({h,i});
}
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<ans.size();i++){
if(ans[i].first==ans[0].first){
cout << ans[i].second << " ";
}
}

return 0;
}
83 changes: 83 additions & 0 deletions 08/2615.c++
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#include <iostream>
#include <vector>

using namespace std;
typedef pair<int,int> p;

//1. 왼쪽-위부터 바둑돌이 놓아져 있는지 확인한다.
//2. 바둑돌을 발견한다면 그 바둑돌 기준으로 오른쪽, 아래, 오른쪽-아래, 왼쪽-아래에 같은 색 바둑돌이 있는지 확인한다.
//3. 같은색 바둑돌을 발견한다면 그 방향으로 정확히 5개의 바둑돌이 놓여져있는지 확인한다.
//4. 만약 5개의 바둑돌이 놓여져있다면, 처음으로 발견한 바둑돌 반대 방향에 같은 색 바둑돌이 있는지 확인한다. (6개가 아닌지 확인)

bool dfs(int color, int cnt, int r, int c, vector<vector<int>>& v, int ud, int rl){
int nr = r + ud;
int nc = c + rl;

if(nr>=0 && nc>=0 && nr<19 && nc<19 && v[nr][nc]==color){
cnt++;
return dfs(color, cnt, nr, nc, v, ud, rl);
}
else if(cnt==5) return true; //같은 방향으로 5번 나올시 승
return false;
}

void check(int color, int r, int c, vector<vector<int>>& v, p& ans){
//왼쪽-위에서부터 탐색하므로 오른쪽, 아래, 오른쪽-아래, 왼쪽-아래 대각선만 봐도 된다.
int n[4]={1,0,1,-1};
int m[4]={0,1,1,1};

for(int i=0;i<4;i++){
int nr = r + n[i];
int nc = c + m[i];

//연결된 같은색 바둑돌을 발견 시 같은 방향으로 dfs 탐색
if(nr>=0 && nc>=0 && nr<19 && nc<19 && v[nr][nc]==color){
if(dfs(color, 2, nr, nc, v, n[i],m[i])){
//5개 이상부터는 답이 아니므로 반대 방향 같은 색인지 확인
int pr = r-n[i];
int pc = c-m[i];
if(pr>=0&&pc>=0&&pr<19&&pc<19&&v[pr][pc]==color){
continue;
}
ans = make_pair(r,c);
break;
}
}
}
}

p find_win(vector<vector<int>>& v){ //왼쪽-위부터 바둑알 탐색
p ans={-1,-1};
for(int i=0;i<19;i++){
for(int j=0;j<19;j++){
if(v[i][j]==1){
check(1,i,j,v,ans);
}
else if(v[i][j]==2){
check(2,i,j,v,ans);
}
}
}
return ans;
}

int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);

vector<vector<int>> v(19,vector<int>(19,0));

for(int i=0;i<19;i++){
for(int j=0;j<19;j++){
cin >> v[i][j];
}
}
p ans = find_win(v);
if(ans!=make_pair(-1,-1)){
cout << v[ans.first][ans.second] << "\n";
cout << ans.first+1 << " " << ans.second+1;
}
else cout<<0;
return 0;
}
71 changes: 71 additions & 0 deletions 08/4963.c++
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#include <iostream>
#include <vector>
#include <queue>

using namespace std;
typedef pair<int,int> p;

const int VISITED = 2;

void bfs(int i, int j, int w, int h, vector<vector<int>>& v){
//상하좌우 대각선 한 칸씩
int n[8]={1, -1, 0, 0,1,1,-1,-1};
int m[8]={0, 0, 1, -1,1,-1,1,-1};

queue <p> q;
q.push({i,j});
v[i][j]=VISITED;

while(!q.empty()){
int r = q.front().first;
int c = q.front().second;
q.pop();

for(int i=0;i<8;i++){ //기준 칸의 상하좌우, 대각선 모두 보기
int nr = r+n[i];
int nc= c + m[i];

if(nr>=0 && nc>=0 && nr<h && nc<w && v[nr][nc]==1){
q.push({nr,nc});
v[nr][nc]=VISITED;
}
}
}
}

int cntIsland(int h, int w, vector<vector<int>> &v){
int cnt=0;
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
if(v[i][j]==1){ //섬 발견
cnt++; //섬 개수 ++;
bfs(i,j,w,h,v); //이어진 땅 찾기
}
}
}
return cnt;
}

int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
vector<vector<int>> v;
queue <p> q;

while(true){
int w, h;
cin >> w >> h;
if(w==0 && h==0) break; //0 0 입력시 종료

v.assign(h, vector<int> (w,0)); //땅 정보
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
cin >> v[i][j];
}
}
cout << cntIsland(h,w,v)<<"\n";
}

return 0;
}