택시짱의 개발 노트

[프로그래머스] 가장 먼 노드 본문

알고리즘

[프로그래머스] 가장 먼 노드

택시짱 2020. 1. 26. 18:51

링크

https://programmers.co.kr/learn/courses/30/lessons/49189

 

코딩테스트 연습 - 가장 먼 노드 | 프로그래머스

6 [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] 3

programmers.co.kr

풀이

간단한 BFS로 풀 수 있다.

 

일단 양방향 그래프를 만든 후

출발지에서 도착한 위치와 거리를 저장할수 있는 구조체를 만들었다.

이전 노드에서 다음 노드에 도착 하였을때 거리를 1 증가 시켜 주었고

방문 여부를 확인하기 위해서 visited배열을 모두 -1로 초기화 하고

방문한 위치를 기억 하기 위해 visited을 거리만큼 갱신 했고

가장 큰 거리와 visited배열과 비교하여 거장 먼 노드의 갯수를 찾을수 있었다.

#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<string>
#include<set>
#include<map>
#include<cstring>
#include<functional>

#define INF 2e9
#define SIZE 20010

using namespace std;

typedef long long int ll;

typedef struct Data {
	int n, cost=0;
}Data;

vector<int> arr[SIZE];
int visited[SIZE];
queue<Data> q;

int solution(int n, vector<vector<int>> edge) {
	int e_size = edge.size();

	for (int i = 0; i < e_size; i++) {
		arr[edge[i][0]].push_back(edge[i][1]);
		arr[edge[i][1]].push_back(edge[i][0]);
	}

	memset(visited, -1, sizeof(visited));

	Data start;
	start.n = 1;
	q.push(start);

	int m_len = 0;
	while (!q.empty()) {
		Data here = q.front();
		q.pop();

		visited[here.n] = visited[here.n] == -1 ? 0 : visited[here.n];
		m_len = max(m_len, visited[here.n]);

		for (auto next : arr[here.n]) {
			if (visited[next] != -1)
				continue;

			Data nxt; nxt.n = next; nxt.cost = here.cost + 1;
			visited[next] = nxt.cost;
			q.push(nxt);
		}
	}

	int res = 0;
	for (int i = 0; i < n; i++) {
		res += m_len == visited[i] ? 1 : 0;
	}

	return res;
}

 

반응형

'알고리즘' 카테고리의 다른 글

[백준] 2206번 - 벽 부수고 이동하기  (0) 2020.02.01
[백준] 3190번 - 뱀  (0) 2020.01.30
[프로그래머스] 예산  (0) 2020.01.25
[프로그래머스] 섬 연결하기  (0) 2020.01.24
[백준] 2294번 동전 2  (0) 2020.01.24
Comments