접근 방법 target 보드 위에 beginning을 덮는다고 생각해보면 (XOR 연산), 어느 돌을 뒤집어야할지 표시하는 것과 비슷한 효과를 보인다. 같은 행 및 열을 두번 뒤집으면 안뒤집은 것과 마찬가지다. 열과 행은 한번씩만 뒤집으면 된다. 각 행을 기준으로 순회를 하며, 그 행과 똑같은 행이면 넘어가고 뒤집은 것과 비슷한 행은 뒤집어주고 뒤집은 갯수를 1을 추가한다. 두 조건 모두 만족하지 못한다면 정답을 찾을 수 없는 경우이기 때문에 바로 -1을 반환해준다. 여기서 해당 행에 1이 있다면 다시 뒤집어야 한다는 것이기 때문에 행을 뒤집은 것 + 행에 있는 1의 갯수를 기준으로 최소 값을 반환하면 정답이다. 코드 def solution(beginning, target): xor = [[0] * le..
접근 방법 (다익스트라) 한 노드에서 특정 노드까지 경로 중 최적의 조건을 만족하는 값을 구하는 문제이기 때문에 다익스트라를 적용할 수 있다 (최적화) 경로의 조건 중 중복 조건 혹은 최소 조건은 없기 때문에, 모든 게이트 노드에서 각 노드에 도달하기 까지의 최대 쉬는 시간은 공유된 것처럼 봐도 무방하다. 그렇기 때문에 모든 게이트 노드에서 동시에 시작하면 연산 시간을 아낄 수 있다. (최적의 조건) 모든 노드의 최대 휴식 시간을 기억하고 있는 weights 배열을 두고, 모든 게이트 노드를 우선순위큐에 넣는다. 큐에서 뺄 때마다 a) 현재까지 가장 긴 휴식시간과 b) 종착지 노드가 나올 텐데, 이 때 a의 값이 weights 배열의 종착지 노드 위치의 값보다 크면 이미 최적 조건 달성을 못하기 때문에 ..
개요 최근 DB 성능 분석에 대한 이야기를 우연히 많이 접하고 있어 한번 정리하면 좋을 것 같다는 생각이 들어서 공부한 내용을 정리한다. DB 성능을 높이는 기법은 다양하게 있지만, 그 중 물리적으로 큰 데이터베이스의 처리 성능을 향상시킬 때 자주 사용되는 파티셔닝은, 큰 테이블이나 인덱스를 물리적으로 분할하는 기법을 말한다. 여기서 중요한 점은 데이터베이스에 액세스하는 애플리케이션의 관점에서 대상 데이터베이스가 파티셔닝이 된 것을 모르고도 잘 동작이 되어야 한다는 점이다. 파티셔닝의 종류 파티셔닝은 수직적(Vertical) 또는 수평적(Horizontal)으로 수행할 수 있는데, 칼을 가지고 테이블을 수직으로 자르냐 수평으로 자르냐의 메타포로 이해하면 편하다. 수직 파티셔닝은 하나의 엔티티에 저장된 데..
접근 방법 (누적합) Naive하게 i가 0 부터 끝까지 모든 범위의 sum을 구한다면 시간 초과가 날 것은 명백하다. 따라서 logs의 입력을 받을 때, 시청 시작시간과 종료시간만 각각 += 1과 -=1로 마크 해놓은 다음 모든 전처리가 끝나면 마크 해놓은 곳을 0 부터 play_time까지 오른쪽으로 땡겨준다. 그 후엔, 매번 sum을 안구해도 되도록 각 index에 대한 누적합을 미리 계산 해놓는다. (탐색) 우리가 알고 싶은 것은 최대 누적 시간이기 때문에 adv_time만큼의 Sliding Window를 두고 0부터 되는 데까지 이동하면된다. 그 과정에서 특정 구간의 최대 누적 시간은 미리 구해놓은 누적합 배열의 adv_time - i 값에서 i를 뺀 값일 것이다. (구조화) 시간의 String..

