전체 글 181

[React/Firebase] 개인 카페 쿠폰 및 고객 관리 프로그램 외주 경험 기록

개요 몇 개월 전 진행한 외주에 대한 경험을 기록해두고자 한다. 외주를 부탁한 곳은 모 신도시 소재의 개인 카페였다. 해당 카페에서는 고객 프로모션 마케팅으로 쿠폰을 발행하고 있었는 데, 11번 주문하면 1회 무료 음료를 제공하는 식이었다. 문제는 고객의 수가 늘어나면서 고객의 정보를 찾기 어려워졌다는 것이다. 이곳은 아마스빈처럼 고객이 쿠폰을 소지하게 하는 것이 아니라 매장에서 직접 쿠폰을 보관하고 관리하는 방식이었는데 고객의 수가 1000명 가까이 되다보니 주문 시 금방금방 찾아 쿠폰을 적립해주기 어려워졌고 특히 동명이인의 경우 어떤 정보가 해당 고객의 정보인지 파악하기 어려워졌다. 이러한 이유로 필자에게 외주를 요청하였고 디자이너와 함께 클라이언트의 요구사항에 맞춰 디자인 및 개발까지 완제품으로 프..

Experience/외주 2023.11.13

[Python/파이썬] 백준 알고리즘 2206번 - 벽 부수고 이동하기 (BFS)

