/* code block */
반응형

기본 포트로 8080 사용, webapp 폴더를 루트 디렉토리로 사용한다.

 

 
 
public class WebServerLauncher {
    public static void main(String[] args) throws Exception {
        String webappDirLocation = "webapp/";
        Tomcat tomcat = new Tomcat();
        String webPort = System.getenv("PORT");
        if(webPort == null || webPort.isEmpty()) {
            webPort = "8080";
        }
         
        tomcat.setPort(Integer.valueOf(webPort));
        Connector connector = tomcat.getConnector();
        connector.setURIEncoding("UTF-8");
        tomcat.addWebapp("/"new File(webappDirLocation).getAbsolutePath());
        System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath());
        tomcat.start();
        tomcat.getServer().await(); 
    }
}
 
반응형

' > Java' 카테고리의 다른 글

자동으로 실행되는 WebListener 어노테이션  (0) 2019.10.24
모든 요청을 받는 서블릿  (0) 2019.10.24
jdbc에 mysql 연동시 time zone 에러  (0) 2019.10.11
서블릿 구현 - Hello world  (0) 2019.09.29
정규표현식  (0) 2019.08.26
반응형

HTTP

1. 프로가 되기 위한 웹 기술 입문 (고모리 유스케 저/ 김정환 역, 위키북스/2012) 

- 3장 까지

- 웹 개발을 위한 기본 용어와 HTTP에 대한 내용

2. HTTP & nETWORK : 그림으로 배우는 책으로 학습 (우에노 센 저/ 이병억 역, 영진닷컴/2015)

- HTTP에 대한 전반적으로 깊은 이해

3. HTTP 완벽 가이드 (데이빗 고울리, 브라이언 토티, 마조리 세이어, 세일루 레디, 안슈아가왈 공저/ 이응준, 정상일 공역, 인사이트/2014)

- HTTP의 끝판왕 수준. 전문적 영역

 

네트워크

1. 성공과 실패를 결정하는 1%의 네트워크 원리 (Tsutomu Tone 저/ 이도희 역/ 이중호 감역, 성안당/2015)

- 서버에서 응답한 데이터가 클라이언트까지 어떤 여행 과정을 거치는지에 대한 학습

- 브라우저를 통해 전달된 데이터가 서버까지  어떻게 전달되는지, 서버에서 보낸 응답 데이터가 브라우저까지 전달되는 흐름을 이해하면 충분

반응형

' > HTML, CSS, JS 등' 카테고리의 다른 글

HTTP 302 상태 코드  (0) 2019.09.14
반응형

HTTP/1.1 302 Found

Location: /index.html

 

위와 같은 302 상태 코드를 보내면 클라이언트는 Location의 값을 읽어 서버에 재요청을 보내게 된다.

 

웹 애플리케이션을 개발하면서 리다이렉트 방식으로 페이지를 이동한다고 하면 내부적으로 302 상태 코드를 활용해 이동하겠구나라고 생각하면 된다.

반응형

' > HTML, CSS, JS 등' 카테고리의 다른 글

추가 학습 자료  (0) 2019.09.18
반응형

 

 

다이나믹 프로그래밍 문제다.

d[n] = n원을 만들기 위해 사용하는 동전의 최소 개수로 두고 짰다.

k원을 만들기 위해 필요한 동전 수는 d[k]가 된다.

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
import sys
 
n, k = map(int, sys.stdin.readline().split())
coin = []
 
for i in range(n):
    coin.append(int(sys.stdin.readline()))
 
coin.sort()
= [0]*(k+1)
 
for i in range(coin[0], k+1):
    temp = []
    if i in coin:
        d[i] = 1
    else:
        for j in coin:
            if i->= coin[0]:
                if d[i-j] != -1:
                    temp.append(d[i-j]+1)
        if len(temp) >0:
            d[i] = min(temp)
        else:
            d[i] = -1
 
print(d[k])
 
반응형
반응형

 

node 클래스를 만들어두고

각 노드에 대한 객체를 만들면서 사전에 등록해 참조하기 쉽게 한다.

 

이후 전위순회, 중위순회, 후위순회를 해주며 해당 노드의 data를 출력해주기만 하면 된다.

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
import sys
sys.setrecursionlimit(1000000)
 
