전체 글

1. DFS 구현DFS는 stack으로 구현되며 재귀 함수를 통해 구현할 수 있다.import sysinput = sys.stdin.readlinedef dfs(now, graph, visited): visited[now] = True print(now, end=' ') for next in graph[now]: if not visited[next]: dfs(next, graph, visited)n, m, start_node = map(int, input().rstrip().split()) graph = [[] for _ in range(n+1)] ..
· Algorithm
1. 풀이from collections import dequedef solution(edges): answer = [] max_num = 0 graph = [[] for _ in range(1000001)] # 만들어진 노드는 들어오는 edge가 없다. 이를 체크하기 위한 노드다. not_end_list = [True for _ in range(1000001)] # graph를 생성한다. for edge in edges: start, end = edge graph[start].append(end) not_end_list[end] = False max_num = max(max_num, start, end)..
1. JWT의 의미와 구성JWT란 Json Web Token의 약자로 사용자 인증에 사용되는 토큰이다. JWT의 구조는 다음과 같이 Header, Payload, Signature로 이루어진다.1.1. Header첫 번째로 Header는 typ과 alg 두 가지 정보로 구성된다. typ은 토큰의 타입을 말한다. 우리는 JWT를 사용하므로 현재 typ은 JWT가 된다. alg는 Signature를 해싱하기 위한 알고리즘을 말한다. RSA, SHA 256 등이 있다. 즉, 아래와 같이 작성된다.{ "alg": "HS256", "typ": "JWT"}1.2. Payload두 번째로 Payload는 토큰의 정보가 들어있다. 이때 이 정보들 하나하나 각각을 Claim이라고 부른다. (Key-Value ..
1. 문제 정의큰 수의 법칙은 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더해 가장 큰수를 만드는 법칙이다. 이때 특정 인덱스에 해당하는 수가 K번 연속해서 더해줄 수 없다. 입력: 첫째 줄에 N(2이상 1000이하), M(1이상 10000이하), K(1이상 10000이하)가 주어진다. 둘째 줄에는 N개의 자연수(1이상 10000이하)가 주어진다. 이때 입력으로 주어지는 K는 항상 M 이하다.출력: 큰 수의 법칙에 따라 더해진 답을 출력한다.2. 풀이# 입력n, m, k = map(int, input().split())num_list = list(map(int, input().split()))# 첫 번째로 큰 수와 두 번째로 큰 수 뽑아냄max_num = max(num_list)num_li..
1. 풀이풀이는 다음과 같이 Brute Force로 풀었다. 다른 사람들 풀이도 비슷하게 Brute Force로 풀었기에 다른 풀이는 따로 포스팅하지 않았다.# friends: 친구들의 이름을 담은 1차원 문자열 배열# gifts: 이번 달까지 주고받은 선물 기록을 담은 1차원 문자열 배열def solution(friends, gifts): ''' friends_dict: gifts_count_list에 활용하기 위해 각 이름을 key로, 인덱스를 value로 가지는 dictionary gifts_index: 선물 지수를 담는 1차원 리스트 gifts_result: 다음 달 받을 선물의 개수를 담는 1차원 리스트 gifts_count_list: 선물을 준 사람은 행, 선물을 받..
· DB
문제 및 해답BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요. 결과는 출판일을 기준으로 오름차순 정렬해주세요.SELECT BOOK_ID, SUBSTRING(PUBLISHED_DATE, 1, 10) AS PUBLISHED_DATEFROM BOOKWHERE CATEGORY = '인문'AND PUBLISHED_DATE like '2021%'ORDER BY PUBLISHED_DATE;문제에서 PUBLISHED_DATE는 2021-01-18 00:00:00과 같이 구성되었다. 이때 2021년에 출판되었는지 찾아내기 위해 like문을 활용했다.정렬은 기본값이 오름차순이므로 AS..
1. 서블릿 예외 처리서블릿은 2가지 방식으로 예외를 처리한다.1.1. Exception웹 애플리케이션은 사용자 요청별로 스레드가 할당되고, 서블릿 컨테이너 안에서 실행된다. 애플리케이션에서 예외가 발생했는데 해당 예외를 잡지 못한 경우는 어떻게 될까? 기본적으로 어떠한 요청이 들어올 경우 다음과 같이 요청이 전파된다.WAS → 필터 → 서블릿 → 인터셉터 → 컨트롤러만약 컨트롤러에서 예외가 발생하면 요청의 전파 방향과 반대로 전파된다.WAS ← 필터 ← 서블릿 ← 인터셉터 ← 컨트롤러예외 발생시 서블릿 컨테이너에서 그에 맞는 오류 페이지를 보여준다.1.2. response.sendError() 메서드오류가 발생하면 HttpServletResponse가 제공하는 sendError 메서드를 사용해도 된다...
1. 서블릿 필터이전 포스팅에서 구현한 코드는 로그인을 하지 않아도 특정 url을 입력하면 해당 url로 이동할 수 있다. 이를 위해 모든 비지니스 로직을 수행할 때 사용자의 로그인 여부를 체크할 수 있다. 하지만 이런 방식은 이후 로그인 관련 로직을 바꿀 때 해당 체크 로직을 다 수정해야할 수도 있다.이와 같이 여러 로직에서 공통으로 관심있는 것을 공통 관심사(cross-cutting concern)이라고 한다.이러한 공통 관심사는 AOP로도 해결할 수 있다. 하지만 웹과 관련된 공통 관심사는 서블릿 필터 혹은 스프링 인터셉터를 사용하는 것이 좋다. 필터는 서블릿이 지원하는 수문장 역할을 하는 것으로 필터의 흐름은 다음과 같다.HTTP 요청 → WAS → 필터 → 서블릿 → 컨트롤러만약 필터를 통해 적..
코딩마루
Nam's Study Note