전체 글 235

Factory Pattern - 생성

👣 문제 상황 객체 생성 부분이 변경 가능성이 농후한 경우, 전체 소스 코드를 살펴보지 않기 위해 객체 생성 부분만을 따로 떼어내야 할 필요가 있을 때 목적: 객체 생성 부분 유연성 향상 👣 해결 방법 abstract class Coffee { public abstract int getPrice(); } class Latte extends Coffee { private int price = 6000; public int getPrice() { return this.price; } } class Americano extends Coffee { private int price = 5000; public int getPrice() { return this.price; } } class CoffeeFactory..

디자인 패턴 2023.07.19

Singleton Pattern - 생성

👣 문제 상황 필드에 데이터를 가공하고 보유하는 클래스가 아닌 메서드를 사용하기 위해서 사용하는 클래스의 경우 굳이 여러 개의 객체를 만들어서 사용할 이유가 전혀 없다. 오히려 여러 개를 만들면 GC의 가동 빈도만 늘리거나 최악의 경우 메모리 누수도 일으킬 수 있기 때문에 객체를 굳이 2개 이상으로 만들 필요가 없는 경우는 많다. 👣 해결 방법 자바의 경우 7가지 방법이 있다. 1. Eager Initialization - 이른 초기화 정적 필드를 이용한다. public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public Singleton getInstance() {..

디자인 패턴 2023.07.19

디자인 패턴이란?

👣 정의 소프트웨어 공학에서 반복적으로 발생하는 문제를 해결할 수 있는 일련의 해결책들을 재사용 가능한 형태로 정리한 것. 👣 구성 요소 앞으로 아래 규격에 맞춰 게시물을 작성한다. 패턴 이름 문제 상황 해결 방법 결과 👣 유래 GoF(Gang of Four)라고 알려진 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides의 저자들이 처음으로 정리한 "Design Patterns: Elements of Reusable Object-Oriented Software"이라는 책에서 소개됨.

디자인 패턴 2023.07.19

동적 계획법

👣 개요 기존의 복잡한 문제를 간단한 작은 문제로 나눠 점차 해결해나가는 문제 풀이법. 점화식을 세우고 초기값을 이용해 원하는 목표를 달성한다. 👣 적용 사례 1 - 프로그래머스 '도둑질' 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이 문제는 점화식을 다음과 같이 설정했다. F(n) = max( F(n-1) , F(n-2) + money[n] ) F(n) : n 번째까지의 갈취한 돈의 최대값. (n 까지 턴 돈) = (n-1 까지 턴 돈)과 (n-2까지 털고 n을 턴 돈) 중 더 많은 돈. 그리고 초기값은 2가지 상황을 상정해 설정했다. 시나리오 1)..

다익스트라

👣 개요 특정 노드에서 나머지 모든 노드로의 최단거리를 계산하는 알고리즘 최단 경로 문제를 해결하기 위한 그래프 탐색 알고리즘. 그리디 알고리즘가 쓰여 매 순간 가장 최단거리만 선택해서 계산한다. 이 알고리즘을 사용하려면 음의 가중치를 가지지 않은 그래프여야 한다. 여기서 음의 가중치라는 것은 경로를 움직일 때마다 Cost가 늘어나야지 줄어들면 안 된다는 것이다. 👣 복잡도 평균 Big O 표기법 O((V + E)logV) V는 노드 갯수, E는 그래프 간선 수 👣 알고리즘 절차 그래프의 시작 노드를 선택합니다. 시작 노드에서부터의 시작 노드의 거리는 0으로 설정합니다. 나머지 노드들의 거리는 무한대(infinity)로 초기화합니다. 시작 노드를 포함한 모든 노드들을 탐색하기 위해 다음 과정을 반복합니다..

DFS & BFS

👣 개요 그래프 탐색 알고리즘으로 DFS는 Branch를 탐색할 때, 끝까지 탐색 후에 다른 Branch로 넘어가고 BFS는 특정 노드에 인접한 노드를 최우선으로 탐색한다. 👣 알고리즘 절차 👣 DFS - 재귀 함수 시작 노드에서 함수를 호출하고, 방문한 노드에서 다시 함수를 호출합니다. 노드 말단에서 조건문에 의해 더 이상 함수를 호출하지 않을 때까지 반복합니다. 👣 DFS - Stack 시작 노드를 방문하고, 방문한 노드를 Stack에 넣습니다. Stack에서 가장 최근에 넣은 노드를 꺼내고, 해당 노드의 인접한 미방문 노드를 방문합니다. 이후, 방문한 노드를 Stack에 넣습니다. Stack이 빌 때까지 2단계를 반복합니다. 👣 BFS - Queue 시작 노드를 방문하고, 방문한 노드를 Queue에..

이분 탐색

👣 개요 쉽게 말해서 정답을 찍는 방법이다. 다만, 스무 고개 처럼 범위를 점차 줄여가며 찍는 범위를 점차 줄여가는 방법이다. 보통 문제를 직접 풀 수가 없지만 정답값이 주어졌을 때, 해당 값이 정답인지 아닌지 확인하기 더 수월할 때, 사용한다. 👣 복잡도 평균 Big O 표기법 O(log n) 👣 알고리즘 절차 시작점과 끝점을 설정합니다. 시작점과 끝점을 이용하여 중간점을 계산합니다. 중간점은 (시작점 + 끝점) // 2로 구할 수 있습니다. 중간점의 값과 찾고자 하는 값과 비교합니다. 중간점의 값이 찾고자 하는 값보다 크면, 찾고자 하는 값은 중간점의 왼쪽에 위치하므로 끝점을 중간점의 이전 인덱스로 업데이트합니다. 중간점의 값이 찾고자 하는 값보다 작으면, 찾고자 하는 값은 중간점의 오른쪽에 위치하므..

Auto Boxing & Auto UnBoxing

👣 개요 Java에는 Wrapper 클래스가 존재한다. Wrapper 클래스란 기본 타입 클래스[Ex) int]를 객체로 다뤄야 할 때, 사용하는 클래스다. 내부에 기본 타입의 데이터를 가지고 있고 그것을 다루기 위한 유틸리티 메서드로 구성되어 있다. 사용 예시 1. 제너릭 타입을 요구하는 클래스를 사용할 때, List arr = new ArrayList(); 2. Wrapper 만 가지고 있는 상수 or 메서드를 사용하기 위해, Integer max_value = Integer.MAX_VALUE; Integer str2int = Integer.valueOf("123"); 👣 Auto Boxing & Auto UnBoxing // 박싱 int i = 10; Integer num = new Integer(..

Java 2023.07.17