= int(sys.stdin.readline())
tree = dict()
root = 'A'
 
class node:
    def __init__(self):
        self.data = None
        self.left = None
        self.right = None
 
def preorder(node):
    sys.stdout.write(node.data)
    if node.left is not None:
        preorder(tree[node.left])
    if node.right is not None:
        preorder(tree[node.right])
 
def inorder(node):
    if node.left is not None:
        inorder(tree[node.left])
    sys.stdout.write(node.data)
    if node.right is not None:
        inorder(tree[node.right])
 
def postorder(node):
    if node.left is not None:
        postorder(tree[node.left])
    if node.right is not None:
        postorder(tree[node.right])
    sys.stdout.write(node.data)
 
 
for i in range(n):
    a, b, c = sys.stdin.readline().split()
    if a == root:
        tree[root] = node()
        tree[root].data = a
        if b != '.':
            tree[root].left = b
            tree[b] = node()
            tree[b].data = b
        if c!= '.':
            tree[root].right = c
            tree[c] = node()
            tree[c].data = c
    else:
        if b!= '.':
            tree[a].left = b
            tree[b] = node()
            tree[b].data = b
        if c!= '.':
            tree[a].right = c
            tree[c] = node()
            tree[c].data = c
 
preorder(tree[root])
sys.stdout.write('\n')
inorder(tree[root])
sys.stdout.write('\n')
postorder(tree[root])
반응형
반응형

inorder(중위 순회)를 사용해야하는 특이한 문제다.

문제에 나와있는 그림을 잘 살펴보면 각 노드에 해당하는 행과 열은 각각 그 노드의 깊이(depth)와 중위순회 순서를 나타내고있기 때문이다.

 

예를 들어 5번 노드는 3행 8열에 위치해 있는데, 이 노드는 깊이가 3, 중위순회 순서 8번에 해당하는 노드이다.

( 중위순회 순서 : 8-4-2-14-9-18-15-5-10-1-16-11-6-12-3-19-17-13-7 )

 

각 노드를 연결하기  위해 node 클래스를 만들어주고, 각 노드의 깊이와 중위순회 순서를 저장하기 위한 변수도 초기화시켜준다. (self.depth, self.order)

 

parent 배열은 각 노드가 부모 노드를 가지고있는지 판별하기 위한 배열인데,

노드를 연결할 때마다 parent 배열에 부모가 있다는 표시를 해주면

이후에 parent가 0인 노드를 찾으면 그게 root 노드가 된다.

 

left, right 배열에 각 깊이에 따른 노드의 열값 최솟값과 최댓값을 저장해둔 후,

right-left+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
import sys
sys.setrecursionlimit(1000000)
 
class node:
    def __init__(self):
        self.left = -1
        self.right = -1
        self.depth = 0
        self.order = 0
 
def inorder(node, depth):
    global order
    if node == -1:
        return
    inorder(a[node].left, depth+1)
    a[node].depth = depth
    order += 1
    a[node].order = order
    inorder(a[node].right, depth+1)
 
= int(sys.stdin.readline())
= [node() for _ in range(10001)]
left = [0]*10001
right = [0]*10001
parent = [0]*10001
order = 0
 
for i in range(n):
    x, b, c = map(int, sys.stdin.readline().split())
    a[x].left = b
    a[x].right = c
    if b != -1:
        parent[b]+=1
    if c != -1:
        parent[c]+=1
 
 
root = 0
for i in range(1, n+1):
    if parent[i] == 0:
        root = i
 
inorder(root, 1)
maxdepth = 0
for i in range(1, n+1):
    depth = a[i].depth
    order = a[i].order
    if left[depth] == 0:
        left[depth] = order
    else:
        left[depth] = min(left[depth], order)
    right[depth] = max(right[depth], order)
    maxdepth = max(maxdepth, depth)
 
maxwidth = 0
anslevel = 0
 
for i in range(1, maxdepth+1):
    if maxwidth < right[i] - left[i] + 1:
        maxwidth = right[i]-left[i]+1
        anslevel = i
 
sys.stdout.write("{} {}".format(anslevel, maxwidth))
반응형

+ Recent posts