분류 전체보기 29

Manacher 알고리즘 (Manacher's Algorithm)

✅ 팰린드롬(palindrome) 이란?팰린드롬은 순방향으로 읽었을 때와 역방향으로 읽었을 때 같은 문자열을 의미한다.문자열뒤집은 문자열결과AApalindromeBBBBpalindromeABDDSSDDBAnot palindromeABDDBAABDDBApalindrome  🤔 문제: 가장 긴 팰린드롬 부분 문자열(palindrome substring) 찾기BANANANA 문자열에서 가장 긴 팰린드롬 부분 문자열은 BANANANA 이다.이렇게 특정 문자열에서 가장 긴 팰린드롬 부분 문자열을 구하려면 어떻게 해야할까? 💡 기존 풀이아마 이 문제가 나오면 문자열의 길이가 O(N^2)의 시간복잡도로 해결할 수 있을 정도로 짧게 주어질 것이다. 그러니 냅다 풀어보자. (1) 팰린드롬의 중심 문자부터 탐색홀수 길..

[heap] heapify(build heap)의 시간 복잡도

힙(heap) 힙은 아래 속성을 만족하는 완전 이진 트리(complete binary tree) 기반 자료구조다. 최대 힙(max heap)에서 주어진 노드 C에 대해 P가 C의 부모 노드라면 P의 키(값)는 C의 키보다 크거나 같다. 최소 힙(min heap)에서는 P의 키가 C의 키보다 작거나 같다. Sift Up 연산 힙에 노드를 추가할 때는 sift up 연산이 동작한다. 해당 연산은 리프 노드의 값으로 시작해 값을 위 노드의 값과 연속적으로 교환하여 값을 루트를 향해 경로 위로 이동한다. 위(부모) 노드와 비교해 트리의 속성을 만족할 때까지, 또는 루트 노드에 도달할 때까지 연산을 계속한다. 최소 힙에 노드(값 18)를 추가하는 과정 위 영상에서 새 노드(값 18)은 완전 이진 트리를 만족하기 ..

[ZI9ZA9] 결제 성능 개선기

🔗 github.com/wootecam-gugucon/shopping-mall 우리 ZI9ZA9(이하 지구재구) 쇼핑몰에서는 당연히 결제 기능이 존재한다. 실제 출시할 서비스가 아니지만 최대한 비슷한 환경을 구현하고 싶어 테스트 키로 토스페이먼츠를 사용했다. (자사 포인트 결제도 제공하지만 이 포스팅에서는 생략하겠다.) 💸 결제 플로우 1. 주문서 생성 원하는 의류를 장바구니에 담고 주문하기 버튼을 누르면 서버에서 주문 및 주문 상품 데이터가 생성된다. 아직 사용자가 주문을 요청만 했으므로 주문 상태는 CREATED, 결제 상태는 NONE 이다. 프론트에서는 API 응답으로 받은 주문 데이터 id로 아래 결제하기 페이지를 불러온다. 결제 수단 중 일반 결제가 토스페이먼츠 결제를 의미한다. 2. 결제 요청..

프로젝트 2024.03.17

[Floney] 카테고리 리팩토링 일대기

🍀 기존 상황 도메인 우리 가계부에서 하나의 가계부 내역은 지출/수입/이체로 구분되고, 자산과 분류 항목으로 세부적으로 다시 구분된다. 이 세 가지를 편의상 카테고리로 통칭한다. 지출/수입/이체 (이후 상위 카테고리라 칭함): 가계부 내역의 종류 분류 (이후 하위 카테고리라 칭함): 위 지출/수입/이체의 하위 분류 (ex. 식비, 월급 등) 자산 (이후 하위 자산 카테고리라 칭함): 가계부 내역의 자산 출처 (ex. 현금, 카드 등) 이를 계층적으로 정리하면 다음과 같다. 이 카테고리들은 가계부 별로 관리된다. 이 때 하위 카테고리는 가계부 생성 시 기본적으로 N개가 주어진다. 이를 기본 카테고리라고 부르겠다. 기본 카테고리는 사용자가 임의로 삭제 및 수정을 할 수 없다. 위 화면에 보이는 자산의 현금..

프로젝트 2024.03.11

[Unicode] Unicode의 Code Point와 문자열의 길이

문제 utf8mb4을 사용하는 MySQL에서 한 테이블에 자료형이 varchar(1)인 'name' 컬럼이 있다. 그 테이블에 다음과 같은 쿼리를 실행하면 결과는 어떻게 될까? insert into test(name) values('✅'); insert into test(name) values('🇰🇷'); 정답 첫번째 쿼리는 성공하고, 두번째 쿼리는 "Data too long for column name 'name'"으로 실패한다. 같은 이모티콘이고 varchar 자료형을 사용했음에도 왜 다른 길이로 인식된 걸까? Unicode (유니코드) 유니코드(The Unicode Standard)는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다. 한글, 한자, 영어 등의..

etc 2024.01.11

[2023년 하반기] preschooler 개발자의 6개월

junior 개발자가 되는 그 날까지... 🤬😢 우아한테크캠프 두 달짜리 짧은 과정이었지만 끝난 이후 반 년이 지난 지금까지도 많은 영향을 주고 있다. (배민 앱 삭제... 라던가? ㅋ) 캠프에 지원하면서 가졌던 목표는 크게 두 가지였다. 개발에 열정적인 동료들을 얻는 것이 첫번째였고, 우물 밖 개구리가 되는 게 두번째였다. 그리고 모두 다 이루었다. TDD, OOP, MySQL, JPA 등 다양한 분야에 대해 접하고 기술적으로 크게 성장할 수 있었다. 캠프 전과 비교했을 때 우물 밖 개구리가 되었다고 확실하게 말할 수 있다. 하지만 가장 큰 업적(?)은 열정적인 동기들을 얻은 것이다. 하루 12시간 동안 개발을 하면서도 밥 먹을 때까지 코드에 대해 토론하는 동기들을 보며 가끔은 체할 것 같았지만 ㅎㅎ ..

개발일상/회고 2024.01.10

[Floney] 자산 데이터 동시성 이슈 해결 삽질기

🍀 https://github.com/Floney-2023 우리 가계부에서 자산은 가계부 내역 중 지출(-)과 수입(+)의 합을 의미한다. 이 자산이라는 개념은 설계 과정부터 어려움이 있었는데, 하나의 지출 혹은 수입이 생기면 그에 따라 해당 내역 날짜 이후로 매 달의 지출 데이터가 갱신되어야 하기 때문이다. 다른 가계부 서비스를 참고해 자산이 갱신되는 특정 기간(5년)을 정해서 가계부 내역 변경 시 매 번 60개(5년 * 12달)의 자산 데이터가 갱신되도록 정하면서 이 문제는 마무리되었다. 문제 발생 - 의도되지 않은 자산 데이터 추가 생성 앱이 출시된 후, 가계부 내역을 수정하는 과정 중 자산 삭제 메서드에서 에러가 발생했다. NonUniqueResultException으로 하나의 자산 데이터만 조회..

프로젝트 2023.12.14

[OOP] 'The Single Responsibility Principle' by Robert C. Martin 번역

원글: https://blog.cleancoder.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html 📌 번역이 틀릴 수 있으며, 자의적으로 불필요하게 여겨지는 부분은 제외했습니다. 본문 1972년, David L. Parnas는 논문을 출간했다. 논문의 마지막에서 그는 다음과 같은 결론을 내린다. 우리는 플로우차트를 기반으로 시스템을 모듈로 분해하는 과정을 시작하는 것이 잘못되었다고 주장해왔다. 대신 어렵거나 변경될 가능성이 있는 설계 결정 목록으로부터 시작할 것을 제안한다. 각 모듈은 다른 모듈로부터 그러한 결정을 숨기도록 설계되어야 한다. 나는 마지막 두 문장에 특히 공감한다. Parnas는 모듈이 변경 가능성을 기반으로 분리되어야 한다고 말한다..

[Spring Data JPA] jpa.generate-ddl과 jpa.hibernate.ddl-auto 프로퍼티

참고 https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/html/howto-database-initialization.html https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch03.html JPA를 사용한 데이터베이스 초기화 JPA에는 DDL 생성 기능이 있으며, 어플리케이션 시작 시 실행되도록 설정할 수 있다. 이를 다루는 두 가지 속성이 spring.jpa.generate-ddl과 spring.jpa.hibernate.ddl-auto 이다. HBM2DDL_AUTO 프로퍼티 위 두 프로퍼티는 Hibernate의 HBM2DDL_AUTO 프로퍼티 값을 결정한다. 그렇다면 이 HBM2..

[Spring Boot] @SpringBootTest를 사용한 테스트의 격리

이전 방식: @DirtiesContext를 통한 격리 https://github.com/wootecam-gugucon/shopping-mall 프로젝트에서 @SpringBootTest로 통합 테스트를 진행할 때 @DirtiesContext를 사용해 테스트 간 격리를 시켰다. @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class IntegrationTest { // 기타 설정 } https://docs.spring.io/spring-framework/referenc..