![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/GOfqU/btq1xmhBPwQ/xuetlH366RE7jaiPQuz3XK/img.png)
자바로 백앤드 개발을 하다보면 컨트롤러에서 URL을 리턴해야할 일이 있다. 프론트부분 (JSP,HTML) 부분에서도 리소스를 로드할 때 , 경로를 쓰기 때문에 때문에 굉장히 많이 헷갈렸다. 이번 기회로 정리해보았다. 상대경로, 절대경로 1. 상대경로 상대경로는 현재 위치한곳을 기준으로 해서 위치를 의미한다. - ./ : 현재 경로를 의미한다. - ../ : 이전 경로를 의미한다. ., ..는 디렉토리를 만들면 파일시스템에서 만드는 일종의 파일이고, 이를 접근하면 "." : 현재 폴더로 연결되는 참조를 가지고 있다. ".." : 부모 폴더로 연결되는 참조를 가지고 있다. 2. 루트경로 "/" : 루트 경로를 의미한다. 루트경로와 상대경로의 차이는 아래 사진에서 명확하게 알 수 있다. example.css ..
- 스패닝 트리 : 그래프 중에서 일부 간선을 선택해서 만든 트리. - 최소 스패닝 트리 : 스패닝 트리 중 간선의 가중치 합이 최소인 트리. 최소 스패닝 트리는 경로 세우기 문제에서 자주 나온다. - 크루스칼 - 모든 간선 중 가장 작은것을 뽑는다. 단, 간선이 사이클을 만드는지 아닌지는 union-find 를 기준으로 수행한다. - 프림 - 임의의 정점을 선택한다. 임의의 정점을 기준으로, 선택한 정점과 선택하지 않은 정점들을 연결하는 간선중에 최소값을 고른다. 이를 모든 정점을 돌 때 까지 2번 단계를 반복한다. 프림 프림부터 수도코드를 알아보겠다. 1. 임의의 정점을 선택한다. 선택표시를 한다. 2. 정점에 연결되어있는 임의의 간선을 PQ에 넣는다. 3. PQ에서 가장 적은 코스트의 간선을 뺀다...
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bKF2kf/btq090MOMk1/u29D6XBlSmW8vZLwU6QBx1/img.png)
Union-Find 서로소, 상호배타 집합이란 서로 중복 표현된 원소가 없는 집합을 의미합니다. 이런 집합을 표현하기 위해서 "대표자" 라는 개념이 도입되는데, 이 대표자를 기준으로 각 집합을 구분할 수 있습니다. 이런 상호베타 집합에서 사용할 수 있는 연산은 아래 세가지로 분류됩니다. - make : 단위집합을 만드는 연산 (초기화 함수) - find : 어떤 한 element가 주어졌을 때, 그 element의 대표자를 구하는 연산. - union : 두 구성요소가 주어지고, 그 두 구성요소의 각 상호배타 집합을 합치는 연산. make는 이런 상호배타 연산을 하기 위해 초기셋팅하는 값입니다. (보통 상호배타집합이 주어지지 않고, 초기에 make()로 모든 엘리먼트를 상호배타집합으로 만든 뒤, 합쳐가며..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dp7G7w/btq05pre21Y/1p3WHYeB1N6KsBLBJT7sBk/img.png)
플로이드 알고리즘은 모든 노드 쌍의 사이의 최소 비용을 구해주는 알고리즘이다. 플로이드 와샬 알고리즘은 N제한만 맞으면 사용하기 좋다. 예를들어서 아래와 같은 그래프가 존재한다고 해본다면, 플로이드 와샬 알고리즘을 적용하면 N1->N3에서 가는 최소값, N1->N2로 가는 존재하는 모든 쌍의 최소 거리 정보를 구할 수 있다. 물론 익히 알고있는 다익스트라알고리즘을 노드 개수만큼 V번 돌려서, 다익스트라(N1), 다익스트라(N2), 다익스트라(N3) 최소거리를 구할 수 있다. 하지만, 플로이드 와샬은 조금 더 간단하게 DP를 이용해서 문제를 해결한다. DP를 하기 위해 함수를 소개하자면, DP[x][y][k] 같은 3차원 배열을 채워나간다고 가정한다. - x->y 를 방문한다. - 단, 중간에 방문할 수 ..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b68ESz/btq0Ojx62FL/RASFBnLVmu1CNwpWy5Ac90/img.png)
다익스트라는 최소 알고리즘을 구하는 알고리즘이다. 다익스트라 알고리즘을 보기전에, 다익스트라의 알고리즘의 원형이라고 볼 수 있는 BFS를 알아보겠다. 이 글에서는 BFS의 개념에 대해서 다루지 않는다. 1. BFS - Shortest Path. BFS는 대표적으로 모든 간선의 길이가 1일 때, 가장 짧은 거리를 구할 수 있는 알고리즘이다. 만약 간선이 1이 아니라면 어떨까? 위와 같은 그래프에서 BFS를 적용하려면 아래와 같이 모든 간선을 1로 바꾸는 편법을 써서 BFS로 풀 수 있다. 실제로 이렇게 간선을 추가하는것은 너무 비효율적인 일이니, 이런 그래프 모양을 생각하고 조금 효율적으로 바꿔보겠다. d'(node) = 시작노드부터 - node까지 "임시" shortest path // bfs처럼 확장하..
Q1. 스태틱 메소드에서 왜 인스턴스 메소드를 못쓸까요? 지난 포스트에서 썼던 클래스 로드 과정을 간단하게 정리해보겠습니다. 1. 클래스 로딩 1-1: verificatoin : 클래스 파일이 변조되었는지 검사 1-2 : preparation : static 변수 준비, 및 기본값으로 초기화. 1-3: resolution : 로딩 과정중에 symbolic reference로 연결해놨던것을 실제 레퍼런스로 교체. 1-4: initilization : 초기화 과정에서는 class와 interface 초기화 메소드 수행. 이때, static 변수에 입력한 값으로 초기화되고 static 메소드들이 수행. 위 과정을 다시 보면, 스태틱 메소드는 애초에 인스턴스가 로드되기 전에 로드되고 사용 가능하다. 당연히 로드..