프로그래머스 - 그래프(가장 먼 노드, 순위, 방의 개수)
업데이트:
문제 링크 - https://programmers.co.kr/learn/courses/30/parts/14393
👀문제이해 및 풀이방법
그래프 문제이다 자신있는 유형인데 문제가 어려웠던 건지 또 막혔다 ㅠㅠ 백준 좀더 풀면서 복습할 예정이다
1번문제는 비교적 간단하게 bfs로 풀었다 각 노드에 1번노드 부터의 거리를 저장하고 그때마다 최대 거리를 갱신하며 마지막에 최대거리와 같은 노드들을 세어주면 되는 문제였다
2번 문제는 아직도 이해가 잘 안된다 결국 검색해서 플로이드 와셜 문제라는 것을 알고 풀었는데 이게 왜.. 라는 생각이 들고 나중에 비슷한 문제가 나왔을 때 못풀것 같은 느낌이 들었다 처음에는 set을 이용해 각 노드의 위 아래 순위를 다 체크하면서 풀어보려고 했는데 어딘가 빠트린게 있는지 잘 풀리지 않았다
3번 문제는 가장 난이도가 높다고 하는데 그렇게까지 어렵지는 않았다 대각으로 겹치는 부분을 체크하기 위해 각 이동을 2번씩 시키는 것을 캐치한다면 금방 이해할 수 있다. 일단 그린 선분과 도달한 정점들을 저장해 두고 선분이 지나간적 없는 선분이면서 정점이 이미 갔던 정점이라면 sol++; 해주면 되었다
이로서 프로그래머스 문제들은 마무리를 지었고 내일 level테스트를 좀 보고 앞으로는 백준위주로 공부하게 될것 같다👍
📝코드
1 가장 먼 노드
#include <string>
#include <vector>
#include <queue>
using namespace std;
struct _node{
int dis;
vector<int> connect;
};
class test1{
private:
vector<_node> graph;
int N;
public:
test1(int n):N(n){
graph.resize(N+1,{-1,});
graph[1].dis=0;
}
void set_connect(vector<vector<int>>& edge){
for(int i=0;i<edge.size();i++){
graph[edge[i][0]].connect.push_back(edge[i][1]);
graph[edge[i][1]].connect.push_back(edge[i][0]);
}
}
int find_sol(){
int M=0;
queue<pair<int,int>> q;
q.push({1,0});
pair<int,int> cur;
while(!q.empty()){
cur = q.front();
q.pop();
M=max(cur.second,M);
for(int i : graph[cur.first].connect){
if(graph[i].dis==-1){
graph[i].dis=cur.second+1;
q.push({i,cur.second+1});
}
}
}
int sol=0;
for(int i=1;i<graph.size();i++){
if(graph[i].dis==M)
sol++;
}
return sol;
}
};
int solution(int n, vector<vector<int>> edge) {
test1 t1(n);
t1.set_connect(edge);
return t1.find_sol();
}
2 순위
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int solution(int n, vector<vector<int>> results) {
int answer =0;
vector<vector<bool>> graph(n+1,vector<bool>(n+1,false));
for(auto i : results)
graph[i[0]][i[1]]=true;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int l=0;l<=n;l++){
if(graph[j][i] && graph[i][l])
graph[j][l]=true;
}
}
}
for(int i=1;i<=n;i++){
int cnt =0;
for(int j=1;j<=n;j++)
if(graph[i][j] || graph[j][i])
cnt++;
if(cnt==n-1)
answer++;
}
return answer;
}
3 방의 개수
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
class structnum{
private:
vector<int> arrows;
public:
structnum(vector<int>& a):arrows(a){
}
int find_sol(){
int sol=0;
map<pair<int,int>,bool> point;
map<pair<pair<int,int>,pair<int,int>>,bool> M;
int x=0,y=0;
int nx,ny;
point[{x,y}]=true;
for(int i : arrows){
for(int j=0;j<2;j++){
nx=x+dx[i],ny=y+dy[i];
if(!M[{x,y},{nx,ny}]){
M[{x,y},{nx,ny}]=true;
M[{nx,ny},{x,y}]=true;
if(point[{nx,ny}])
sol++;
}
point[{nx,ny}]=true;
x=nx,y=ny;
}
}
return sol;
}
};
int solution(vector<int> arrows) {
structnum st(arrows);
return st.find_sol();
}
댓글남기기