본문 바로가기

전체 글139

[그리디] 모험가 길드 모험가 N 명이 있다. 모험가들은 각각의 공포도를 갖고 있다. 그래서 공포도가 X 인 모험가는 반드시 X 명 이상으로 구성한 모험가 그룹에 참여해야 여행을 떠날 수 있다. 최대 몇개의 모험가 그룹을 만들수 있는가? 예를 들어 N이 5이고 각 모험가 공포도가 2 3 1 2 2 라고 해보자. 이때 group1(1 2 3), group2(2 2) 이렇게 두개의 그룹을 만들 수 있다. 그런데 문제의 조건이 더 있다. 몇명의 모험가들은 그룹에 포함되지 않아도 된다. 다시말해 모든 모험가를 특정한 그룹에 넣을 필요는 없다. 이렇게 되면 group1(1), group2(2 2) 도 정답이 된다. 둘 다 답은 2로 같은데 group이 되는 과정이 달라서 헷갈렸다. 그리고 모험가들은 같은 공포도를 갖는다고 하더라도 개별.. 2021. 9. 23.
아주 작은 습관의 힘 팀리더분이 추천해준 아주 작은 습관의 힘 책을 읽고 나에게 맞게 정리했다. 1. 정체성을 스스로 만들자 나는 코틀린 언어 공부를 좋아한다 나는 알고리즘 자료구조 공부를 좋아한다 나는 쿠버네티스, 카프카 공부를 좋아한다 나는 수학문제 푸는것을 좋아한다 2. 실행 계획을 구체적으로 세우자 매일 자기전 11시 ~ 12시에 1시간 공부한다 매주 일요일 3시 ~ 6시에 공부한다 점심먹고 노곤함이 풀린 후 즉시 한다 3. 기존 환경에서 새로운 습관을 만들기 쉽지 않다 기존 환경에서 하던 기존 습관이 있기 때문 새로운 환경에서 새로운 습관을 형성해보자 카페에서 특정시간에 가서 공부를 한다던지 그리고 버리고 싶은 습관은 그걸 유발하는 것을 눈에 안보이도록 환경을 셋팅하자 특히 핸드폰 한 공간에서는 한가지 일만 해라 4.. 2021. 9. 22.
@RequestParam 사용 시 Null에 대한 고민 정리 RequestParam 애노테이션에서 required = false 인 경우, 값이 없을 때 null 로 채워진다. RequestParamMethodArgumentResolver 에서 request.getParameterValues(name) 가 null 이고 결국 리턴되는 arg는 null 이 된다. public class RequestParamMethodArgumentResolver extends AbstractNamedValueMethodArgumentResolver implements UriComponentsContributor { @Nullable protected Object resolveName(String name, MethodParameter parameter, NativeWebReque.. 2021. 9. 20.
리스트 객체를 특정 key 기준으로 grouping 그리고 merge 아래와 같이 Product 리스트가 있다고 해보자. Product 객체에는 id(고유 식별자), productId, itemNo(리스트) 필드가 있다. 여기서 id와 productId의 차이에 대한 설명은 비지니스 정책 이슈라 생략하려 한다. 중요한건 productId는 중복이 가능하다. 그래서 prodocutId를 기준으로 grouping 을 하고 itemNo 리스트값을 중복없이 merge 하려고 한다. List products = Arrays.asList( new Product("1", "a", Arrays.asList("11", "12", "13")), new Product("2", "a", Arrays.asList("12", "13", "14")), new Product("3", "b", Arra.. 2021. 9. 20.
[그리디] 큰 수의 법칙 n 개의 다양한 수로 이뤄진 배열이 있다. 그 수들을 m 번 더해서 가장 크게 만들어야 한다. 단, 배열안의 특정 수가 k번 초과해서 더해질 수는 없다. 예를들어 n이 5인 [2,4,5,4,6] 배열로 m이 8, k가 3(8번 더하지만 특정 수가 3번 초과하면 안됌)인 상황에서 가장 큰 수를 만드려면 6+6+6+5+6+6+6+5=46 이 된다. 그리고 서로 다른 인덱스지만 숫자가 같은 경우는 서로 다른 것으로 간주한다. 예를들어 [3,4,3,4,3] 인 배열에 m이 7이고 k가 2이면 4+4+4+4+4+4+4 = 28이 된다. 결국 배열에서 필요한 숫자는 가장 큰 수와 그다음 큰수 두개 뿐이다. 그래서 먼저 배열을 정렬하는게 첫 이슈인데 책에서 정렬까지 직접 구현하진 않았고 라이브러리를 이용했다. # 큰.. 2021. 9. 13.
@RequestParam 사용 시 주의사항 요즘은 스프링 컨트롤러를 만들 때 @GetMapping, @PostMapping 으로 HTTP Method 를 명시하거나, @RequestMapping을 쓰더라도 HTTP Method 를 명시적으로 추가하는게 일반적이다. 그런데 예전 레거시 스프링 컨트롤러를 재개발 하는 상황에서 @RequestMapping 에 HTTP Method 가 명시적으로 적혀있지 않거나, 있다고 하더라도 GET, POST 둘다 받도록 하는 경우가 있어 똑같이 맞춰서 개발해야 했다. GET + @RequestParam 인 경우는 query parameters(query string) 만 고려해서 처리하면 되서 간단한데, POST 요청까지도 같이 받는다면 @RequestParam 이 query parameters(query stri.. 2021. 9. 11.
파이썬 기본문법 정리 # 10^9 표현을 1e9 라고 함 정수형으로 전환하기 위해 int wrap a = int(1e9) print(a) # 실수 a = 0.3 + 0.6 print(a) if a == 0.9: print(True) else: print( False) # round b = round(123.456, 2) print(b) # 123.456 에서 소수점 둘째자리 까지. 셋째에서 반올림 # 파이썬에서 나누기 연산의 결과는 기본적으로 실수형이다(자바는 몫만 나오는데) # 파이썬에서 몫을 얻기 위해 '//' 연산자를 사용한다. a = 7 b = 3 print(a/b) print(a//b) # 거듭제곱 연산자 '**' print(a**b) # 리스트 초기화. 크기가 10이고 모든값이 0인 1차원 리스트 초기화 n = 1.. 2021. 9. 6.
[그리디] 곱하기 혹은 더하기 문제 : 각 자리가 0~9 로만 이루어진 문자열이 주어졌을 때 왼쪽부터 오른쪽까지 차례대로 더하거나 곱해서 가장 큰수가 되게 만들기 사칙연산 방식과는 달리 모든 연산은 왼쪽부터 오른쪽으로 차례대로 진행된다. 예를들어 02984 문자열이 주어지면 ((((0+2)*9)*8)*4) = 576 이다. 이 문제를 풀 때 핵심은 0이나 1이 있을 때 곱하기를 안하고 더하기를 해줘야 한다는점, 그리고 for문을 돌 때 index outof bound가 발생하지 않게끔 해줘야 한다는 점이 제일 중요한거 같다. 두 수를 비교하기 위해서 index, index+1 을 비교하는 방식으로 할까 하다가 out of bound 가 날 수 있으므로, 0번째 인덱스는 미리 갖고 있고 1부터 len(data) 까지 for문을 돌게 하.. 2021. 9. 6.
ip 범위 구하고 범위안에 포함되는지(with subnetmask) 내부 로직을 다 이해해도 조금만 시간 지나면 까먹어서 정리했다. 코드는 IPv4 만 구현되어 있다. 서브넷 마스크, 넷마스크 용어를 엄격하게 구분져서 쓰지 않았다. 엄격히 구분할 필요가 없다고 판단했다. 먼저 ip 가 서로 같은지 다른지 비교를 해보자. 192.168.254.252와 192.168.254.253 은 당연히 다르다. string equal 을 이용해 바로 확인이 가능하다. 그런데 192.168.254.252/13 와 같이 subnetmask 가 같이 있는 경우, 192.175.254.253 이 포함되는지 여부는 바로 알기 어렵다(답은 포함됨). 코드를 보면서 하나씩 살펴보자. 먼저 IpAddressMatcher 생성자로 ip 와 subnetmask 문자열을 / 구분자로 함께 전달한다. Ip.. 2021. 8. 24.
nginx 수정 하면서 썼던 명령어 정리 1. nginx configure 확인(추가된 모듈이나 conf-path 등등) $ /(nginx 디렉토리)/sbin/nginx -V # cf) nginx 버전 확인 $ /(nginx 디렉토리)/sbin/nginx -v 2. nginx 문법체크/중지/시작 # 문법체크 $ /(nginx 디렉토리)/sbin/nginx -t # 중지 $ /(nginx 디렉토리)/sbin/nginx -s stop # 시작 $ /(nginx 디렉토리)/sbin/nginx 3. path variable 요청은 = 로 exact matching 하면 안됌 아래와 같이 '=' 로 location 을 만들면 location 우선순위가 가장 높다(요청된 URI와 지정된 문자열이 정확히 일치). location = /ybs/api/ { ... 2021. 8. 3.
WebClient 사용할때 주의 (3편) response body가 필요 없을 때 response body 가 필요없을 때 releaseBody(), toBodilessEntity(), bodyToMono(Void.class) 세가지 방법이 있다. 그런데 bodyToMono(Void.class) 는 한가지 문제가 있다. reactor-netty 는 bodyToMono(Void.class) 썼을 때 맺었던 커넥션을 커넥션풀에 반납을 하지 못한다. 왜냐하면 reactor-netty 는 통신하고 있는 서버에서 더 받을게 있는지 여부를 모르기 때문이다. 따라서 이 경우 reactor-netty는 해당 커넥션을 닫고 커넥션풀에서 제거한다. 그래서 reactor-netty 메인테이너는 releaseBody(), toBodilessEntity() 두가지만 .. 2021. 6. 23.
Spring Cloud Gateway 인코딩 이슈 http://ybs.com/filtering?sort[]=id,desc&keyword=%EC%96%91%EB%B4%89%EC%88%98 위와 같은 URL 로 요청이 왔을 때, Spring Cloud Gateway 에서 뒷단 서버로 보내기 전 인코딩 여부 검사를 한다. 그런데 '[' 문자가 Invalid character 로 exception 이 발생하면서 인코딩이 안됐다고 판단해서, 재인코딩을 하게 되고 최종적으로는 keyword 값이 두번 인코딩한 결과가 나온다(정작 중요한 '[', ']' 문자는 인코딩안되고 이미 된것만 또 인코딩한 꼴). '[' 문자가 왜 Invalid character 로 exception 이 발생했나를 알아보자. Spring Cloud Gateway 는 허용하는 QUERY_PAR.. 2021. 6. 18.