분류 전체보기

    [SpringBoot] DTO를 어떻게 관리해야할까?

    문제 api별로 req,res DTO들을 사용하다 보니 너무 많은 DTO를 생성하게 된다. 향후 프로젝트를 더 진행하게 되면 관리가 더 어려울 것이라 판단하여 이를 해결하고자 한다. 해결방법 Inner Class로 바꾸어 관리한다. 도메인의 이너 클래스로 관리하여 DTO 관리 편의성을 높인다. import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.Setter; public class User { @Getter @AllArgsConstructor @Builder public static class Info { private int id; private String name; private int..

    [python3] 백준 1991 (트리 순회, 트리, 재귀)

    이번 문제는 순회 문제이다. 처음에는 트리를 어떻게 푸는지 몰라서 헤맸는데 어제 영상을 봤더니 쉽게 이해가 갔다. https://www.youtube.com/watch?v=QN1rZYX6QaA 정리하자면 pre order = root, left, right 순서 in order = left, root, right 순서 post order = left, right, root 순서 따라서 순서만 기억해도 나중에 쉽게 떠올릴 수 있다. 이걸 토대로 문제를 풀면 아래와 같다. adj = {} N = int(input()) for i in range(N): A, B, C = input().split() if A not in adj: adj[A] = [B, C] # 전위 순회 [root, left, right] d..

    [python3] 1167 풀이 (트리의 지름, 트리, DFS)

    [python3] 1167 풀이 (트리의 지름, 트리, DFS)

    문제가 어려워서 힌트를 봤고 이해하고 나니 쉽게 풀 수 있었다. 트리가 주어진다. 이때 트리의 지름을 구하는 문제이다. 트리의 지름을 어떻게 구해야하는지 이해하지 못하면 풀수가 없다. 트리가 주어졌을대 트리의 지름을 구하기 위해서는 가장 끝점을 알아내야한다. 처음에는 각 노드마다 다익스트라를 할지 플로이드를 할지 고민했다. 그런데 주어지는 노드가 100,000개이기 때문에 구할 수가 없다. 따라서 다른 방법을 사용해야한다. 그래서 이리저리 지지고 볶으니 한줄로 세우는 방법이면 되지 않을까 싶었다. 그래서 한줄로 세워보았다. 그런데 이렇게 세운다고 달라지지가 않았다. 더이상 고민하는게 무의미하여 찾아보니 아무 노드나 잡고 가장 먼것을 찾아본다. 그럼 지름의 끝 노드를 찾을 수 있었다. 만약 3번 노드에서 ..

    [python] 조합을 DFS로 구하기

    [python] 조합을 DFS로 구하기

    항상 combinations로만 조합을 구했는데 이제는 한번 정리를 해야할것 같아서 오랜만에 글을 쓴다. 이문제는 백준 15650번으로 조합을 구하면 되는 문제이다. 사실 라이브러리를 사용한다면 상당히 쉬운 문제이다. from itertools import combinations N, M = map(int, input().split()) for com in list(combinations([i for i in range(1, N+1)], M)): print(" ".join(map(str, com))) 그러나 이렇게 푸는게 습관이 되어 나중에 백트래킹 문제가 어렵게 느껴졌고 기초적인 문제를 코테에서 틀리는 상황이 발생했다. 따라서 이걸 DFS로 풀어보자. 4에서 3개를 뽑는 경우는 [1,2,3],[1,2,..

    [python3] Trie 구현

    트라이는 문자열 탐색에 굉장히 유리한 알고리즘이다. 각 문자열에 대해서 트라이 형태로 자료구조를 만들면 이후에 문자열이 존재하는지 파악할때 빠르게 파악가능하다. class Node(object): def __init__(self, key, data=None): self.key = key self.data = data self.children = {} class Trie(object): def __init__(self): self.head = Node(None) def insert(self, string): # 문자열이 삽입한다. 단순 삽입 curNode = self.head for char in string: if char not in curNode.children: curNode.children[cha..

    [dp] 모듈러 분배법칙

    [dp] 모듈러 분배법칙

    코딩테스트를 풀다보면 결과 값이 매우 큰 경우 값의 나머지를 구하라는 문제가 자주 출제된다. 단순히 결과 값에 모듈러 연산을 수행하면 이미 결과값이 너무 커져서 오버플로우가 발생하거나 연산에 시간이 오래 걸리는 경우바 발생한다. 따라서 이럴때 연산 과정 중간에 모듈러 연산을 적용해야 한다. 연산 과정중에 모듈러 연산을 적용하기 위해서는 모듈러 연산의 분배법칙에 대해 알아야한다. 각 피연산자에 모듈러 연산을 취하고 계산 결과에 다시한번 모듈러 연산을 취하면 된다. ( dp[i] + dp[j] ) % C = ( dp[i]%C + dp[j]%C ) %C와 같다. 모듈러 연산의 분배법칙은 덧셈+, 뺄셈-, 곱셈* 에만 적용이 가능하고 나머지 연산에 대해서는 분배법칙을 적용할 수 없다.

    [고민] public repository에 application.properties(.yml)의 정보를 어떻게 관리해야할까?

    [고민] public repository에 application.properties(.yml)의 정보를 어떻게 관리해야할까?

    예전에 공모전에 참가하며 설정파일에 모든 주소들이 공개되어 해커가 db를 싹다 암호화해버린 경험이 있었다. 그래서 당시에는 결국 repository를 private로 진행했고 이후 공모전이 끝나고 나서 public으로 전환한 기억이 있다. 사실 이러한 문제를 알고 있었기 때문에 과연 프로젝트를 공개적으로 배포하기 위해서는 무엇을 해야하는지 여러가지 방안을 고민해보게 되었다. 이때 사용가능한 방법을 몇개 생각해보았다. ${key}사용하여 환경변수로 application.properties를 작성한다. 이 방법을 사용하는 경우 로컬에서 매번 실행시 java -jar -Dusername=root target/SendOwl-0.0.1-SNAPSHOT.jar 식으로 실행해주어야 한다. 나는 intellij를 사용..

    [python3] 행렬 다루기 (zip, *, 행렬)

    [python3] 행렬 다루기 (zip, *, 행렬)

    코테를 풀다보면 [[1,2] [3,4]] 를 [[1,3] [2,4]]로 바꾸고 싶을때가 있다. 물론 코딩을 통해 하나씩 옮겨주는 방법도 있지만 문제는 이런 사소한 부분들을 신경쓰다보면 이상하게 말리는 경우가 생긴다는 것이다. python 행렬 전치를 구글링하면 numpy를 사용하여 전치하는 예시들이 나오는데, 코딩테스트에서는 이런 외부 라이브러리를 사용하지 못하는 경우가 발생한다. 이때를 대비하기 위해 행렬을 다루는 방법을 알아본다. 행렬 전치하기 a = [ [1,2] , [3,4] ] b = list(zip(*a)) for tmp in b: print(tmp) # (1,3) # (2,4) zip(*배열) 을 사용해주면 간단히 행과 열을 바꿔줄 수 있다. 행렬 회전하기 방금 우리는 zip을 통해 행렬을 ..