골드 5인데도 하루를 꼬박 썼다. 직전에 유사한 문제 (BOJ 14502 연구소 - https://www.acmicpc.net/problem/14502)를 풀어서 조합을 이용한 풀이를 빨리 떠올렸고, 하다못해 구글링해서 아주 유사한 코드를 발견했음에도 어디가 문제인지 몰라서 한참을 헤맨 문제. (난 알고리즘 팔생각도 없고 코테합만 안정적으로 할 딱 그정도 수준만 되고싶을 뿐인데 참 어렵다.) 문제 정리 간단하게 정리하면, "NxN 크기의 도시에 집들과 치킨집들이 있다. 이 치킨집들의 숫자를 M개까지 줄일 때, '치킨 거리'의 합의 최소값을 구하시오. (치킨 거리란, 임의의 집에서 치킨집까지 거리의 최소값을 의미한다.)"로 정리할 수 있다. 풀이 처음에는 NxN의 인접 행렬로 도시를 표현하고 나서, 처음 ..
람다란 익명 함수(이름이 없는 함수)를 말하는데, 자바에서의 람다식 표현법과 활용되는 예를 정리했다. 람다식 람다식은 이름이 없는 함수를 의미하는데, 즉 함수를 하나의 식으로 표현하는 방법이다. 가장 간단한 람다식은 다음과 같이 표현할 수 있다. 이때 expression은 바로 return값이 나와야 한다. 예를 들면 public String getName() { return "name"; } () -> "name" 과 같이 바로 리턴값이 나와야 한다. 만약 다양한 변수나 선언문, 배정문등을 쓰기 위해서는 중괄호를 사용해주면 된다. 이러한 람다식은 불필요한 코드를 줄이고, 가독성을 높이기 위해서 사용될 수 있다. 함수형 인터페이스 배열을 정렬하는 Arrays.sort() 함수에서 사용되는 예를 보자. I..
애플리케이션 서비스를 개발할 때 데이터는 DB에 보관하고, DB와의 연결을 위해서 애플리케이션(클라이언트)은 애플리케이션 서버를 이용하여 DB와의 연결을 구축했다. 이 연결은 구축된 커넥션을 통해서 sql을 전달하면 db에서 결과를 응답받는 식으로 진행되었는데, 문제는 DB의 종류마다 이 커넥션의 방법이 달라서 DB를 변경하면 애플리케이션 서버의 DB관련 코드도 변경해주어야 했다는 것이다. 이러한 불편함을 해소하기 위해서 JDBC라는 자바 커넥션 표준이 등장하게 된다. JPA의 구현체인 hibernate도 내부적으로 이러한 JDBC를 사용하여 DB와 통신한다. JDBC (Java DB Connectivity) JDBC는 자바에서 데이터베이스에 접근하기 위한 API들을 제공하는 라이브러리로, 연결-SQL ..
https://www.acmicpc.net/problem/16236 16236번: 아기 상어 N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가 www.acmicpc.net 풀이시간 모두 합치면 6~7시간도 넘게 걸린 문제다.ㅜ 풀이과정을 떠올리는데에는 그렇게까지 많은 시간이 걸리지는 않았지만 탐색 문제를 풀때마다 막상 세부 구현에서 문제가 생겨서 정리해놓기 위해 쓴다. 1. 문제 파악 항상 그렇지만 문제가 길수록 문제의 조건을 읽기X 이해O한 후에 본격적으로 코드를 작성하자. 이 문제를 읽고 정리할 점은 다음과 같다. - 상어는 자신의 크기보다 작은 크기의 ..
플로이드 알고리즘 플로이드 알고리즘은 시간복잡도 조건에 여유가 있는경우(O^3) 사용할 수 있는 알고리즘으로, 한 시작점에서 다른 정점까지의 최단 거리를 구하는 다익스트라 알고리즘과 다르게 모든 정점 쌍에 대해서 둘 사이의 최단 거리를 구하는 알고리즘이다. 위 가중치 그래프에서, A에서 E로 가기 위한 방법은 (1) A에서 E로 직접 가는 방법과, (2) 중간에 C를 거져가는 방법 총 2가지 방법이 존재한다. 따라서 두 정점 쌍의 최단 거리를 구하기 위해서는 두 정점 사이에 존재하는 경유점을 거쳐가는 방법들을 탐색하며 그 방법들 중에 최소값을 구하면 된다. len[A][E] = Min(len[A][E], len[A][C] + len[C][E]) N개의 노드에 대한 플로이드 알고리즘은 O(N^3)의 시간복..
0. String ★★★★★ import java.io.*; //BufferedReader, BufferedWriter BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); String[] strArray = br.readLine().split(""); bw.write(1+"\n"); bw.flush(); bw.close(); 가장 먼저 입출력을 위해서 BufferedReader와 BufferedWriter를 사용할 수 있다. BOJ에서는 필수지만 실제 코테에서는 잘 사용하지 않음. //Str..
개요 CI/CD (Continuous Integration/Continuous Delivery, Continuous Deployment)란 애플리케이션 개발 단계를 자동화하여 애플리케이션을 짧은 주기로 고객에게 제공하는 절차를 말한다. 그 과정에서 코드를 병합하고 build/test하고 서버로 옮기는 과정이 반복되게 되는데, 이러한 반복 작업을 줄이는 것이 CI/CD이다. CI: 지속적인 통합 CI는 애플리케이션 코드의 변경을 정기적으로 build/test하는 과정을 자동화한 것을 말한다. 즉 애플리케이션 코드의 새로운 변경사항이 자동으로 공유 리포지토리에 병합된다. 1. 개발자가 구현한 코드를 기존 코드와 병합한다. 2. 병합된 코드가 올바르게 동작하고 빌드되는지 검증한다. 3. 검증 결과 문제가 있다..
개요 스프링을 사용할때 기본적으로 JPARespository를 이용하여 DB에 대한 쿼리 메소드 기능을 사용하게 된다. 하지만 기본적인 CRUD기능이 아니라 더 복잡한 쿼리문을 작성하기 위해서는 네이티브 쿼리를 작성하거나, jpql을 사용해야 했다. https://eckrin.tistory.com/37 [JPA] 객체지향 쿼리 언어(JPQL) 0. 소개 DB에 접근하기 위해서는 기본적으로 쿼리문이 실행되어야 한다. jpa를 이용하면 기본적인 SQL문이 자동으로 나가게 되긴 하지만, 직접 쿼리문을 작성하여 쿼리를 보내야 할 때를 위해 SQL을 eckrin.tistory.com 하지만 jpql을 작성할 경우, 쿼리문이 복잡해질수록 쿼리 스트링이 길어지게 되고, jpql 문자열 자체에 오타 혹은 문법적인 오류..
스프링 시큐리티와 jwt를 이용하여 api를 개발할때, 사용자의 정보를 제대로 전송하기 위해서는 크게 @AuthenticationPrincipal 어노테이션을 이용하여 인증이 필요한 요청마다 SecurityContextHolder에 저장한 인증값을 가져오는 방법도 있고, HandlerMethodArgumentResolver를 이용하여 토큰에서 인증값을 가져오는 클래스를 직접 만드는 방법이 있다. @AuthenticationPrincipal 사용하기 @AuthenticationPrincipal 어노테이션을 사용하면 UserDetailsService의 loadUserByUsername을 통해서 return한 객체(UserDetails)를 파라미터로 직접 받아서 사용할 수 있다. @PostMapping("/c..
SQL 데이터베이스 시스템에서 자료를 처리하는 용도로 사용되는 언어. 목적에 따라서 DDL(데이터 정의어 - 테이블이나 관계 생성), DML(데이터 조작어 - 테이블의 데이터 CRUD), DCL(데이터 제어어 - 데이터의 사용 권한 관리)로 구분된다. DML (데이터 조작어) 테이블에 데이터를 검색/삽입/수정/삭제하는데 사용되며, select, insert, delete, update문 등이 있다. - SELECT : 테이블에 데이터를 검색하여 출력하는 목적으로 사용되는 쿼리문. 1. ALL | DISTINCT : ALL은 중복허용을 의미하고 (default값), DISTINCT는 중복을 제거하고 집계하는 것을 의미한다. ex) select distinct * from Book; 2. WHERE 절에는 ..
키 키: 특정 튜플을 식별할 때 사용하는 속성(의 집합) 슈퍼키: 유일성을 가진 속성(의 집합) 후보키: 유일성&최소성을 가진 속성(의 집합) 기본키(pk): 후보키 중 대표로 삼는 하나의 키 대리키(pk): DBMS가 임의로 생성하여 사용하는 기본키 외래키(fk): 다른 릴레이션의 기본키를 참조하는 속성 관계대수 1. 셀렉션: 릴레이션에서 조건에 맞는 튜플을 추출하는 연산 2. 프로젝션: 릴레이션의 속성을 추출하기 위한 연산 3. 합집합: 속성이 동일한 두 릴레이션을 합침. 동일튜플 존재시 하나만 표시한다. 4. 교집합: 합병가능한 두 릴레이션이 공통으로 가지고 있는 튜플을 반환 5. 차집합: 첫번째 릴레이션에는 속하고 두번째 릴레이션에는 속하지 않는 튜플을 반환 6. 카티전 프로덕트: 두 릴레이션의 ..
다익스트라(Dijkstra) 알고리즘은 BFS와 dp를 활용한 최단경로 검색 알고리즘이다. 다익스트라 알고리즘은 가중치가 존재하는 그래프의 하나의 정점에서 다른 정점들로 가는 최단 경로를 알려준다. 만약에 가중치가 존재하지 않는다면 단순 BFS를 통해서 최단 경로를 구할 수 있지만, 이 경우 일반적으로 인접 행렬(O(N^2))이나 우선순위 큐(O(ElogV), E:edge, V:vertex)를 사용하여 구현한다. 시작 전에 간단하게 설명하면, 다익스트라 알고리즘은 방문하지 않은 노드들 중에서 시작점으로부터 최소거리를 갖는 노드를 선택하여 노드들의 거리를 갱신하는 것을 반복하는 알고리즘이다. 일단 시작 노드부터 탐색을 시작한다. 정점에 붙어있는 간선 중에서 시작 노드로부터의 거리가 짧은 노드부터 선택하여 ..