전체 글 471

Spring에서 웹소켓 사용하기

웹소켓(Websocket)은 TCP를 이용한 통신 프로토콜로, HTTP의 Stateless한 점을 개선하기 위해 만들어졌다. 기존의 HTTP는 사용자가 요청을 보내야 서버에서 응답을 받을 수 있지만, 웹소켓을 사용하면 사용자의 요청 없이도 서버에서 데이터를 받아 사용할 수 있게 된다. 예를 들어 채팅 앱을 만들 때, 유저 A가 유저 B에게 메세지를 보냈다고 하자. HTTP만을 사용하여 이 기능을 구현한 경우 유저 B가 서버에 주기적으로 요청을 보내야 메세지를 받았다는 것을 알 수 있지만, 웹소켓을 사용한 경우 유저 A가 메세지를 보냈을 때 서버에서 이 요청을 처리하면서 유저 B에게 메세지를 받았다는 데이터를 전송할 수 있는 것이다. 1. Spring에 WebSocket dependency 추가 Sprin..

웹/Spring 2022.05.17

백준 15653번: 구슬 탈출 4

https://www.acmicpc.net/problem/15653 15653번: 구슬 탈출 4 첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B' www.acmicpc.net 기본적으로 문제 자체는 구슬 탈출 2와 같은 문제이다. 단 이 문제는 기울일 수 있는 최대 횟수가 정해져 있지 않으므로, 각 상태에 도달할 수 있는 최소 기울임 횟수를 따로 저장하여 중복되는 경우의 수를 최대한 쳐내야 한다. #include typedef unsigned int ui; #define MAX_N 10 #define INF 0xffff..

React 프로젝트에서 Redux 사용하기

React 프로젝트를 진행하다 보면 몇 단계 아래의 자식 Component에게 props를 전달하거나, 자식 Component의 값을 부모 Component로 전달해야 하는 경우가 생긴다. 이러한 경우 javascript 혹은 React의 기능을 이용해서 문제를 해결할 수도 있지만, Redux를 이용하면 필요한 정보를 Redux로 저장한 뒤 가져오는 방식으로 해결할 수 있다. 1. React 프로젝트에 Redux 추가하기 React 프로젝트를 만들 때 Redux를 추가하기 위해서는, create-react-app의 인자로 --template redux를 제공하면 된다. npx create-react-app --template redux 혹은 기존 React 프로젝트에 Redux를 추가하고 싶다면 Redu..

웹/Redux 2022.05.12

Redux 시작하기

Redux는 Javascript의 상태 관리 라이브러리이다. Redux를 사용하면 특정 변수를 state로 지정해 저장할 수 있고, 또 어느 위치에서든 저장한 state를 조회하거나 수정할 수 있다. 1. Redux 설치하기 Redux를 사용하기 위해선 cdn으로 import하는 방식과 node.js에 설치하는 방식이 있는데, cdn으로 import하는 방식은 잘 사용되지 않는다. node.js에 Redux를 설치하는 방법은 아래와 같다. npm i @reduxjs/toolkit 2. state 저장하기 Redux에서 state를 저장하기 위해서는 configureStore 함수를 사용하면 되는데, 이 때 인자로는 반드시 reducer 필드를 가진 object를 사용해야 한다. 이 reducer는 Red..

웹/Redux 2022.05.12

백준 20327번: 배열 돌리기 6

https://www.acmicpc.net/problem/20327 20327번: 배열 돌리기 6 크기가 2N×2N인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 8가지가 있고, 연산에는 단계 ℓ (0 ≤ ℓ < N)이 있다. 단계 ℓ은 배열을 부분 배열로 나눌때 사용하는 값이며, 부분 www.acmicpc.net 철저한 구현 문제이다. 배열의 각 성분마다 돌린 후의 위치를 계산하여 배열을 돌린 각 결과를 저장한 뒤, 배열을 모두 돌린 후의 결과를 출력하면 된다. #include #define MAX_N 7 #define pow(i) (1

백준 17471번: 게리맨더링