처음에는 백트래킹으로 접근하려고 했다. """ 1. 아이디어 - 백트래킹으로 탐색하며 벽을 뚫을 때와 안뚫을 떄를 구분하여 전체 가지수를 탐색한다. 2. 시간 복잡도 - O(N * M) : 1000 * 1000 = 1,000,000 -> 가능 3. 변수 - N, M : int - map : int[][] - visit : bool[][] """ import sys sys.setrecursionlimit(10 ** 6) INF = sys.maxsize input = sys.stdin.readline N, M = map(int, input().split()) map = [list(map(int, input().rstrip())) for _ in range(N)] visit = [[False] * M for ..

[Python/파이썬] 백준 알고리즘 1956번 - 운동 (변형된 다익스트라/Dijkstra) (feat. 플로이드)

처음에는 플로이드로 풀었다. """ 1. 아이디어 - 플로이드로 전체 마을 사이의 최단 경로를 구한다. - 이중 for문으로 도로의 길이의 합이 가장 작은 사이클을 찾는다. 2. 시간 복잡도 - O(V^3 + V^2) : 400 ^ 3 ~= 6억 3. 변수 - V, E : int - dist : int[][] - min_dist : int """ import sys INF = sys.maxsize input = sys.stdin.readline V, E = map(int, input().split()) dist = [[INF] * (V + 1) for _ in range(V + 1)] for l in range(1, V + 1): dist[l][l] = 0 for _ in range(E): a, b, c..

[Python/파이썬] 백준 알고리즘 14889번 - 스타트와 링크 (백트래킹/Backtracking)

최초의 풀이는 조금 복잡하게 접근하였다. """ 1. 아이디어 - 백트래킹으로 전수를 조사한다. - for문을 돌릴 때 마지막으로 선택한 선수보다 높은 번호의 선수들을 대상으로 한다. - 전체를 대상으로 돌리는게 아니라 N/2만큼 돌린다. (대칭이므로) - 깊이가 N/2에 도달하면 선택한 팀 구성을 대상으로 각각 팀의 능력치를 구한다. - 비교하여 현재 갖고 있는 최소값보다 작으면 교체한다. 2. 시간 복잡도 - NCN/2 * (N ** 2) = (N! / ((N - N/2)! * (N/2)!)) * (N/2 ** 2) ~= 70,000,000 -> 가능 3. 변수 - N : int - S : int[][] - 선택한 팀원 리스트 : int[] - 능력치 차이 최소값 : int """ import sys..

[Python/파이썬] 백준 알고리즘 11657번 - 타임머신 (벨만 포드 알고리즘/Bellman-Ford)

""" 1. 아이디어 - 1번 도시에서 출발해서 나머지 도시로 가는 가장 빠른 시간 -> 다익스트라 2. 시간 복잡도 - O(ElgV) : 6000 * lg(500) ~= 16000 -> 가능 3. 변수 - N, M : int - 인접 리스트 : (이동 시간, 도착 도시)[][] - 최단 거리 배열 : int[] - 갈 수 있는 도시들 : heap """ import sys import heapq INF = sys.maxsize input = sys.stdin.readline N, M = map(int, input().split()) edge = [[] for _ in range(N + 1)] for _ in range(M): A, B, C = map(int, input().split()) edge[A]..

[Python/파이썬] 백준 알고리즘 11053번 - 가장 긴 증가하는 부분 수열 (DP)

사실 이 문제를 볼 때 부분 수열을 만들 때 기존 수열의 순서를 그대로 따라야하는지가 헷갈렸다. 하지만 그렇다면 그냥 set으로 중복을 제거하고 수를 구하면 될 것이다... 그래서 아마 이것은 아니겠지 하고 풀었다. 처음에는 완전 탐색으로 풀 생각을 했다.. """ 1. 아이디어 - 가장 작은 수 하나를 구한다 - 이후 뒤 수열을 for문으로 돌며 큰 수를 찾는다. 2. 시간 복잡도 - 두개의 포인터 : O(N) - 전체 조회 : O(N^2) = 1,000,000 -> 가능 3. 변수 - N : int - A : int[] """ import sys input = sys.stdin.readline N = int(input()) A = list(map(int, input().split())) max_len..

[Python/파이썬] 백준 알고리즘 1504번 - 특정한 최단 경로 (다익스트라/Dijkstra)

""" 1. 아이디어 - 우선 반드시 지나야 하는 두 정점 사이의 최소 거리를 구한다. (다익스트라) - 그리고 1번 정점과 v1, v2 / N번 정점과 v1, v2 사이의 거리를 구한 뒤 더 짧은 거리를 선택한다. 2. 시간 복잡도 - O(3 * ElgV) = 5 * 200000 * lg(800) =~ 2,903,089 -> 가능 3. 변수 - 정점의 개수, 간선의 개수 : int - 힙 : (비용, 노드번호) - 거리배열 : int[] - 인접 간선 리스트 : (비용, 노드번호)[] """ import sys import heapq INF = sys.maxsize input = sys.stdin.readline N, E = map(int, input().split()) edge = [[] for _ ..

[NginX] NginX 502 Error 문제 해결

잘 실행되던 서비스가 다운되는 일이 생겼다... Github Action 에서 수동으로 재배포해주면 해결되긴 하였는데, 다운되는 일이 최근 잦아졌다. 백엔드 엔드포인트 url로 접속하면 위와 같이 502 에러가 떴다. (필자는 CloudFlare를 앞에 붙여둬 CloudFlare의 에러화면이 뜬다.) 아무리 개인 프로젝트라해도 적지 않은 사람들이 사용하는 서비스인데 문제가 있다 판단하였고 바로 해결을 시도하였다. 하지만 생각보다 문제 원인을 찾기가 쉽지않았다. 구글링, 개발관련 오픈톡방, ChatGPT, 지인 등을 총동원해 원인을 분석해보았다. 먼저 CloudFlare에서 문제가 발생한게 아닐지 확인해보았다. 하지만 이전에 문제 발생 시, 재배포해주면 해결되었기에 이는 CloudFlare의 문제보다는 A..

[Flutter] 푸시 알림 보내기 (FCM push notification)

저번 글에 이어 클라이언트 단에서의 푸시 알림 구현을 진행해보겠다. 구현할 코드를 크게 세 부분으로 나누면, 1. FCM 인증 및 초기 설정 2. 알림 구현 3. Firebase Token 발급 으로 나눌 수 있다. 먼저 구현에 앞서 패키지를 설치하겠다. firebase_core: ^2.8.0 firebase_messaging: ^14.3.0 flutter_local_notifications: ^13.0.0 패키지 설치 및 프로젝트 - Firebase 연결은 어렵지 않아 생략하도록 하겠다. fcmSetting.dart Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { // If you're going to use other..

[SpringBoot] FCM을 통해 Push 알림 보내기 (FCM push notification)

FCM은 Firebase Cloud Messaging의 약자로 기존 GCM에서 모든 플랫폼에 푸쉬를 쉽게 보낼 수 있도록 통합된 솔루션이다. Notification 콘솔의 GUI나 Admin SDK를 이용해 서버 등에서 FCM의 백에 요청을 보내면, FCM에서 각 플랫폼 별로 메시지를 전송하는 방식이다. 이 글에서는 이 FCM을 활용해 Spring Boot에서 Notification을 보내는 방법에 대해 알아보겠다. 글 작성에 앞서 firebase 프로젝트 생성 부분은 생략하고 이미 되어있는 것을 가정하겠다. 1. Admin SDK 서버에서 Firebase 와 상호작용하기 위해서는 먼저 Admin SDK를 추가해야한다. (아래 공식문서 참고) 서버에 Firebase Admin SDK 추가 5월 10일, ..

반응형