자바로 백앤드 개발을 하다보면 컨트롤러에서 URL을 리턴해야할 일이 있다. 프론트부분 (JSP,HTML) 부분에서도 리소스를 로드할 때 , 경로를 쓰기 때문에 때문에 굉장히 많이 헷갈렸다. 이번 기회로 정리해보았다. 상대경로, 절대경로 1. 상대경로 상대경로는 현재 위치한곳을 기준으로 해서 위치를 의미한다. - ./ : 현재 경로를 의미한다. - ../ : 이전 경로를 의미한다. ., ..는 디렉토리를 만들면 파일시스템에서 만드는 일종의 파일이고, 이를 접근하면 "." : 현재 폴더로 연결되는 참조를 가지고 있다. ".." : 부모 폴더로 연결되는 참조를 가지고 있다. 2. 루트경로 "/" : 루트 경로를 의미한다. 루트경로와 상대경로의 차이는 아래 사진에서 명확하게 알 수 있다. example.css ..
- 스패닝 트리 : 그래프 중에서 일부 간선을 선택해서 만든 트리. - 최소 스패닝 트리 : 스패닝 트리 중 간선의 가중치 합이 최소인 트리. 최소 스패닝 트리는 경로 세우기 문제에서 자주 나온다. - 크루스칼 - 모든 간선 중 가장 작은것을 뽑는다. 단, 간선이 사이클을 만드는지 아닌지는 union-find 를 기준으로 수행한다. - 프림 - 임의의 정점을 선택한다. 임의의 정점을 기준으로, 선택한 정점과 선택하지 않은 정점들을 연결하는 간선중에 최소값을 고른다. 이를 모든 정점을 돌 때 까지 2번 단계를 반복한다. 프림 프림부터 수도코드를 알아보겠다. 1. 임의의 정점을 선택한다. 선택표시를 한다. 2. 정점에 연결되어있는 임의의 간선을 PQ에 넣는다. 3. PQ에서 가장 적은 코스트의 간선을 뺀다...
Union-Find 서로소, 상호배타 집합이란 서로 중복 표현된 원소가 없는 집합을 의미합니다. 이런 집합을 표현하기 위해서 "대표자" 라는 개념이 도입되는데, 이 대표자를 기준으로 각 집합을 구분할 수 있습니다. 이런 상호베타 집합에서 사용할 수 있는 연산은 아래 세가지로 분류됩니다. - make : 단위집합을 만드는 연산 (초기화 함수) - find : 어떤 한 element가 주어졌을 때, 그 element의 대표자를 구하는 연산. - union : 두 구성요소가 주어지고, 그 두 구성요소의 각 상호배타 집합을 합치는 연산. make는 이런 상호배타 연산을 하기 위해 초기셋팅하는 값입니다. (보통 상호배타집합이 주어지지 않고, 초기에 make()로 모든 엘리먼트를 상호배타집합으로 만든 뒤, 합쳐가며..
플로이드 알고리즘은 모든 노드 쌍의 사이의 최소 비용을 구해주는 알고리즘이다. 플로이드 와샬 알고리즘은 N제한만 맞으면 사용하기 좋다. 예를들어서 아래와 같은 그래프가 존재한다고 해본다면, 플로이드 와샬 알고리즘을 적용하면 N1->N3에서 가는 최소값, N1->N2로 가는 존재하는 모든 쌍의 최소 거리 정보를 구할 수 있다. 물론 익히 알고있는 다익스트라알고리즘을 노드 개수만큼 V번 돌려서, 다익스트라(N1), 다익스트라(N2), 다익스트라(N3) 최소거리를 구할 수 있다. 하지만, 플로이드 와샬은 조금 더 간단하게 DP를 이용해서 문제를 해결한다. DP를 하기 위해 함수를 소개하자면, DP[x][y][k] 같은 3차원 배열을 채워나간다고 가정한다. - x->y 를 방문한다. - 단, 중간에 방문할 수 ..
다익스트라는 최소 알고리즘을 구하는 알고리즘이다. 다익스트라 알고리즘을 보기전에, 다익스트라의 알고리즘의 원형이라고 볼 수 있는 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 메소드들이 수행. 위 과정을 다시 보면, 스태틱 메소드는 애초에 인스턴스가 로드되기 전에 로드되고 사용 가능하다. 당연히 로드..