본문 바로가기

분류 전체보기

(64)
Spring STOMP 프로토콜 사용 채팅 서버 구축 고민점 다중 서버 세션관리는 어떻게 구현해야할까? 메세지 전달 방식 및 클라이언트 서버 구성은 어떻게 해야할까? 오늘은 간단한 테스트로 WAS + NoSQL + Redis로 테스트 개발로 진행했다. Redis를 이용하여 pub/sub 방식의 STOMP 프로토콜로 진행해보고자 한다. NoSQL 몽고 디비를 사용하였고 NoSQL을 이용하하여 채팅방 설정 정도로 간단하게 적용해보았다. Redis redis를 통하여 pub/sub 방식으 채널 구독자가 메세지를 가져감으로써 다중 서버에서도 메세지 교환이 원할하게 이루어질 수 있게 진행했다. 추후에 해당 내용을 정리 할 예정이다. WAS (Spring boot) spring boot + thymeleaf로 하나의 WAS에서 처리하는 방식으로 진행했..
Spring Web Socket 서버 생성 프로젝트 시작 개요 웹서버를 주로 만지고 채팅은 따로 구현해본 기억이 없고, 개인적으로 하고있는 프로젝트에 사이드 프로젝트로 웹 채팅을 만들어보고자 한다. 주로 우리가 많이사용하고있는 HTTP 웹 서버는 stateless로 소켓을 유지하고있지 않으며, 한번 통신후 연결을 해제 해 버린다. 채팅은 좀 다른 개념으로가야한다 HTTP 통신이 아닌 TCP 소켓 통신을 통하여 연결하여 서로간의 메세지를 교환하다 세션을 종료해주는 방식으로 생각하고있다. STOMP 프로토콜의 pub/sub를 이용한 통신을 통해도 채팅서버 구축이 가능 해보인다. 필자는 일단 간단하게 만들어보는 수준으로 주로 사용하고있는 기술 스프링부트를 이용하여 소켓 통신 채팅서버를 만들어보려한다. 간단하게 의존성 몇개주입하고 만들었다. 웹 소켓 C..
백준 숌 사이 수열(1469) 백트래킹 문제를 풀어보았다 복잡해서 시간이 오래걸렸다. https://www.acmicpc.net/problem/1469 1469번: 숌 사이 수열 첫째 줄에 X의 크기 N이 주어진다. 둘째 줄에 X에 들어가는 수가 빈칸을 사이에 두고 주어진다. X의 크기는 8보다 작거나 같은 자연수이다. X의 원소는 0보다 크거나 같고 16보다 작거나 같은 정수 www.acmicpc.net 초기에는 가능한 종류를 만들어보려고 하였지만 시간초과 발생 할 것같아서 주어진 경우의 수에서 가능한 경우의 수를 찾는 방식으로 처리를 했다. 문제의 핵심은 현재 뽑은 원소의 값이 2개가 위치할 수있는가 예를들어 2라면 현재 위치 2 ? ? 2 해서 마지막 2가 놓일 수 있는가 핵심이다. 나의 로직에서는 depth + element ..
백준 로프(2217) 그리디 문제를 한개 더풀어봤다 생각보다 이 알고리즘이 재미가 있다. https://www.acmicpc.net/problem/2217 2217번: 로프 N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하 www.acmicpc.net 로프의 개수가 늘어날수록 (로프 리스트 중 가장 낮은값 * 로프 개수가) 최대 무게가 된다 이러한 방식으로 정렬되어있는 로프를 순서대로 최적해를 찾아가면 된다. package greedy; import java.io.BufferedReader; import java.io.IOException; import java.io...
백준 회의실 배정 성공(1931) 그리디를 이용한 방배정 문제 https://www.acmicpc.net/problem/1931 1931번: 회의실 배정 (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다. www.acmicpc.net 간단하게 빨리 끝나는 회의실 순으로 최적의 해를 구하면 된다. 그리고 빨리 시작하는 회의실을 잡아야하는데 그게 예시로 5-10, 10-10 두개의 회의를 사용해야하기 때문에...? 저게 말이되나... 일단 그렇다 package greedy; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Pri..
백준 동전 0(11047) 그리디 문제를 하나 풀어본다. https://www.acmicpc.net/problem/11047 11047번: 동전 0 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수) www.acmicpc.net 가장 간단한 그리디 알고리즘 문제이다 현재 상황에서 최적의 상태를 체크해서 코인 개수를 구하고 나머지로 계속 반복하면 된다. package greedy; import java.io.*; import java.util.StringTokenizer; public class Q11047 { public sta..
그리디 알고리즘 그리디 알고리즘 그리디 알고리즘이란 최적화 문제를 해결하는 알고리즘, 각 단계에서 지금 당장 최적의 선택을 계속해서 내려가면서 최종적으로 전체적으로 최적해를 찾아내는 방식이다. 예를 들어 최소 스패닝 트리, 최단 경로, 배낭 문제 등에 적용 할 수 있다. 다음과 같은 구조를 같습니다. 1. 해의 후보 중에 하나를 선택합니다. 2. 선택한 후보가 문제의 제약 조건에 부합하는지 확인합니다. 3. 부합한다면, 선택한 후보를 정답에 추가하고, 문제의 제약 조건을 수정합니다. 4. 제약 조건을 만족할때까지 1-3단계를 반복합니다. 각 단계에세 지금 당장의 최적인 선택을 하기에, 전체적인 최적해를 찾기 위해선 이러한 선택이 계속 이루어져야 합니다. 하지만, 항상 최적의 해를 보장하지 않습니다. 대표적인 문제로는 동..
백준 가운데를 말해요(1655) 자료구조 문제 풀어보기~ https://www.acmicpc.net/problem/1655 1655번: 가운데를 말해요 첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1 www.acmicpc.net 문제의 포인트는 중간값을 계속 유지해야한다. 무식하게 다 넣어놓고 정렬하면 시간초과의 길.... 중간값을 유지하는 방법은 우선순위 큐를 두개를 이용하면 된다. 양쪽에 번걸아가며 넣으며 중간값을 계속 유지해두면 된다. package struct; import java.io.*; import java.util.ArrayList; import java.util...
백준 듣보잡(1764) 이전 문제가 쉬운거 같아서 새로 풀어봤는데 더 쉽다.. https://www.acmicpc.net/problem/1764 1764번: 듣보잡 첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. www.acmicpc.net 해시 테이블로 관리하면 된다. package struct; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Scanner; public class Q1764 { public static void main(Str..
백준 카드2(2164) 자료구조 보이는 문제를 풀었다 https://www.acmicpc.net/problem/2164 2164번: 카드2 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 www.acmicpc.net 음... 문제가 너무 간단해서 금방 풀어버렸다 큐 이용하면 될듯하다. package struct; import java.util.Deque; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; import java.util.concurrent.ConcurrentLinkedDequ..