위상정렬사이클이 없는 방향 그래프(DAG)의 모든 노드를 방향성에 거스르지 않도록 순서대로 나열하는 것입니다.진입 차수(Indegree) : 특정한 노드로 들어오는 간선의 개수진출 차수(Outdegree) : 특정한 노드에서 나가는 간선의 개수큐를 이용하는 위상 정렬 알고리즘의 동작 과정진입차수가 0인 모든 노드를 큐에 넣습니다.큐가 빌 때까지 다음의 과정을 반복합니다.큐에서 원소를 꺼내 해당 노드에서 나가는 간선을 그래프에서 제거합니다.새롭게 진입차수가 0이 된 노드를 큐에 넣습니다.결과적으로 각 노드가 큐에 들어온 순서가 위상 정렬을 수행한 결과와 같습니다.위상 정렬 특징위상 정렬은 DAG에 대해서만 수행할 수 있습니다.DAG(Direct Acyclic Graph) : 순환하지 않는 방향 그래프위상 ..
전체 글
클라이언트 IP 가져오기 서버로의 요청이 프록시나 로드 밸런서를 거칠 때 클라이언트의 실제 IP 주소를 정확하게 가져오는 방법에 대해 알아보겠습니다. 기본적인 방법과 프록시 서버, 로드 밸런서 등의 환경에서 사용할 수 있는 방법을 설명하겠습니다. 기본 방법 : request.getRemoteAddr() 가장 기본적인 방법으로 HttpServletRequest 객체의 getRemoteAddr() 메서드를 사용하면 클라이언트의 IP 주소를 가져올 수 있습니다. import javax.servlet.http.HttpServletRequest;private String getClientIpAddress(HttpServletRequest request) { request.getRemoteAddr();} 이..
완전탐색이란?완전탐색이란, 모든 경우의 수를 통한 해결 방법입니다. 기본적으로는 브루트 포스(Brute Force)라고도 합니다. 상대적으로 간단한 방법이지만 경우의 수가 많으면 많아질수록 시간이 오래 걸린다는 단점이 있습니다. 그래도 직관적이어서 이해하기 쉽고 문제의 정확한 결과값을 얻을 수 있는 기초적인 방법입니다. * 경우의 수에 따라서 실행 시간이 비례할 수 있기 때문에 입력 값의 범위가 작은 경우에 유용하게 사용됩니다.완전탐색 기법 - 코딩 테스트가능한 모든 경우의 수, 방법을 고려해야 합니다.해결할 문제의 가능한 만큼 경우의 수를 계산해 봅니다.실제로 답을 구할 수 있는지 적용해 봅니다.완전탐색 종류탐색 알고리즘에는 선형 탐색, 이진 탐색, 완전 탐색 총 3가지 큰 분류로 나눌 수 있습니다.그..
알고리즘이란, CS에서 어떠한 문제를 어떻게? 해결하기 위한 방법이고, 이 어떠한 문제를 해결하기 위한 방법은 다양합니다.이 다양한 방법(알고리즘) 간에 효율성을 비교하기 위해 빅오(Big O) 표기법을 보통 가장 많이 사용합니다. 빅오 표기법은 알고리즘의 효율성을 표기해 주는 표기법이다. 💡 빅오 표기법(Big O Notation)이란?빅오 표기법은 보통 알고리즘의 시간 복잡도와 공간 복잡도를 나타는데 주로 사용됩니다.각각 시간 복잡도는 알고리즘의 시간 효율성을 의미하고, 공간 복잡도는 알고리즘의 공간 즉, 메모리 효율성을 의미합니다.시간/공간 복잡도를 나타내는 방법은 점근 표기법이라고 해서 빅오(O), 빅오메가(Ω), 빅세타(Θ) 표기법이 있다.Big-O Notation O(N) : 최악의 경우B..
Bubble Sort(버블 정렬)이란?버블 정렬은 정렬 과정에서 원소의 이동이 마치 거품이 수면 위로 올라오는 것과 같다고 해서 '버블'이라는 이름이 붙여졌습니다.버블 정렬은 정렬 알고리즘 중 가장 간단한 알고리즘 중 하나로, 두 개의 인접한 원소를 비교해서 정렬하는 방식으로 정렬합니다.보통 버블 정렬은 구현이 간단하지만 비효율적이므로, 교육용으로 알고리즘의 기본 개념을 설명하거나 작은 데이터셋에 사용하고 있습니다.사용 사례대규모 데이터에는 적합하지 않기 때문에 데이터 셋이 작은 경우에 사용합니다.초기 프로그래밍 교육 시 자료로 사용합니다.버블 정렬의 특징버블 정렬은 데이터를 비교하면서 찾기 때문에 비교 정렬이며,정렬의 대상이 되는 데이터 외에 추가적인 공간을 거의 필요로 하지 않기 때문에 '제자리 정렬..
HTTP는 모든 웹 개발자가 알아야 하는 프로토콜로, 전체 웹을 구동합니다.HTTP를 이해하면 애플리케이션을 개발하는 데 도움이 될 수 있기 때문에 HTTP가 무엇이고, 어떻게 탄생했는지, 그리고 현재 어떤 위치에 있는지 학습하면 좋습니다.HTTP 기본 개념HTTP란?HTTP는 웹에서 클라이언트와 서버 간의 통신을 위한 응용 계층 프로토콜입니다. 주로, HTML 문서와 같은 리소스들을 주고받는 데 사용됩니다.HTTP의 특징클라이언트 - 서버 모델상태가 없는(Stateless) 프로토콜확장 가능한 프로토콜HTTP 버전HTTP/1.0 : 기본적인 기능 제공HTTP/1.1 : 성능 개선, 영속적 연결 도입HTTP/2 : 멀티 플렉싱, 헤더 압축 등 성능 대폭 개선HTTP/3 : QUIC 프로토콜 기반, 더 빠..
DockerFile → (Build) → Image → (Create) → Container 도커 파일(Docker File)도커 파일은 도커 이미지를 빌드하는 출발점으로, 이미지를 구성하기 위한 명령어들을 작성한 스크립트입니다. 이 도커 파일에는 컨테이너를 구동하기 위해 필요한 정보가 작성되어 있으며, 이를 빌드하면 이미지가 생성되며, 애플리케이션 빌드 및 배포를 자동화할 수 있습니다.# 사용할 베이스 이미지FROM java:17# 작업 디렉토리 설정WORKDIR /app# Gradle 빌드 캐시를 가져옴COPY gradle gradle# Gradle 설정 파일 및 응용 프로그램 소스 코드를 가져옴COPY gradlew* ./COPY build.gradle settings.gradle ./COPY sr..
Java LinkedList : 효율적인 데이터 삽입과 삭제를 위한 연결 리스트Java에서 LinkedList는 List 인터페이스를 구현한 또 다른 중요한 자료구조입니다. LinkedList는 이중 연결 리스트(doubly linked list)로 구현되어 있어, 삽입과 삭제가 빈번한 경우 특히 유용합니다.LinkedList란?LinkedList는 List 인터페이스와 Deque 인터페이스를 구현한 클래스입니다. 이 자료구조는 이중 연결 리스트를 기반으로 하며, 각 요소가 자신과 다음 요소의 참조(reference)를 포함한 노드(node)로 구성됩니다. 배열과 달리 요소들이 물리적으로 연속된 위치에 저장되지 않으며, 삽입 및 삭제 작업이 효율적으로 수행됩니다.LinkedList의 주요 특징빠른 삽입과..
반복문 - for, while, do-while반복문은 특정 조건을 만족하는 동안 반복적으로 코드를 실행하는 구문입니다.자바에서는 대표적으로 for문, while문, do-while문이 있으며, 반복 구조와 조건 검사의 위치에 따라 다르게 동작합니다.for문for문은 반복 횟수를 미리 알고 있을 때 사용하는 것이 좋습니다.for문은 아래와 같이 [초기화/조건식/증감식/블록] 4가지로 구성되어 있으며,조건식이 참일 때마다 블록 내 문장이 반복적으로 수행되며, 조건식이 거짓이 될 때 반복문을 탈출합니다.for(초기화; 조건식; 증감식) { // 조건식이 참일 때 수행될 문장을 작성합니다.}초기화 : 반복문에 사용될 변수를 초기화하는 부분으로 처음에 한 번만 수행합니다.조건식 : 조건식이 참일 경우에 반..
ArrayList란? ArrayList 클래스는 Java의 List 인터페이스를 구현한 가장 많이 사용하는 클래스 중 하나로, Array와 List의 장점을 결합한 자료구조입니다. 기본적으로 크기가 고정된 배열과 달리, ArrayList는 요소가 추가됨에 따라 자동으로 크기가 확장되며, 이로 인해 데이터를 동적으로 관리할 수 있습니다. ArrayList는 내부적으로 배열을 사용하여 데이터를 저장하지만, 이 배열의 크기가 가득 차면 새로운 크기의 배열을 생성하고 기존 배열의 요소들을 복사하여 관리합니다. ArrayList의 주요 특징동적 크기 조정: ArrayList는 데이터가 추가됨에 따라 자동으로 크기를 확장합니다. 배열의 경우 고정된 크기를 가지지만, ArrayList는 필요에 따라 크기가 조정되어 ..