https://www.acmicpc.net/problem/17471 17471번: 게리맨더링 선거구를 [1, 4], [2, 3, 5, 6]으로 나누면 각 선거구의 인구는 9, 8이 된다. 인구 차이는 1이고, 이 값보다 더 작은 값으로 선거구를 나눌 수는 없다. www.acmicpc.net 구역의 개수는 최대 10개이다. 구역을 두 종류로 나누는 모든 경우의 수는 2 ^ 10 - 2 = 1022(개)이고, 각 지역구가 인접한 지역만으로 이루어져 있는지는 각 지역에 대해 인접한 지역을 탐색해 확인할 수 있으므로 이 때의 시간 복잡도는 10 ^ 2 = 100, 각 지역구의 인구수 차이는 선형 시간이 소모되므로, 지역구를 이루는 모든 경우의 수를 매우 빠른 시간 안에 계산할 수 있다. #include type..

백준 20005번: 보스몬스터 전리품

https://www.acmicpc.net/problem/20005 20005번: 보스몬스터 전리품 입력의 첫째 줄에는 멤멤월드의 지도의 크기를 나타내는 두 정수 M(6 ≤ M ≤ 1000), N(6 ≤ N ≤ 1000)과 플레이어의 수 P(1 ≤ P ≤ 26)가 주어진다. M은 지도의 세로 길이, N은 지도의 가로 길이이다. 입 www.acmicpc.net 철저한 구현 문제이다. 각 플레이어가 보스가 있는 장소까지 1초에 한 칸씩 이동한 뒤 1초에 한 번씩 dps만큼의 데미지를 넣는 문제인데, 특별한 알고리즘이 사용되는 것이 아니므로 HP가 양수일 동안 루프하며 각 플레이어의 이동 및 데미지 계산을 진행하면 된다. #include #include #include using namespace std; t..

백준 6957번: 트리 복구

https://www.acmicpc.net/problem/6597 6597번: 트리 복구 창영이는 바이너리 트리를 매우 좋아한다. 그가 가장 좋아하는 게임은 바이너리 트리를 만들고, 노드에 알파벳 대문자를 하나씩 쓰는 것이다. 같은 알파벳을 여러 노드에 쓰지 않는다. 아래는 www.acmicpc.net 전위 순회에서 루트 노드는 맨 앞, 즉 0번째 인덱스에 존재하고, 중위 순회에서 왼쪽 서브 트리와 오른쪽 서브 트리는 루트 노드를 중심으로 나뉘어져 있다. 즉 전위 순회에서 얻은 루트 노드를 중위 순회에서 찾을 수 있다면 왼쪽 서브 트리와 오른쪽 서브 트리의 길이를 얻을 수 있고, 이를 이용하면 전위 순회에서 왼쪽 서브 트리와 오른쪽 서브 트리를 찾을 수 있다. 루트 노드와 왼쪽 서브 트리, 오른쪽 서브 ..

백준 19953번: 영재의 산책

https://www.acmicpc.net/problem/19953 19953번: 영재의 산책 영재는 알고리즘 문제를 푸는 것을 좋아한다. 하지만 잘 풀지는 못하는 영재는 집중이 되지 않을 때 산책을 한다. 오늘도 집중이 되지 않아 영재는 동네를 산책한다. 영재의 동네는 2차원 좌표로 www.acmicpc.net 영재의 산책 속력을 각 초마다 나열해 보면 초기 속력을 제외한 속력의 주기는 4의 약수가 된다. 따라서 영재의 산책의 초기 속력을 제외하면 각 방향으로 이동하는 속력은 항상 같으므로, 이를 이용해서 영재의 최종 위치를 상수 시간 안에 계산할 수 있다. #include #define next_v (v * m) % 10 class coord { public: // 현재 좌표의 y, x값 int y,..

Spring Security를 이용한 세션 확인과 커스텀 인가

백엔드에서 세션을 다루다 보면 세션 정보를 확인해야 할 일이 있다. 사용자의 비밀번호를 바꾼다거나, 사용자가 작성한 게시물을 확인할 때에는 해당 요청을 보낸 사용자 정보를 반드시 확인해야 하는데, Spring Security에서는 간단하게 세션의 확인과 인가가 가능하다. 우선 세션의 확인은 Controller 단에서 이루어지는데, Spring의 Controller에 @AuthenticationPrincipal 어노테이션을 가진 파라미터를 설정하면 요청을 보낸 세션의 username을 가져올 수 있다. // ... 기존 코드들 ... @RestController public class UserController { // ... 기존 코드들 ... @RequestMapping(value = "/path", ..

웹/Spring 2022.04.25