벨만-포드(Bellman-Ford) 알고리즘 알아보기

벨만-포드 알고리즘 최단 경로를 찾는 알고리즘 중 하나이다. 벨만-포드 알고리즘은 시작 정점에서 다른 모든 정점까지의 최단 경로를 찾는 알고리즘이다. 다익스트라 알고리즘과 유사하지만, 음수 가중치가 있는 그래프에서도 사용할 수 있다. 순서 시작 정점에서 각 정점까지의 거리를 저장하는 배열을 초기화한다. 시작 정점을 방문 처리한다. 시작 정점에서 다른 정점까지의 거리를 갱신한다. 위 과정을 정점의 개수 - 1번 반복한다. 음수 사이클이 있는지 확인한다. 예제 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 #include <iostream> #include <vector> using std::cin; using std::cout; using std::pair; using std::vector; #define INF 1000000000 int main() { int n, m; cin >> n >> m; vector<vector<pair<int, int>>> graph(n + 1); vector<int> dist(n + 1, INF); for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; graph[u].push_back({v, w}); } int start; cin >> start; dist[start] = 0; for (int i = 0; i < n - 1; i++) { for (int u = 1; u <= n; u++) { for (auto p : graph[u]) { int v = p.first; int w = p.second; if (dist[u] != INF && dist[v] > dist[u] + w) { dist[v] = dist[u] + w; } } } } for (int u = 1; u <= n; u++) { for (auto p : graph[u]) { int v = p.first; int w = p.second; if (dist[u] != INF && dist[v] > dist[u] + w) { cout << "음수 사이클이 존재합니다.\n"; return 0; } } } for (int i = 1; i <= n; i++) { if (dist[i] == INF) { cout << "INF\n"; } else { cout << dist[i] << '\n'; } } return 0; } 장점 벨만-포드 알고리즘은 음수 가중치가 있는 그래프에서도 사용할 수 있다. ...

6월 17, 2024 · 2 분 · 374 단어 · In-Jun Hwang

다익스트라(Dijkstra) 알고리즘 알아보기

다익스트라 알고리즘 최단 경로를 찾는 알고리즘 중 하나이다. 다익스트라 알고리즘은 시작 정점에서 다른 모든 정점까지의 최단 경로를 찾는 알고리즘이다. 너비 우선 탐색(BFS)와 유사하다. 각 정점까지의 최단 거리를 저장하면서 탐색한다. 순서 시작 정점에서 각 정점까지의 거리를 저장하는 배열을 초기화한다. 시작 정점을 방문 처리한다. 큐에 시작 정점을 넣는다. 큐가 빌 때까지 다음을 반복한다. 큐에서 정점을 꺼낸다. 해당 정점과 연결된 정점들을 탐색한다. 시작 정점에서 해당 정점까지의 거리가 시작 정점에서 현재 정점까지의 거리 + 현재 정점에서 해당 정점까지의 거리보다 크다면, 시작 정점에서 해당 정점까지의 거리를 갱신한다. ...

6월 17, 2024 · 2 분 · 378 단어 · In-Jun Hwang

CI/CD란 무엇인가?

CI(Continuous Integration)란 CI(Continuous Integration)는 지속적 통합을 의미한다. 코드가 작성되고 변경될 때마다 자동으로 빌드하고 테스트하는 과정이다. 쉽게 말해, 여러 개발자들이 작성한 코드를 자동으로 통합하는 과정이라고 할 수 있다. CI의 작동 방식 개발자가 코드를 수정한다 코드를 저장소(예: GitHub)에 올린다 CI 도구가 자동으로 코드를 가져와 빌드한다 테스트를 실행한다 결과를 개발자에게 알려준다 CI의 장점 코드 문제를 빨리 발견할 수 있다 수동으로 빌드하고 테스트하는 시간을 줄일 수 있다 품질 높은 코드를 유지할 수 있다 CD(Continuous Deployment)란 CD(Continuous Deployment)는 지속적 배포를 의미한다. CI 과정을 통과한 코드를 자동으로 서비스에 반영하는 과정이다. 즉, 개발한 내용을 사용자가 바로 사용할 수 있게 만드는 과정이다. ...

6월 10, 2024 · 1 분 · 191 단어 · In-Jun Hwang

socket이란 무엇인가?

소켓(Socket)이란 소켓(Socket) 은 네트워크 통신을 위한 인터페이스를 제공하는 소프트웨어이다. 소켓은 클라이언트와 서버 간의 통신을 가능하게 하며, 데이터를 주고받을 수 있다. 소켓은 네트워크 통신을 위한 API(Application Programming Interface)를 제공한다. 소켓은 TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)를 지원하며, 데이터를 안정적으로 전송할 수 있다. 소켓 통신 방식 소켓은 클라이언트와 서버 간의 통신을 위해 다음과 같은 방식을 제공한다. TCP(Transmission Control Protocol): 연결 지향(Connection-Oriented): 클라이언트와 서버 간에 연결을 설정하고, 데이터를 안정적으로 전송한다. 신뢰성(Reliability): 데이터를 순서대로 전송하고, 손실된 데이터를 재전송한다. 흐름 제어(Flow Control): 데이터의 전송 속도를 조절하여 데이터 손실을 방지한다. 혼잡 제어(Congestion Control): 네트워크의 혼잡 상태를 감지하고, 데이터의 전송 속도를 조절한다. UDP(User Datagram Protocol): ...

6월 8, 2024 · 1 분 · 209 단어 · In-Jun Hwang

1차 캐시와 2차 캐시 알아보기

1차 캐시(First Level Cache)란 1차 캐시(First Level Cache) 는 영속성 컨텍스트(Persistence Context) 내부에 존재하는 캐시를 말한다. 1차 캐시는 엔티티를 조회하면, 영속성 컨텍스트가 엔티티를 캐시에 저장한다. 이후 같은 엔티티를 조회하면, 영속성 컨텍스트는 캐시에서 엔티티를 찾아 반환한다. 그렇기 때문에 트랜잭션 내에서만 유효하며, 트랜잭션이 종료되면 1차 캐시도 함께 종료된다. 더티 체킹(Dirty Checking) 더티 체킹(Dirty Checking) 은 1차 캐시를 통해 엔티티의 변경 사항을 추적하는 방식이다. 엔티티를 조회하면, 영속성 컨텍스트는 엔티티의 초기 상태를 저장한다. 이후 엔티티의 상태가 변경되면, 영속성 컨텍스트는 변경 사항을 추적하고 데이터베이스에 반영한다. ...

6월 8, 2024 · 2 분 · 299 단어 · In-Jun Hwang