1. Dock Desktop 설치 2. Gradle bootJar로 Jar 파일 생성 3. Gradle bootBuildImage로 컨테이너 이미지 생성 4. 아래의 명령어로 컨테이너를 띄워서 어플리케이션 동작을 테스트 하려는데 에러 발생 sudo docker run --name dailysteady -it -p 9000:9000 \ --rm --env JAVA_OPTS="-Dspring.profiles.active=local" \ lkslyj2/dailysteady:latest 5. 에러 로그를 보니까 PostgreSQL에 연결이 실패하는데 이걸 해결하려면 postgresql.conf의 allow ip 리스트의 주석을 풀어주고 원래 localhost만 허용하던 것을 *로 변경해야 함 6. 기왕 CI/C..
이미지화? 우리가 만든 Spring Boot 프로젝트를 빌드하면 리소스를 jar나 war같은 패키지가 생성되는데, 이 패키지 파일을 JRE로 실행시키면 해당 프로젝트가 JVM 동작한다. 하지만 운영 환경에 배포를 해야 할 때마다 패키지 파일을 수동으로 전송한 다음에 운영 환경에서 직접 프로젝트를 실행시키면 번거로울 뿐더러 개발 환경의 불일치가 있을 수 있기 때문에 어쩔 수 없는 실수의 여지가 생긴다. 이런 현상을 방지하기 위해 사용하는 것이 컨테이너 기술이다. 어떤 실행 환경을 나중에 그 상태 그대로 사용할 수 있는 상태로 캡처하면 이미지로 만든다고 하고, 그 이미지를 containerd, Docker Engine과 같은 컨테이너 엔진에서 구동시키면 캡처한 상태 그대로 하나의 컨테이너화 할 수 있기 때문..
개요 Java에서 String은 char(문자)가 나열되어 있는 자료구조인 문자열을 구현한 객체이다. 자바의 String에 대해 좀 찾아보니, 다른 언어와는 다른 Java String의 특징이 있어서 나중에 참고할 겸 정리를 해본다. String 리터럴 Java String은 int, bool 등의 기본 자료형들과 똑같이 리터럴로 표현할 수 있다는 점에서 특별취급을 받는 객체다. 왜냐하면 기본 자료형은 변수에 명시된 값이 그대로 들어가는 반면, 객체는 참조 값이 변수에 저장되기 때문이다. 자바 스트링 풀 String을 리터럴로 정의하면 JVM 메모리의 힙 영역에 있는 '자바 스트링 상수풀'이란 곳에 해당 스트링 값을 보관한다. 그 뜻은 동일한 리터럴을 두 개의 다른 변수에 저장시키면 두 변수는 동일한 S..
접근 방법 이 문제는 총 세 가지의 소문제로 나눠서 생각하면 좋다 입력받은 십진수 문자열을 이진수 문자열로 변환 포화이진트리를 구현하기 위해 왼쪽에 더미 노드를 패딩(LPAD) 처리 마지막으로 문제 조건을 만족 가능한 포화이진트리인지 판단 십진수를 이진수로 변환할 때 쓰는 보편적인 방법으로 2씩 나누면서 나머지를 문자열로 더해주고 그 결과 값을 뒤집어주는 방식을 사용할 수 있지만... 그냥 시간을 아끼기 위해서 내장 함수인 Long.toBinaryString()을 사용해서 실제 이진 문자열 길이 actualStringLength 값을 구한다. 포화이진트리(CBT)의 특성 중 하나는 깊이 N인 CBT의 노드의 갯수는 N ** 2 - 1라는 점이다. 이 부분은 직접 공책에 이진 트리를 그려보면 쉽게 알 수 ..
- Total
- Today
- Yesterday
- 듄 파트 2
- cicd
- 직렬화
- dp
- 파티셔닝
- 인덱스
- dfs
- protobuf
- csv
- tree
- Docker
- 인문
- 듄
- spring boot
- 정규화
- json
- 하이재킹
- kotlin
- Everything Everywhere All at Once
- 리뷰
- 프로그래머스
- 역직렬화
- 누적합
- 영화
- 이해
- 영화 후기
- 행동분석
- 후기
- 샤딩
- DB
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |