전략 패턴(strategy pattern) 전략 패턴은 정책 패턴(policy pattern)이라고도 하며, 객체의 행위를 바꾸고 싶은 경우에 직접 수정하지 않고 "전략"이라고 부르는 "캡슐화된 알고리즘"을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다. 비즈니스 로직을 인터페이스로 만들고, 해당 인터페이스를 구현한 클래스를 사용하도록 만드는 것이라고 생각하면 된다. 우선 Java 코드를 이용한 기본 예제로 알아보고, 추가로 Spring에서 어떻게 전략 패턴을 사용하는지 알아보자. Java 기본 예제 예제로 알아보자. interface : Payment public interface Payment { void pay(int amount); } 구현체 1 : KakaoCardPayment..
Github https://github.com/HSRyuuu/FitnessRecord 1. 개요 프로젝트 명: FitnessRecord 개발 기간: 2023.10.18 ~ 2023.11.18 개발 인원: 1명 주요 기능: 운동(웨이트 트레이닝) 기록, 루틴 공유 커뮤니티 서비스 2. Skills Java 11, Spring Boot 2.7.16, gradle 8.2.1 Spring Data JPA, Spring Security MariaDB, Redis JUnit5 IntelliJ Idea 기타 사용 기술 상세 JWT redisson (분산 락, JWT Token 관리) google GSON Gmail smtp 메일 발송 Swagger 3. 요구 사항 1) 인증, 인가 Spring security 이용 ..
각 디자인 패턴들에 대해 공부하고 정리할 때마다 정리한 글의 링크를 첨부할 예정이다. 디자인 패턴이란? 디자인 패턴은 소프트웨어를 설계할 때 자주 발생하는 문제들을 해결하기 위한 해결책들이다. 상황에 맞는 최적의 디자인 패턴을 결정해서 사용하는 것이 좋다. [ GoF 디자인 패턴 ] 대표적인 디자인 패턴 분류 방식이다. (GoF는 디자인 패턴을 구체화하고 체계화해서 분류한 4명의 인물을 의미한다.) GoF 디자인패턴 분류 방식에 따르면 크게 3가지로 구분된다. 생성 패턴 객체 생성에 사용되는 패턴으로, 객체를 수정해도 호출부가 영향을 받지 않게 한다. 구조 패턴 객체를 조합해서 더 큰 구조를 만드는 패턴이다. 행위 패턴 객체 간의 알고리즘이나 책임 분배에 관한 패턴이다. 객체 하나로는 수행할 수 없는 작..
카운팅 정렬 (Counting sort) 카운팅 정렬은 정렬 시 데이터들의 개수를 세어 카운팅 배열에 저장하고 이후에 하나씩 꺼내오는 방식으로 정렬한다. 특정 조건이 부합할 때만 사용할 수 있지만, 데이터 수가 많더라도 중복된 값이 많이 분포되어 있는 배열을 정렬할 때 효과적이고 빠른 정렬 알고리즘이다. 시간복잡도는 O(N + k)이다. k는 컬렉션(카운팅배열) 내부의 최대 숫자이다. 따라서 최대값이 너무 큰 경우에는 시간복잡도가 매우 커질 수 있다. 카운팅 정렬의 조건 1. 데이터가 양의 정수인 경우 카운팅 정렬은 기본적으로 0~최댓값의 인덱스를 가지는 배열에 데이터 등장 횟수를 카운팅 하는 방식이다. 따라서 양의 정수만 가능하다. 2. 데이터의 크기 범위가 제한 된 경우 위에서 언급했듯이, 최대값이 ..
코딩테스트 공포증 난 코딩테스트가 두려웠다. 그래도 해야 된다니까 조금씩 공부를 하긴 했었다. 그러다 처음 접하는 문제를 풀어보고 좌절했다. 아마 그래프 문제였던 것 같다. 마치 미적분을 처음 접한 학생처럼, 당황스러웠다. 그때까지만 해도 특정 알고리즘이 존재하는지도 몰랐다. 기본적인 배열과 List, Map 같은 기본 자료구조만 사용해서 무작정 문제를 풀다가 DFS, BFS를 처음 만났고, 문제 풀이 방법이 상상도 안 돼서 구글링 해서 답안을 찾아봤다. 그런데 답안을 찾아보니 더 답이 없었다. 이런 걸 어떻게 생각해 내지?라고 생각했다. 그리고는 막연히 다른 거 먼저 공부해야지 하고 포기하고 있었다. 지금 생각해 보면 조금 아쉽다. 그때는 어느 정도 많이 쓰이는 알고리즘들이 존재하는지 조차 몰라서 포기..
다이나믹 프로그래밍 (DP , 동적 계획법) 크고 복잡한 문제를 여러 개의 작고 간단한 문제들로 분리하여 문제를 해결하는 방법이다. 답을 찾아가는 과정에서 작은 문제들을 계산한 결과를 기록하고, 재활용하며 문제의 답을 구하는 방식이다. 중간 계산 결과를 기록하기 위한 메모리가 필요하다. 한번 계산한 부분을 기록해두기 때문에 다시 계산하지 않아서 속도가 빠르다. DP 핵심 원리 DP를 사용하려면 큰 문제를 작은 문제 여러개로 나눌 수 있어야 한다. 작은 문제들이 반복돼 나타나고 사용되며 이 작은 문제들의 결괏값은 항상 같아야 한다. DP 구현 방법 메모이제이션(memoization) 방법 : 모든 작은 문제들을 한 번만 계산해서 DP 테이블에 저장하여, 그 값들을 재사용하는 방법 타뷸레이션(Tabulati..
퀵 정렬 (Quick sort) 퀵 정렬은 기준값(pivot)을 선정해 해당 값보다 작은 데이터와 큰 데이터로 분류하는 것을 반복해 정렬하는 알고리즘이다. 시간복잡도가 비교적 빠르기 때문에 코딩테스트에서도 종종 응용한다. 평균 시간복잡도는 O(nlogn)이고, 최악은 O(n^2)이다. 이미 정렬돼 있는 배열에 적용할 때 최악의 시간복잡도를 가진다. 퀵 정렬(Quicksort)은 찰스 앤터니 리처드 호어가 개발한 정렬 알고리즘이다. 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬에 속한다. 퀵 정렬의 내부 루프는 대부분의 컴퓨터 아키텍처에서 효율적으로 작동하도록 설계되어 있고, 대부분의 실질적인 데이터를 정렬할 때 제곱 시간이 걸릴 확률이 거의 없도록 알고리즘을 설계하는 것이 가능하다. 또한 매 단계에..
플로이드 - 워셜(floyd - warshall) 알고리즘 플로이드 - 워셜 알고리즘은 그래프에서 최단 거리를 구하는 알고리즘이다. 시작점을 정해놓고, 해당 시작점에서 다른 모든 노드로의 최단거리를 구하는 다익스트라, 벨만-포드 알고리즘과 다르게 각각의 모든 노드에 대하여 다른 모든 노드로의 최단거리를 구할 수 있는 알고리즘이다. 모든 노드 간에 최단 경로를 탐색할 수 있다. 음수 가중치 간선이 있어도 수행할 수 있다. 동적 계획법을 이용하여 코드가 비교적 간단하다. 다른 알고리즘과 다르게 모든 노드사이의 최단거리를 도출하는 알고리즘이기 때문에 3중 for문을 이용한다. 시간 복잡도는 O( N^ 3)이다. 플로이드 - 워셜 알고리즘 동작 원리 1. 핵심 이론 2차원 배열에 모든 노드에 대하여 다른 모든 ..