-
MVVM
MVVM MVVM - (Model-View-ViewModel)은 UI와 비즈니스 로직을 분리하여 코드의 관리와 유지보수를 용이하게 만든다. MVVM 패턴은 3가지 구성요소로 나뉜다. Model 데이터와 비즈니스 로직을 포함 데이터와 비즈니스 로직을 담당하는 부분 데이터를 가져오고 저장하는 역할을 수행 데이터베이스, 네트워크 요청, 웹 서비스 호출 등 백엔드와의 통신 View 사용자에게 보여지는 UI 부분 사용자 인터페이스를 담당하는 부분 레이아웃과 화면을 보여주고 표시하며, 사용자 입력을 처리 ViewModel을 통하여 인터페이스의 ... Read More
-
알고리즘- 에라토스테네스의 체(Sieve of Eratosthenes)
Sieve of Eratosthenes 고대 수학자 에라토스테네즈가 만들어낸 소수를 찾는 방법. 마치 체를 사용하여 수를 걸러내는 듯한 방법으로 ‘에라토스테네즈의 체’ 라고 불린다. $f(x) = \frac{x}{1p(x)}$ 의 수열을 표로 시각화 한 것으로 볼 수 있다. 과정 예를 들어 1 ~ 100까지의 수들 중에서 소수를 찾는다고 가정하자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ... Read More
-
[Pub/Sub]
Pub/Sub Pub/Sub은 Publisher와, Subscriber를 사용하여 비동기적으로 통신하는 방법이다. YouTube의 채널을 구독하여 알람을 받거나, 메세지를 주고받을때 활용할 수 있는 방법이다. 이벤트를 발행하는 Publisher가 특정 Channel에 이벤트를 전송하고, Channel을 구독하고 있는 Subscriber가 해당 이벤트를 받는 방식으로 동작한다. Pub/Sub의 방식은 대표적으로 2가지가 있다. KAFKA KAFKA에서는 Producer/Consumer라는 개념이 있는데 이것은 Publisher/Subscriber와 동일하다. Producer는 Topic에게 이벤트를 보... Read More
-
[React]- React isComposing, 한글 두번 입력되는 버그
원인 React에서 input 태그를 이용하여 한글을 입력할때, 두번 입력되는 경우가 발생한다. 이는 한글이 자음과 모음으로 이루어져 있기 때문이다. 그리하여 한글을 입력할때 즉, 자음과 모음을 입력할 때, IME가 입력중임을 나타내는 isComposing 상태가 된다. 이때 다른 키가 입력되면 IME는 해당키를 모음으로 인식하여 한글자로 처리한다. IME와 isComposing isComposing은 IME(Input Method Editor)에서 사용되는 이벤트의 속성이다. IME는 사용자의 입력을 처리하고 문자를 조합하여 최종적으로 입력한 값은 생성하는 도구로, 한자나, 한글, 히라가나와 가타카나와 같... Read More
-
[NestJS]- NestJs Guards
Guards Guards@Injectable() 데코레이터 주석이 달리고 CanActivate 인터페이스를 구현하는 클래스다. NestJS의 Guard는 특정 상황(Permission, Roles, 등)에 따라서 주어진 요청이 라우트 핸들러에 의해서 처리 될지 말지를 결정하는 역할을 한다. 즉 Controller단에 도달하기 이전에 Guards를 거쳐가도록 되어있다. Guard는 모든 MiddleWare 다음에 실행되고, Interceptor나 Pipe 이전에 실행되기 때문에 Authorization을 구현하는데 많이 사용되며, 권한에 따른 접근 가능한 기능이 분리 되어있을때 이를 구현하기 위해 많이 사용하며... Read More
-
[NestJS]- NestJs Pipes
Pipes Pipes는 @Injectable() 데코레이터로 주석이 달린 클래스이다. Pipes는 두가지 사용 방법이 있다. Transformation(변환) : 입력데이터를 원하는 형식으로 변환 할 수 있다. Validation(유효성 검사) : 입력 데이터의 유효성을 확인하고 유효한 경우 데이터를 전달하고, 유효하지 않다면 예외를 넘긴다(Throw). URL 요청이 왔을 때, 해당 URL에 대한 데이터들에 대한 처리를 하며 옳지 않은 데이터가 온다면 Error 처리를 하고 그렇지 않다면 데이터를 처리한 후 handler에게 간다. 위의 두가지 사용 방법 모두 Controller의 Handle... Read More
-
[NestJS]- NestJs Exception filters
Middleware Nest에는 애플리케이션 전체에서 처리되지 않은 모든 예외를 처리할때 Exception filters를 사용해볼 수 있다. 예외처리는 프로그래머가 예상치 못한 예외의 발생에 미리 대처하는 코드를 작성하는 것으로, 이를통해 실행 중인 프로그램의 비정상적인 종료를 막고, 프로그램의 상태를 정상적으로 유지하기 위해 사용한다. Node.js에서는 throw new Error()와 같은 방식을 통해서 예외 처리를 진행하지만 Nest에서는 HttpException() 이라는 인터페이스를 사용하여 예외를 처리한다. 출처:https://docs.nestjs.com/exception-filters N... Read More
-
[NestJS]- NestJs Middleware
Middleware Middleware은 라우터 핸들러 이전에 호출되는 함수이다. Middleware 함수는 요청 및 응답 개체와 애플리케이션의 요청 응답 주기에 있는 미들웨어 함수에 접근 할수 있고, 일반적으로 미들웨어 함수는 next라는 변수로 표시된다. Nest Middleware은 기본적으로 Express 미들웨어와 동일하다. 즉, Middleware는 http 요청과 응답사이 라우터 핸들러 이전에 호출되는 함수이며, 클라이언트 요청을 라우터 핸들러가 받기 전에 가로채서 다른 작업을 수행할 수 있게 한다. 출처:https://docs.nestjs.com/middleware Middleware 특징... Read More
-
[NestJS]- NestJs 소개
NestJs 이란? Nest(NestJs)는 효율적이고 확장에 용이한 Node.js 프레임워크이다. 거의 기본으로 쓰였던 Express.js는 로직 구성이 너무 자유롭다는 점에서 정해진 아키텍쳐가 없다는 점에서 코드의 가독성이 좋지않다. 그래서 이러한 문제를 해결하기 위해 나온 것이 NestJs이다. Nest는 Express와 Fastify을 아직까지 지원을 한다. NextJs는 TypeScript로 구축되고 완벽하게 지원하며 (JavaScript으로도 할 수 있다.) OOP(Object Oriented Programming) 객체지향 프로그래밍, FP(Functional Programming) 함수... Read More
-
[DB]- MySQL과 PostgreSQL 비교 분석
MySQL 이란? MySQL은 세계에서 가장 많이 쓰이는 오픈 소스 데이터베이스이며, 표준 데이터베이스 질의 언어 SQL(Structed Query Language)를 사용하는 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)이며, 매우 빠르고, 유연하며, 사용하기 좋은 특징이 있다. 관계형 데이터베이스란 데이터가 하나 이상의 열과 행의 레이블에 저장되어 서로 다른 데이터 구조가 어떻게 관련되어 있는지 쉽게 파악하고 이해할 수 있도록 사전 정의된 관계로 데이터를 구성하는 정보 모음이다. 사용자에게 데이터를 관계로써 표현한다. 즉, 행과 열의 집합으로 구성된 테이블의 묶음 형식으로 데이터를 제공한다... Read More
-
[TypeScript] - 타입스크립트 기본 정리
🚩TypeScript 란? 타입스크립트(TypeScript)는 자바스크립트(JavaScript)를 기반으로 정적 타입 문법을 추가한 프로그래밍 언어이다. TypeScript는 정적 타입을 명시 할 수 있다는 점에서 JavaScript와 큰 차이점을 보인다. 그리하여 개발 도구를 사용하면서 개발자가 의도한 변수나 함수의 목적을 명확하게 함으로 의도를 정확하게 전달 할 수 있다. JavaScript 같은 경우는 runtime에서 에러가 발생하여 프로그램이 실행되다 죽는 경우가 있는데 만약 프로젝트가 큰 경우에는 그런 오류의 수정이 힘들다. 하지만 TypeScirpt는 compile과정에서 에러가 발생하기 때문에 ... Read More
-
알고리즘 - Chained Matrix Multiplications(연속 행렬 곱셈)
Chained Matrix Multiplications 이란? Chained Matrix Multiplications(연속 행렬 곱셈)동적 계획법(Dynamic programming)을 사용하여 연속된 행렬들의 곱셉에 필요한 원소 간의 최소 곱셉 횟수를 찾는 문제. N x M 행렬 A와 r x s 행렬 B가 있고 M = r 일때 N x s 행렬 C가 가능하다 3개의 행렬을 곱해야 하는 경우에는, 연속 행렬 곱셈에는 결합 법칙이 허용되기 때문에 AxBxC = (AxB)xC = Ax(BxC)가 가능하다. 하지만 같은결과를 보여주지만 연산하는 양에따른 차이가난다. 그리하여 연산하는 양이 최소가 되는 방법을... Read More
-
알고리즘 - Floyd-Warshall Algorithm(플로이드-워샬 알고리즘)
Floyd-Warshall Algorithm 이란? Floyd-Warshall Algorithm(플로이드-워샬 알고리즘)은 모든 점에 대해서 다른 모든 점에대한 경로를 찾을수 있고 음의 가중치를 가진 그래프에서도 사용할 수 있다. Warshall은 그래프에서 모든 쌍의 경로 존재 여부를 찾아내는 동적 계획 알고리즘을 제안했다. Floyd는 이를 변형하여 모든 쌍 최단 경로를 찾는 알고리즘을 고안하여 모든 쌍 최단 경로를 찾는 동적 계획 알고리즘을 플로이드-워샬 알고리즘이라고 한다. 플로이드 알고리즘의 시간 복잡도는 O(n^3)으로 다익스트라 알고리즘을 n번 사용할 때의 시간 복잡도와 동일하다. 플로이드 알고... Read More
-
알고리즘 - Fractional KnapSack Problem(부분 배낭 문제)
Fractional KnapSack Problem 이란? Fractional KnapSack(부분 배낭 문제)는 물건을 부분적으로 배낭에 담을 수 있으므로, 최적해를 구해서 ‘욕심을 내어’ 단위 무게당 가장 값나가는 물건을 배낭에 넣고, 계속해서 그 다음으로 값 나가는 물건을 넣는다. 만약에 그 다음으로 값나가는 물건을 ‘통째로’ 배낭에 넣을 수 없게 되면, 배낭에 넣을 수 있을 만큼만 물건을 부분적으로 배낭에 담는다. Fractional KnapSack Problem 과정 Fractional KnapSack Problem Pseudo-code 입력 : n개의 물건, 각 물건의 무게와 가치, 배낭의 용량 C... Read More
-
JAVA - Comparable / Comparator 비교
Comparable Interface Comparable Interface는 객체의 정렬에 사용된다. 이 인터페이스를 구현한 클래스는 ‘compareTo()’메소드를 구현해야 한다. compareTo() 메소드는 현재 객체(this)와 비교 대상 객체를 비교 즉 자기자신과 매개변수 객체를 비교하여 음수, 양수, 0을 반환해준다. class Person implements Comparable<Person> { private String name; private int age; // 생성자, getter, setter 등 생략 @Override public int... Read More
-
알고리즘 - Prim Algorithm(프림 알고리즘)
Prim Algorithm 이란? Prim Algorithm(프림 알고리즘)은 최소 신장 트리(Minimum Spanning Tree)를 찾는 알고리즘이다. 시작 정점에서 출발하여 해당 정점과 연결된 간선 중에서 가중치가 가장 적은 간선을 선택하여 해상 간선으로 연결된 정점을 트리에 추가하는 과정을 반복한다. 임의의 점을 하나 선택한 후, (n - 1)개의 선분을 하나씩 추가하여 트리를 만든다 Prim Algorith의 시간 복잡도는 간선의 개수를 E, 정점의 개수를 V 라고 할 때, 우선순위 큐를 배열로 구현할 경우, 모든 정점에 대해서 우선순위 큐에 새로운 원소를 삽입하고 최솟값을 찾는 과정을 V번 반복하... Read More
-
알고리즘 - Dijkstra Algorithm(다익스트라 알고리즘)
Dijkstra Algorithm 이란? Dijkstra Algorithm(다익스트라 알고리즘)은 그래프의 출발점으로 부터 다른 모든 정점까지의 최단 경로를 찾는 알고리즘이다. Dijkstra Algorithm은 한 정점에서 다른 정점까지의 최단 경로를 찾는데 사용되며, 가중치가 있는 유향 그래프에서 주로 사용된다. 조건은 weighted graph이어야 하고 starting point가 있어야 한다. 임의의 점을 하나 선택한 후, (n - 1)개의 선분을 하나씩 추가하여 트리를 만든다 Dijkstra Algorith은 그리디(greedy) 알고리즘의 일종으로, 현재 정점에서 가장 거리값이 작은 정점을 선택... Read More
-
알고리즘 - Kruskal Algorithm(크루스칼 알고리즘)
Kruskal Algorithm 이란? Kruskal Algorithm(크루스칼 알고리즘)은 최소 신장 트리(Minimum Spanning Tree)를 찾는 알고리즘이다. 가중치가 가장 작은 선분이 사이클을 만들지 않을때만 선분을 추가 시켜 최소 신장 트리를 찾는다. Kruskal Algorithm은 간선을 가중치 순으로 오름차순 정렬한 후, 가중치가 작은 간선부터 하나씩 선택해 최소 신장 트리를 만든다. 만약 선택한 간선이 사이클을 형성하면 간선을 선택하지 않고 다음으로 작은 간선을 선택한다. Kruskal Algorith의 시간 복잡도는 간선의 개수를 E, 정점의 개수를 V 라고 할 때, 간선을 정렬 하는... Read More
-
알고리즘 - Greedy Algorithm(탐욕 알고리즘)
Greedy Algorithm 이란? Greedy Algorithm(탐욕 알고리즘) 최적해를 구하는 방법에 사용되는 알고리즘 중 하나이다. Greedy Algorithm은 각 단계에서 가장 최적인 선택으로 하는 것이며, 한번 선택된 것을 번복하지 않는다. Greedy Algorithm 다음과 같은 경우에 유용하게 사용 가능하다. 최적화 문제에서 최적해를 구하고자 할 때 제한적인 자원을 최대한 활용해야 할 때 간단하고 효율적인 알고리즘을 구현해야 할 때 하지만 Greedy Algorithm은 항상 최적해를 보장하지 않는다 상황마다 최적해와 다른 결과를 도출할 수도 있기때문에, 상황에 맞게 최적해... Read More
-
알고리즘 - Selection(선택 문제)
Selection 이란? Selection algorithm(선택 알고리즘)은 리스트와 같은 자료구조에서 주어진 조건에 따라 특정 위치에 있는 원소를 찾는 알고리즘이다. 즉, n개의 숫자들 중에서 k번째로 작은 숫자를 찾는 문제다. 문제를 해결하기 위한 단순한 방법이 2가지가 있다. 최소 숫자를 k 번 찾는다 (unsotred array) : n개의 숫자들 중에서 k번째 숫자를 찾는 과정이다. k번째 큰수는 n-(k-1)번의 탐색을 하기 때문에 시간 복잡도는 O(kn)이다. 숫자들을 정렬한 후, k 번째 숫자를 찾는다 (sorted array) : 시간 복잡도는 O(nlogn). 정렬하는 방법에 따라... Read More
-
lseek() 파일 크기 계산
lseek() 란? 파일의 내용을 읽거나 쓰면 현재 읽을 위치나 쓸 위치를 알려주는 offset이 자동으로 변경된다. 파일을 읽기/쓰기 모드로 열었을 때 파일 읽기 오프셋과 쓰기 오프셋이 별도로 있는 것이 아니므로 주의해야한다. 오프셋을 원하는 위치로 바꾸고 위치를 확인하려면 lseek() 함수를 사용한다. #include<sys/types.h> #include<unistd.h> off_t lseek(int fd, off_t offset, int whence); 인자 설명 fd : 파일 기술자 (File Descriptor) offset : 이동할 오프셋 위치 whence : 오... Read More
-
알고리즘 - Quick Sort(퀵 정렬)
Quick Sort 이란? Quick Sort(퀵 정렬)분할 정복 알고리즘(Divide and Conquer Algorithm)중 하나이며 평균적으로 가장 빠른 수행 속도를 가지는 비교정렬에 속하는 정렬 방법이다. 과정 1. 분할(divide) : 입력 배열을 피봇을 기준으로 2개의 부분 배열로 분할한다. 2. 정복(conquer) : 부분 배열을 정렬한다. 부분 배열의 사이즈가 작다면 재귀 호출을 수행하여 다시 분할 정복 알고리즘을 적용한다. 3. 결합(combine) 정렬된 부분 배열을 하나의 배열에 넣는다. 시간복잡도 Quick Sort의 평균 시간 복잡도는 O(nlogn)이고, W... Read More
-
알고리즘 - Merge Sort(합병 정렬)
Merge Sort 이란? Merge Sort(합병 정렬)은 비교 기반 정렬 알고리즘이며 분할 정복 알고리즘(Divide and Conquer Algorithm) 중 하나이다. 원소의 개수가 하나 이하가 될 때 까지 분할하고, 분할된 원소들을 정렬하여, 정렬된 원소들을 다시 병합하는 과정을 반복하여 정렬하는 알고리즘이다. 과정 1. 분할(divide) 정렬되지 않은 리스트를 절반으로 나누어 두개의 리스트로 만든다. 2. 정복(conquer) 각 부분 리스트를 재귀적으로 합병 정렬을 이용하여 정렬한다. 3. 결합(combine) 두 부분 리스트를 다시 하나의 리스트로 합병한다. 이떄 정렬 결과가 ... Read More
-
백준 - 별 찍기 - 7(2444)
Problem Description 첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다. 첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다. JAVA로 문제를 해결했으며 망가진 뇌를위한 솜방망이질을 해주었다. Code block A Java Example: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); for(int... Read More
-
알고리즘 - Counting Sort(계수 정렬)
Counting Sort 이란? Counting Sort(계수 정렬)은 정렬 알고리즘 중 하나이며, 입력된 배열의 값들의 개수를 세고 정렬 하는 알고리즘이다. Counting Sort는 입력 배열의 값의 범위가 비교적 작을때 빠른 속도를 보이는 특정 조건에서만 빠른 속도를 보이는 알고리즘이다. Counting Sort는 아래와 같은 특징을 가진다. 입력된 배열의 값이 정수로 이루어져 있다면 빠른 정렬이 가능하다. 입력된 배열의 값의 분포가 일정하지 않다면 속도가 저하될 수 있다. 값의 범위가 크다면, Counting Array의 크기가 커지게 되어 메모리 사용량이 많아진다. 입력된 배열이 정... Read More
-
알고리즘 - Insertion Sort(삽입 정렬)
Insertion Sort 이란? Insertion Sort(삽입 정렬)은 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입하는것으로 졍렬하는 알고리즘이다. Insertion Sort 개념 하나씩 배열의 원소를 정렬된 부분과 비교하여 적절한 위치에 삽입하는 방식인데, 구체적인 방식은 아래와 같다. 1. 첫 번째 원소는 정렬된 것으로 간주한다. 2. 두번째 원소부터 정렬된 부분과 비교하면서 적당한 위치에 삽입한다. 3. 삽입하려는 원소와 정렬된 부분의 마지막 원소를 비교한다. 4. 삽입하려는 원소가 정렬된 부분의 마지막 원소보다 작으면 삽입... Read More
-
자료구조 - Graph(그래프)
Graph란? 그래프(Graph)는 정점(vertex)와 간선(edge)로 이루어진 자료구조이다. 수학적으로 G = (V, E)로 표현한다, V(G)는 Graph G의 정점들의 집합을 E(G)는 Graph G의 간선들의 집합을 의미한다. 정점(vertex)는 노드(node)라고도 불리고, 간선(edge)는 링크(link)라고도 불린다. Graph의 종류 무방향 그래프(undirected graph) : 두 정점을 연결하는 간선에 방향이 없는 그래프이다. 위에 있는 예시 그림은 무방향 그래프에 속한다. 방향 그래프(directed graph) :간선에 방향이 있는 그래... Read More
-
자료구조 - Tree(트리)
Tree란? 트리(Tree)는 계층적인 자료를 표현하는데 적합한 자료구조이며, 그래프의 일종으로 한 노드에서 시작해서 다른 노드를 순회하여 자기 자신으로 돌아오는 순환이 없는 연결 그래프이다. 즉 트리(Tree)는 한 개 이상의노드(node)이루어진 자료구조 이다. Tree의 용어 루트 노드(root node) : 계층적인 구조에서 가장 높은 곳에 있는 노드. 부모가 없는 노드. 트리는 하나의 노드를 가진다. 자식 노드(leaf node) : 자식이 없는 노드, ‘잎 노드’ ‘말단 노드’ 라고 부른다. 간선(edge) : 노드와 노드간을 연결 하는 선. 차수(degree) : 어떤 노드가... Read More
-
자료구조 - Hash(해시)
Hash란? 해시(Hash)구조는 키(key)와 값(value)가 쌍으로 이우러진 데이터 구조다. 데이터를 검색할때 사용할 키와 실제 데이터 값이 한 쌍으로 존재하며, 키의 값이 배열의 인덱스로 바뀌기 때문에 검색과 저장의 시간복잡도는 O(1)이 된다. Hash Function란? 임의의 길이의 데이터를 고정도니 길이의 데이터로 매핑하는 함수다. 매핑하는 과정 자체를 해싱(Hashing)이라고 한다. 키(Key)값을 해시 함수(Hash Function)라는 수식에 대입시켜 계산 후 나온 결과를 주소로 사용하여 바로 값(value)에 접근하게 한다. Hash Table 해시 테이블이란 해시함수... Read More
-
자료구조 - Priority Queue(우선순위 큐)
Priority Queue 란? 보통의 큐는 형식의 먼저 들어온 데이터가 먼저 나가게 되는 선입 선출(FIFO : First-in First-out)의 형식이다. 우선순위 큐(Priority Queue)는 데이터 들의우선순위를 가져 우선순위가 높은 데이터가 먼저 나가게된다. 우선순위 큐(Priority Queue)는 배열, 연결 리스트 등의 여러 가지 방법으로 구현이 가능한데, 가장 효율적인 구조는힙(Heap)이다. 힙(Heap)을 사용해서 우선순위 큐를 구현해보자. Heap 이란? 힙(Heap)은 여러 개의 값들 중에서 가장 큰 값이나 가장 작은 값을 빠르게 찾아내도록 만들어진 자료구조이다. 힙(He... Read More
-
자료구조 - Linked List(연결 리스트)
Linked List 란? 노드(node)의 집합으로, 각 노드가 데이터(data)와 포인터(pointer)를 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료구조(Data Structure)이다. 노드(node)들은 메모리의 어느 위치에나 있을 수 있으며, 다른 노드로 가기 위해서는 현재 노드가 가지고 있는 포인터(pointer)를 이용하면 된다. 노드는 데이터 필드(data field)와 링크 필드(link field)로 구성되어 있다. Linked List의 종류 단순 연결 리스트(singly linked list) : 하나의 방향으로 연결되어 있는 연결 리스트. 체인(ch... Read More
-
자료구조 - Queue(큐)
Queue 란? 선입선출(FIFO: First-In First-Out)의 특성을 가지는 기본적인 자료구조(Data Structure)중 한가지다. Queue에서의 데이터 입력은 뒤에서 새로운 데이터가 추가되고 앞에서 데이터가 하나씩 삭제되는 구조를 가진다. Queue에서 삽입이 일어나는 곳을 후단(rear) 이라 하고 삭제가 일어나는 곳을 전단(front) 이라고 한다. Queue의 연산 enqueue() : 삽입 연산으로 큐의 맨 뒤에 새로운 요소를 추가한다. dequeue() : 삭제 연산으로 큐의 맨 앞에 있는 요소를 꺼내서 반환한다. is_empty() : 큐가 공백상태에 있는지... Read More
-
자료구조 - Stack(스택)
Stack 이란? 후입선출(LIFO : Last-In First-Out)의 특성을 가지는 자료구조(Data Structure)를 일컫는다. Stack에서의 입출력은 맨 위에서만 일어나고 스택의 중간에서는 데이터를 삭제할 수 없다. Stack에서 입출력이 이루어지는 부분을 스택 상단(stack top) 이라 하고 반대쪽인 바닥 부분을 스택 하단(stack bottom) 이라고 한다. Stack에 저장되는 것을 요소(element)라 부르며, Stack에 요소가 하나도 없을 때 그러한 Stack을 공백 스택(empty stack) 이라고 한다. Stack의 연산 push() : 삽입 연산으로 스... Read More
-
백준 - 한수(1065)
Problem Description 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을때, 1보다 크거나 같고, 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 입력 -> 첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다. 출력 -> 첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다. 등차수열(arithmetic sequence)은 연속하는 두 항의 차이가 모두 일정한 수열을 뜻한다. 1,000보다 작은 자연수 N이 입력되기 때문에 단위... Read More
-
알고리즘 - Memoization(메모이제이션)
메모이제이션 (Memoization) 이란? 메모이제이션(Memoization)은 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술이다. 동적 계획법(Dynamic Programming)의 핵심이 되는 기술이다. 컴퓨터 프로그램이 동일한 계산을 반복한다면 엄청난 중복 호출이 발생할 가능성이 농후하다. 피보나치수열로 알아보는 Memoization 메모이제이션을 피보나치 수열 알고리즘으로 설명해보겠다. 피보나치 수열을 구하는 가장 직관적이고 단순한 방법은 아래와 같다. int fib... Read More
-
알고리즘 - Dynamic Programming(동적 계획법)
Dynamic Programming 이란? 최적화이론의 한 기술이며, 특정 범위까지의 값을 구하기 위해서 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는알고리즘 설계 기법이다. Dynamic Programming Algorithm의 해결 방법은 입력 크기가 작은 부분 문제들을 모두 해결한 후에 그 해들을 이용하여 보다 큰 크기의 부분문제들을 해결하여 최종적으로 원래 주어진 입력의 문제를 해결한다. 덧붙여서 설명하자면 복잡한 문제를 간단한 여러개의 문제로 나누어 푼다는 것이다. 동적 알고리즘의 개념으로 모든 쌍 최단 경로, 연속 행렬 곱셈, 편집 거리 문제, 배낭 문제들을 공부해볼 예정이다 구현 ... Read More
-
백준 - 1로 만들기(1463)
Problem Description 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 첫째 줄에 1보다 크거나 같고, 10^6^보다 작거나 같은 정수 N이 주어진다 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. 백준에서 알고리즘 문제집중에서 DP(Dynamic Programming)에 관련된 문제만 모아놓은 문제집이 있는데 이문제도 ... Read More
-
백준 - 피보나치 수(2747)
Problem Description 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그다음 2번째 부터는 바로 앞 두 피보나치 수의 합이된다 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다. n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오. 첫째 줄에 n이 주어진다. n은 45보다 작거나 같은 자연수이다. 첫째 줄에 n번째 피보나치 수를 출력한다 피보나치 수열은 바로앞의 두 피보나치 수의 합이 다음의 피보나치수가 된다. 수식으로 적으면 f(n) = f(n-2) + f(n-1)로 표현할 수 있다. 반복문... Read More
-
SpringBoot - Spring / SpringBoot 개념정리
Spring 이란? Spring은 자바 기반의 웹 어플리케이션을 만들 수 있는 프레임 워크이다. Spring Framework는 자바 기반의 엔터프라이즈 어플리케이션을 위한 프로그래밍 및 Configuration Model을 제공한다. 다른 언어들로 웹 서버 개발과 같이 java 개발자들은 Spring을 사용하여 웹 서비스를 만들 수 있다. 자바 백엔드 개발자들은 웹 애플리케이션을 개발할 때 대부분 스프링을 사용한다고 한다. 아래의 사진으로 간략하게 스프링의 구조를 보자. Spring 핵심 개념 Spring은 자바 객체와 라이브러리들을 관리해주며, 톰캣과 같은 WAS가 내장되어 ... Read More
-
SpringBoot - jdbcTemplate 사용법
JdbcTemple은 데이터를 저장하기 위해 도와주는 API이다(SQL Mapper) ㄴ SQL Mapper는 SQL을 직접 입력하고 Object의 필드를 매핑하여 데이터를 객체화하는것. build.gradle //database implementation 'org.springframework.boot:spring-boot-starter-jdbc' runtimeOnly 'mysql:mysql-connector-java' spring-boot-start-jdbc는 jdbcTemplate를 위함이고, mysql-connector-java는 mysql을 기반으로 connection을 하기 위함이다. ... Read More
-
백준 - 두 수 비교하기(1330)
Problem Description 두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하는 문제다. A와 B는 공백으로 구분되어지며 3가지 경우 중 하나를 출력한다. A가 B보다 큰 경우에는 ‘ > ‘를 출력한다 A가 B보다 작은 경우에는 ‘ < ‘를 출력한다 A와 B가 같은 경우에는 ‘ == ‘를 출력한다 JAVA로 문제를 해결했으며 문제 해결방법은 간단하다. 두 정수 A와 B를 Scanner로 입력 받고 if문을 사용하여 문제를 해결하면 된다. Code block A Java Example: import java.util.Scanner; public cl... Read More