전체 글

열심히 사는 태윤씨
이번 게시물은 3월 초 코드몬스터 백엔드 팀에 합류 뒤, 이미지 업로드 기능을 개선한 과정을 자세히 풀어보려고 합니다.1. 기존 이미지 업로드 방식의 문제점 저희 서비스에서는 사용자가 알고리즘 문제 풀이 글을 작성할 때 이미지를 함께 업로드할 수 있는 기능을 제공해왔습니다. 초기에는 단순히 이미지들을 Multipart 방식으로 백엔드에 이미지 파일들을 전송하고, 백엔드에서 해당 이미지 파일들을 AWS S3에 업로드한 뒤, S3 image URL로 변환해 사용하는 구조로 개발해왔습니다. 이 방식은 처음에는 간단하고 빠르게 개발하는데 문제 없었지만, 시간이 지나며 아래와 같은 여러 문제점들이 발생하기 시작했습니다. (1) 게시글 수정 시 이미지 순서 트래킹 문제 사용자가 기존 게시글을 수정하며 이미지를 ..
1. 기존 방식에서 느낀 불편점들 카테캠과 해커톤 프로젝트를 진행하면서 여러 번 배포를 경험했지만, 할 때마다 어딘가 모를 불편함을 느꼈다. 😔 매번 터미널을 열어 SSH로 EC2 서버에 접속한 뒤, .sh 스크립트를 실행하는 방식으로 배포를 진행했다. 처음에는 내 손으로 직접 서버에 코드를 배포했다는 성취감이 있었지만, 여러 프로젝트에서 계속 이런 수동 배포를 반복하다 보니 분명한 한계를 느끼게 되었다.#!/bin/bash# 실행 중인 애플리케이션 종료echo "Stopping existing application..."PID=$(pgrep -f 'java -jar')if [ -n "$PID" ]; then kill -9 $PID echo "Application stopped (PID: $PI..
1. 문제 설명링크 : https://www.acmicpc.net/problem/10122. 풀이과정문제 해결의 흐름 문제를 살펴보면, 배추가 심어진 위치값들이 주어지고 서로 연결된 배추들이 하나의 집합(덩어리)를 형성함을 알 수 있습니다. 따라서 이 문제는 bfs를 통해 그래프에서 연결된 요소들의 개수를 찾아내는 문제임을 파악하였습니다. 입력값을 저장하기 위해 배추 밭은 저장하는 2차원 벡터(graph), 방문 여부를 체크하는 2차원 벡터(visited)를 사용하였습니다. 그러나 테스트케이스마다 graph와 visited를 초기화해야 하므로 다음 2가지 방법 중 하나를 사용할 수 있었습니다.전역 변수 2차원 벡터를 선언하고 assign()을 활용하여 크기를 재할당한다.테스트케이스마다 새로운 지역 변수로..
1. 문제 설명 링크 : https://www.acmicpc.net/problem/11672. 풀이과정문제 해결의 흐름  트리에서 임의의 두 점 사이의 거리에 대하여 가장 긴 거리를 찾는 문제이기에 임의의 두 점 사이의 거리를 모두 구해 가장 긴 거리를 찾는 방법을 떠올렸습니다. 즉, 완전탐색과 BFS를 결합하여 문제를 풀고자 하였습니다. 하지만 아래와 같은 트리 구조를 예로 들어봤을 때, 굳이 완전탐색을 적용하여 모든 점을 탐색할 필요 없이 더 간단하게 풀 수 있는 방법이 있지 않을까 고민했습니다. 1 / \ 2 3 / \ 4 5 \ 6    3. BFS는 특정 노드에서 출발하여 모든 노드를 ..
1. 문제 설명링크 : https://www.acmicpc.net/problem/15042. 풀이 과정문제 해결의 흐름 제목, 입력값, 요구사항을 파악해보면 최단 경로 문제, 그중에서도 가중치 그래프에서 특정 시작점으로부터 다른 모든 정점들까지의 최단 경로를 구하는 '다익스트라 알고리즘'을 활용하는 문제 유형임을 쉽게 파악 가능합니다. 따라서 이 문제는 다익스트라 알고리즘을 사용하며 다음 2가지 조건을 만족시키는 경우의 최단 경로를 구해야 합니다. 조건 1 : 1~N까지 이동할 때 반드시 두 정점 v1, v2를 거쳐야 한다.조건 2 : 한 번 이동하였던 정점과 간선은 다시 이동할 수 있다.위 2가지 조건을 만족하는 최단 거리는 다음 2가지 경우뿐이라고 생각되었습니다.경우 1 : 1 -> v1 -> v2..
1. 문제 설명링크 : https://www.acmicpc.net/problem/11492. 풀이 과정문제 해결의 흐름  우선, 문제 설명을 읽고 나서 DP 문제일 거 같다는 느낌이 강하게 들었습니다. 동적계획법, DP(Dynamic Programming)이란?중복되는 계산 결과를 저장하여 복잡한 문제를 더 작은 하위 문제들로 나누어 해결하는 기법입니다.이 기법은 다음 2가지 특징을 가진 문제에서 주로 사용됩니다!최적 부분 구조 : 문제를 작은 부분 문제들로 나누어 부분 문제들의 최적해를 구하여 최종적으로 전체 문제의 최적해를 구할 수 있는 구조 중복 부분 문제 : 동일한 부분 문제가 여러 번 반복되어 나타나는 구조 이 문제를 DP로 접근해야하는 이유는 이웃한 집의 색깔은 서로 달라야하는 조건 하에 모든..
1. 문제 설명링크 : https://www.acmicpc.net/problem/117232. 풀이 과정문제 해결의 흐름  처음에는 문제 제목처럼 집합 STL (std::set)을 사용하는 문제라고 생각하고 풀었더니 시간 초과로 문제가 자꾸 틀렸습니다! 입출력 시간도 줄여보고 여러 시도를 해봤지만, 이 방법은 정답이 아닌듯 보였습니다. 그래서 배열로 해결할까 고민하던 중 알고리즘 분류를 까보니 비트마스킹으로 풀어야하더라구요! 한번도 풀어본 적 없는 풀이법이라 많이 당황하였지만 CS 과목을 들으며 비트 연산에 익숙해졌기에 도전해보았습니다. 비트마스킹이란? 이진수 비트들을 활용하여 데이터를 효율적으로 저장하고 조작하는 기법메모리 절약, 속도 측면에서 엄청난 장점이 있음 비트마스킹을 통해 특정 비트를 1, 0..
1. 문제 설명링크 : https://www.acmicpc.net/problem/15829 문제에서 주어진 해시 함수 식과 주어진 문자열을 바탕으로 해시값을 계산해내는 간단한 문제였습니다!2. 풀이 과정문제 해결의 흐름 우선, 입력 문자열의 각 문자를 정수값으로 변환하는 과정을 거쳤습니다. 처음엔 int(str[i]) - 96과 같은 방식으로 변환하였는데 아래 코드와 같이 변환하는 것이 더욱 깔끔하다고 느껴 바꿨습니다. 이후 pow 함수를 사용하여 해시 함수식을 정확히 계산해 낸 거 같았는데 자꾸 50점에서 그치더라구요 ㅠㅠ. 원인은 2가지로, 입력 크기와 오버플로우 때문이었습니다. 입력 문자열의 길이 L이 최대 50으로 짧아 보였지만, r**i 값은 기하급수적으로 커져 연산 범위를 초과할 가능성이 있었..
pykido
태윤 개발 블로그