목록분류 전체보기 (89)
빠에야는 개발중
해싱 해싱 어떤 데이터를 작은 크기의 데이터로 변환하여 테이블에 담는 데이터 관리 기법이다. 해싱을 사용하면 데이터를 빠른 속도로 검색할 수 있다는 장점이 있다. 그리고 이 해싱은 암호화, 복호화의 개념과 만나 전자서명에도 사용이 된다. 해시 함수 해싱을 하는 방법은 다양하게 존재한다. 임의로 어떤 데이터를 변환 하겠다고 정했다면 그 방법이 바로 해시 함수가 되는 것이다. 예를 들어 “문자를 한칸씩 뒤로 옮기는 변환”이라는 해시 함수를 생각했다면, “ABC”라는 문자는 “BCD”가 되는 것이다.(예시에 불과하며, 속도적 이득은 거의 없다고 볼 수 있다.) 해시 함수는 보통 원문을 단방향으로 해싱하는 용도로 쓰이며 역방향으로 원문을 알아내는 방법은 계산상 불가능해야 좋은 해시 함수라고 할 수 있다. 충돌 ..
다이나믹 프로그래밍은 “큰 문제를 작은 문제로 나누어 푸는 알고리즘”이다. 하지만 단순히 나누는 것이 다가 아니라, 두가지 조건을 만족해야만 다이나믹 프로그래밍으로 문제를 푼다고 할 수 있는데, 그 두가지는 Overlapping subproblem (겹치는 부분 문제) Optimal substructure (최적 부분 구조) 이다. Overlapping subproblem 겹치는 부분 문제란, “큰 문제를 작은 문제로 쪼갤 수” 있어야 하고, “큰 문제와 작은 문제를 같은 방법으로 풀 수” 있어야 한다는 것이다. 피보나치 수를 예로 들자면 f(0) = 0 f(1) = 1 f(n) = f(n-1) + f(n-2) 이런 식에서 f(n)을 구하는 문제는 다시 f(n-1)을 구하는 문제와 f(n-2)를 구하는 ..
reverseStr 메소드는 String형 변수 str을 매개변수로 입력받습니다. str에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 String을 리턴해주세요. str는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다. 예를들어 str이 Zbcdefg면 gfedcbZ을 리턴하면 됩니다. 이 문제는 "대문자가 소문자보다 작다"라는 조건이 붙어있지만 기본적으로 대문자의 코드값이 소문자보다 작기 때문에 그냥 sort() 메소드로 정렬하고 reverse해주면 되는 문제이다. 만약 우선순위가 반대였다면 toUpperCase(), toLowerCase()로 대소문자를 서로 바꿔주면 된다. 123456789101112131415import java.util.Arrays; pu..
문제 출처 : Baekjoon Online Judge 2251번 "물통" - https://www.acmicpc.net/problem/2251 완전 탐색 강의를 들으면서 접한 문제이다. 이러한 종류의 탐색 문제를 푸는 방법은 n중 for문, 큐, 순열, 재귀, 비트마스크 등이 있는데, 이번에는 큐를 사용한 bfs로 문제를 풀었다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610..
이진 탐색은 분할 정복의 기본이라고 할 수 있다. 개념은 알고 있었는데 직접 코드로 짜본 적이 있었나 싶어서 짚고 넘어간다. 원리 간단하게 말하면 "반으로 쪼개기"이다. head에서 tail까지 범위의 배열의 가운데 인덱스인 mid를 정해서 그 수와 찾고자 하는 수를 비교한다. 그래서 "찾는수 가운데 수"이면 탐색 범위를 [mid+1 ~ tail]로 쪼개서 탐색하는 것이다. 이 방식은 O(logn)의 시간 복잡도를 가져 선형 탐색보다 빠르다. 바로 구현에 들어가보자.123456789101112131415161718192021222324252627public class BinarySearch { public st..
DB 연동을 위하여 DB 서버를 둬야 하는데 기존에 사용하고 있는 젠킨스, 톰캣용 인스턴스는 메모리 사용률이 천장을 뚫으려 하고 있으니 새로운 인스턴스를 사용해야겠다고 생각했다. 이전에는 일반적인 EC2 인스턴스를 할당받아 거기에 DBMS를 설치하는 식이었지만 이번에는 AWS에서 제공하는 RDS를 사용해보았다. 여러 DB 엔진들이 존재하는데, 가장 익숙한 MySQL을 선택했다. 참고로 Aurora는 프리 티어에서는 사용할 수 없다. mysql의 버전과 인스턴스 클래스 정보, 스토리지 양을 설정할 수 있다. 사실 프리티어의 한계상 한가지 종류의 클래스, 최대 20GB의 스토리지만 사용할 수 있으므로 선택을 할 수 있는건 버전 정도 밖에 없다. 모니터링이나 로그를 설정할 수도 있다. 데이터베이스의 이름과 포..
아침에 일어나 상쾌한 기분으로 스프링 버전업 + 자바 배포 버전업을 해주고 배포를 하려고 했더니 어? 빌드에 실패했다.아, 프리 티어의 슬픔이여... 어느 정도인가 보니 메모리 사용률이 97퍼센트에 육박하고 있었다. 젠킨스와 톰캣이 모두 엄청난 버벅임으로 상황을 알려주었다. 급한 마음에 aws 인스턴스 재부팅을 시도... 이후에 다시 빌드를 하니 정상적으로 작동을 하긴 한다.하지만 86프로다. 어떡하지... 진짜 돈 주고라도 업그레이드를 해야하나...
기능 설계 “동아리 홈페이지”라는 막연한 아이디어를 내놓았지만 정확히 어떤 기능을 하는 서비스인지 정하지 않았기 때문에 이것저것 안을 내보았다. 그 중에서 우선순위를 정하여 먼저 구현할 것들을 추려내었다. 우선순위가 높은 것들(먼저 구현할 것들) 1. 회원 관리 2. 임원 소개 페이지 2. 스터디 게시판 3. 캘린더 우선순위가 낮은 것들(나중에 구현해도 되는 것들) 1. 이달의 청소 조 2. 이달의 뉴스 3. 공모전 알림 4. 칭찬게시판 5. 이달의 회원 API 명세를 빨리 뽑아낼 수 있고 동아리 운영에서 핵심이라고 판단되는 기능 세가지를 먼저 구현하기로 했다. 특히 캘린더는 외부 라이브러리를 가져와서 관리하는 방식으로 빠른 구현을 도모해볼 수 있을 것 같다. API 명세 작성 github project..
좀 더 효율적인 개발을 위해서 적절한 환경을 구성해보자. 프로젝트 생성 Github에 프로젝트를 등록하고, 칸반보드를 만들어 이슈 트래킹을 할 수 있도록 구성했다. CI 서버 구축 jenkins를 이용하여 프로젝트를 자동으로 빌드, 배포할 수 있도록 했다. 서버는 AWS의 프리 티어로 ubuntu 16.04를 선택했다. github과 연동하여 github에서 프로젝트의 develop 브랜치가 업데이트 되면 자동으로 가져와 빌드하여 배포할 수 있도록 해주었다. 잘 배포된 모습이다. 배포를 하기 전에 먼저 톰캣을 멈추고, 이전 배포물을 삭제한 후 톰캣을 재실행하도록 스크립트를 짜주었다. 이전 배포물을 아카이빙 해서 버전 관리를 구현할까도 생각했지만 규모가 작고 개인 프로젝트이기 때문에 그냥 삭제하는 것으로 ..
Baekjoon Online Judge 10992번 "별찍기 - 17"https://www.acmicpc.net/problem/10992 새롭게 시작한 알고리즘 강의에서 추천해준 연습용 별찍기 문제를 풀던 중, 속이 비어있는 삼각형을 출력하는 문제를 만났다.처음에는 뭔가 간단히 끝낼 수 있을것 같은 느낌이 들어서 이것저것 시도해봤는데, 코드가 조잡해지기만 하고 별다른 진전이 없었다. 그래서 구글링을 해봤는데 이런 풀이를 발견했다.#include int n; int main() { scanf("%d", &n); for (int i = 0; i