본문 바로가기

전체 글314

GitHub Actions 를 활용한 release bot 만들기 이번에 사내에서 메일 템플릿을 관리하는 프로젝트의 배포 방식을 변경하는 업무를 맡아 진행하며 Github Action (이하 GHA)을 다뤄볼 기회가 생겼습니다. GHA로 PR에서 특정 comment 를 남기면, 변경사항을 배포해주는 자동화 프로세스를 만들고 싶었는데 GHA 사용이 처음이라 꽤나 많은 삽질을 해서 비슷한 기능을 구현하고 싶은 분들을 위해 기록을 남기려고합니다. 📌 PR comment echo 테스트하기 우선 PR에서 특정 명령어를 담은 댓글을 남기면, 이를 감지하는 workflow 를 작성해보겠습니다. release 라는 comment 를 남기면 workflow 가 해당 PR 에 댓글로 응답해주는 workflow 를 작성합니다. comment 추가는 issue_comment event 를.. 2023. 4. 24.
LeetCode 238 - Product of Array Except Self (Medium) 💡 문제 LeetCode - 238번 🎯 풀이 과정 배열 num 에서 i 번째 요소만 제외한 나머지 요소들의 곱을 i 번째 인덱스에 할당한 결과를 반환해야합니다. 이때 O(n) 의 시간복잡도로 수행되어야하고, 나누기 연산을 사용하면 안되는 제약조건이 있습니다. 이를 위해서 i 번째 요소를 제외한 나머지 요소들의 곱을 다음과 같이 나눠서 생각할 수 있습니다. answer[i] = num[0...i-1] * num[i+1...] 부분합 알고리즘을 차용하면, 위에서 필요한 구간곱을 미리 계산해놓을 수 있습니다. 한 배열에는 왼쪽에서부터 누적한 곱을 저장하고, 다른 배열에는 오른쪽에서부터 누적한 곱을 저장합니다. 그러면 위 식은 다음과 같이 바꿔서 계산할 수 있습니다. answer[i] = prefixLeft[.. 2023. 4. 24.
LeetCode 2390 - Removing Stars From a String (Medium) 💡 문제 LeetCode - 2390번 🎯 풀이 과정 별표 (*)를 포함한 문자열 s 에서 다음 규칙에 따라 모든 별표가 제거된 문자열을 반환하는 문제입니다. 별표가 있을 경우 해당 별표보다 앞쪽에 위치한 가장 가까운 문자를 제거합니다. 스택을 활용하면 간단하게 해결이 가능한데, 입력으로 주어지는 문자열의 길이가 크기 때문에 (10^5) 문자열을 순회하며 자료구조에 하나씩 push, pop 하기 보다는 다른 방법을 사용했습니다. 규칙을 활용해서 문자열의 가장 뒤쪽 부터 순회를 해줍니다. 이때 * 를 만나면 answer 에 추가하지 않고 별표의 개수를 계속 세어주다가 일반 알파벳을 발견하면 저장해놨던 별표 개수를 하나씩 줄이고, 만약 저장되어있는 별표 개수가 없다면 그 문자를 answer 에 추가해줍니다... 2023. 4. 24.
LeetCode 1603 - Design Parking System (Easy) 💡 문제 LeetCode - 1603번 🎯 풀이 과정 3종의 차량 (big, medium, small) 을 수용하는 주차장 시스템을 구현하는 문제입니다. carType 인덱싱을 편하기 하기 위해 배열의 크기를 하나 늘려서 사용합니다. 👨‍💻 코드 /** * @param {number} big * @param {number} medium * @param {number} small */ var ParkingSystem = function(big, medium, small) { this.parkingSlots = [0, big, medium, small] }; /** * @param {number} carType * @return {boolean} */ ParkingSystem.prototype.addCar .. 2023. 4. 24.
LeetCode 15 - 3Sum (Medium) 💡 문제 LeetCode - 15번 🎯 풀이 과정 주어진 배열에서 3개의 원소의 조합 중 합이 0인 것들을 중복없이 모두 찾는 문제입니다. 다만 입력 크기를 고려해서 일반 조합 알고리즘보다 효율적인 방법이 필요합니다. 투 포인터 알고리즘을 활용하면, 특정 합 S 를 만족하는 배열 쌍을 중복없이 찾는데 활용할 수 있습니다. 이때 배열은 정렬이 된 상태여야합니다. (중복 제거를 위해) 이 문제를 약간 변형해보면 세 원소 중 가장 첫번째 요소를 pivot 으로 정하고, 나머지 두 요소는 pivot 을 제외한 구간에서 sum - arr[pivot] 을 찾는 문제로 해석할 수 있습니다. 이때 중복 제거를 위해 pivot 이 바로 직전 pivot 값과 동일할 경우 무시하고, 마찬가지로 나머지 두 요소 중 첫번째 요.. 2023. 4. 24.
LeetCode 13 - Roman to Integer (Easy) 💡 문제 LeetCode - 13번 🎯 풀이 과정 로마 숫자를 변환하는 문제입니다. 로마 숫자는 감산, 가산 연산법을 함께 I, V, X, L, C, D, M 의 문자를 나열하여 표현합니다. 그렇기에 앞 자리부터 순회하면서 그 다음 숫자와 크기를 비교하여 합산해야할 크기를 알아냅니다. 이때 반복문 대신 재귀 호출을 사용하면 좀 더 간결하게 구현할 수 있습니다. 👨‍💻 코드 /** * @param {string} s * @return {number} */ var romanToInt = function(s) { const roman = { 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000, } function transform(here) { i.. 2023. 4. 24.
LeetCode 994 - Rotting Oranges (Medium) 💡 문제 LeetCode - 994번 🎯 풀이 과정 매 단위시간(minute) 마다 썩은 오렌지에 인접한 4방향에 위치한 오렌지가 함께 썩는다고 할때 주어진 grid 에서 모든 오렌지가 썩기까지 걸리는 시간을 구하는 문제입니다. 일반적인 BFS 탐색에서 약간의 변형이 필요한 유형입니다. 썩은 오렌지를 queue 에 넣어주고 queue 가 비어질때까지 반복해야지 각각의 단위 시간마다 현재 queue 에 담겨있는 오렌지들에 대해 BFS 를 할 수 있습니다. 보통 BFS 를 할 때 중복 방문을 피하기 위해 visit 같은 자료구조를 만들어 이용하는데, 여기서는 오렌지가 썩은 상태일 때를 이미 방문한 위치로 판단이 가능하므로 방문여부를 위한 별도의 자료구조는 만들어주지 않고 상태값으로 판단하도록 할 수 있습니다.. 2023. 4. 24.
리팩터링 2판 회고 💡 도서를 읽고 개인적인 생각을 정리하는 글입니다. 여러가지 리팩토링 기법을 JavaScript 예제로 설명하는 책입니다. 취준생보다는 실무에 있는 개발자분들에게 조금 더 와닿을 수 있는 내용들이라고 생각합니다. 레거시 프로젝트 유지보수 업무를 하다보면 고치고 싶은 계층 구조나 함수들이 눈에 띌 때가 있습니다. 작은 프로젝트라면 위험 부담이 적겠지만 규모가 큰 프로젝트라면 주요 메인테이너가 아닌 이상 전체 코드 베이스에 대한 이해도가 낮다면 이러한 수정 작업에 대한 위험 부담이 클 수 밖에 없죠. 그러다보면 선뜻 리팩토링 작업을 하기 어렵기 때문에 계속 후순위로 밀리게되며 악취나는 코드는 또 다른 악취나는 코드와 함께 계속 묵혀지게 되는.. 그런 악순환을 겪게 될 수도 있습니다. 건강한 코드 베이스를 위.. 2023. 4. 24.
React Framer Motion 톺아보기 📌 Framer Motion? Framer Motion 은 React 로 개발된 Animation Library 입니다. 관련된 패키지중에 지속적으로 사용량 및 관심도가 증가하고 있는 추세입니다. 📈 웹앱에서 애니메이션을 다루는 다양한 방법이 있지만, 다양한 환경에서 충분한 성능을 고려하여 구현하기에는 생각보다 고려할 사항이 많고 까다로운 것이 사실입니다. 이번 위클리에서는 이러한 부분에 도움이 될수도 있는 패키지를 소개해보는 시간을 가져보려합니다. 📌 TL;DR Framer Motion 의 특징 TypeScript 지원 최적화된 성능 및 풍부한 API physics 기반의 사실적인 transition효과 제공 (spring, tween, inertia) 모던 웹앱에서 반복적으로 필요로 하는 여러 모션들.. 2023. 3. 27.