분류 전체보기
[프로그래머스] 기지국 설치 / level 3 / 파이썬 / python
💡 solutions 💬 문제에서 구해야 하는 답은 '증성해야 할 기지국 개수의 최솟값'이다. 따라서 이를 구하기 위해서는 설치된 기지국으로부터 전파가 전달되지 않는 아파트들을 먼저 찾아야 한다. 💬 설치된 기지국 리스트를 가지고 순차적으로 탐색한다. start, end값을 갱신하며 전파가 전달되지 않는 아파트의 개수(before)를 구간별로 찾는다. 💬 spread는 기지국 하나를 설치하면 결과적으로 전파를 전달 받는 아파트의 개수이다. (기지국의 위치 또한 포함) 예를 들어 w가 2이면 총 5개의 아파트가 전파를 전달 받을 수 있다. 💬 한 구간에서 전파가 전달되지 않은 아파트들의 개수를 spread로 나눈 몫을 올림한 값이 바로 증설해야 할 기지국 개수이다. 모든 구간을 탐색하여 증설해야 할 기지국..
[프로그래머스] 스티커 모으기(2) / 파이썬 / python / DP문제
💡 solutions 💬 첫 번째 스티커를 뜯은 경우 / 첫 번째 스티커를 뜯지 않은 경우 두 가지로 나눠서 DP 테이블을 만들고 풀이를 진행함. 💬 테스트케이스 33번이 런타임이 나서 찾아보니, 엣지 케이스 N = 1일 때를 처리해주지 않아서 인덱스 에러가 발생했고, 첫 번째 if문으로 해당 케이스를 보완. 👨💻 code def solution(sticker): if len(sticker) == 1: return sticker[0] dp1 = [0]*len(sticker) # 첫 번째 스티커를 뜯은 경우 dp2 = [0]*len(sticker) # 첫 번째 스티커를 뜯지 않은 경우 dp1[0] = sticker[0] dp1[1] = sticker[0] for i in range(2, len(stick..
SSR과 CSR 비교하기
🗨️ SSR(Server Side Rendering) 전통적인 MPA(Multi Page Application)의 렌더링 방식, 브라우저(클라이언트)가 데이터 요청 시 브라우저 -> 프론트 서버 -> 백엔드 서버 -> 데이터베이스를 거쳐 데이터베이스에서 HTML 문서를 가져온 후 브라우저에 화면을 렌더링 하는 방식이다. 클라이언트 측에서 페이지 이동 및 클릭으로 요청이 발생할 때마다 서버에 요청하여 전체 HTML 문서를 다시 가져오기 때문에 변화하지 않는 부분까지도 다시 렌더링 되고, 잦은 서버 요청으로 부하가 일어나는 등의 비효율성을 초래한다. SSR은 첫 화면에서 기존 데이터가 존재하는 HTML 문서가 있기 때문에 검색 엔진이 색인을 생성하고 크롤링할 수 있어 SEO에 좋다. 사용자 인터랙션이 많지 ..
리액트의 라이프사이클(Life Cycle)에 대해 알아보자
✔️라이프사이클이란? 리액트는 컴포넌트 단위로 개발하게 되는데 이때 각 컴포넌트들은 라이프사이클 즉, 생명주기를 가지고 있다. 생명주기는 생성부터 시작하여 업데이트가 되기도 하며 마지막에는 소멸되는 과정을 거치게 된다. 클래스형 컴포넌트에선 주로 생명주기 메서드를 통해 라이프사이클에 따라 컴포넌트를 조작하는데 이와 달리 함수형 컴포넌트에선 생명주기 메서드가 따로 존재하지 않기 때문에 리액트 훅을 사용하여 생명주기 메서드와 비슷하게 동작하도록 구현한다. 라이프사이클을 생성, 업데이트, 제거 총 세 가지 단계로 나눌 수 있고 각 단계마다 메서드가 존재한다. 총 9가지 메서드가 있으며 각 단계별 메서드에 대해 간단히 알아보려 한다. 참고로 클래스형 컴포넌트에서만 사용 가능하다. 아래 그림을 참고하자. 🗨️마운..
알고리즘 문제 풀이 700문제 기념🎉
그 동안 풀었던 알고리즘 문제 수가 벌써 700개 넘었다. 지금 세어보니 총 707문제였다. 알고리즘 문제 풀이는 SWEA, 백준, 프로그래머스를 이용해서 풀어왔고, 프로그래머스 같은 경우 반복해서 문제를 연습하고 싶어 계정을 2개로 만들어서 사용했다. 한번 해결했던 문제는 다른 언어로 해결해도 추가로 카운트 되지 않고, 코드업에서 풀었던 문제들은 포함하지 않았기 때문에 실질적으로 해결한 문제 수는 더 많긴 하다. 중간에 쉬었던 기간도 있지만 20년도부터 알고리즘 문제 풀이를 틈틈이 진행해왔고 돌아보니 생각보다 많은 문제를 해결한 거 같아 뿌듯하다. 알고리즘 문제 풀이를 시작한 계기는 원래 기업 채용을 위한 것이었지만, 주어진 문제에 대해 고민하고 해결했던 과정에서 논리적으로 생각하는 힘과 문제해결 능력..
JSON Server 사용하여 React 프로젝트 만들기 (with Heroku 배포)
제가 이번에 진행했던 프로젝트에선 json server를 셋팅하고 비동기 데이터 처리를 위한 커스텀 훅을 구현하는 역할을 맡았습니다. 프로젝트를 진행하며 json server을 활용했던 과정을 공유하고자 합니다. 0. JSON Server란? JSON Server은 mock data(json 파일 형태)를 가지고 가짜 API 서버를 만들어 실제로 통신할 수 있도록 백엔드 역할을 대신 해주는 것입니다. 해당 서버는 프론트엔드 개발 환경에서 테스트 용도 등으로 사용하는 것으로 실제 프로덕트에서의 서버 역할을 대신해주지는 못합니다. 아래 공식문서를 참고하세요🤠 npm 공식문서 json-server Get a full fake REST API with zero coding in less than 30 secon..
[JavaScript] 호이스팅(Hoisting)이란?
주절주절 오랜만에 블로그 글을 씁니다. 작년 연말에 쓰디 쓴 패배를 맛보고....😇 잠시 휴식기를 가지고, 그 사이 또 새로운 도전을 했습니다. 이제부터는 다시 달릴 시기라고 생각합니다! 예전에는 블로그를 양치기 하려고 했었는데, 점점 블로그 운영을 하다보니 양 보다는 질이지 않나 하는 생각이 듭니다. 새해가 되었으니, 하나의 토픽에 대해 스스로도 더 깊게 공부하고 알게 된 내용을 잘 다듬어 글을 올리려고 마음 먹었습니다. 올해도 화이팅! 최근에는 자바스크립트 책을 읽으며 공부하고 있어 호이스팅에 대해 다시 한번 정리하는 시간을 가졌습니다. 그 전까진 중요한 개념으로 대략적으로만 알고 있었을 뿐 정확하게 알지 못했습니다. 호이스팅(Hoisting) ? 호이스팅은 자바스크립트 코드가 실행되기 전 변수 및 ..
[백준] 공유기 설치 / 2110번 / 파이썬 / python / 이분탐색
💡 solutions 💬 이분탐색 이용하여 문제 해결 💬 start, end, mid 변수값들은 공유기 사이 거리로 정한다. 💬 start는 공유기 사이의 최소 거리로, end는 공유기 사이의 최대 거리로 잡고 이분 탐색을 시작한다. 💬 집의 좌표를 담은 house 리스트를 정렬한 후 맨 첫 번째 집부터 공유기를 설치하는데 이때 공유기 사이의 거리를 mid만큼 잡는다. 💬 공유기를 설치한 횟수를 나타내는 count가 주어진 공유기 개수 C 이상이면 공유기 사이의 거리를 넓히고 (이때 공유기 사이 최대 거리를 나타내는 answer값을 mid로 갱신), C 미만이면 거리를 좁힌다. 👨💻 code import sys def binary_search(start, end): answer = 0 while sta..
[프로그래머스] 징검다리 건너기 / 파이썬 / python / 이진탐색
💡 solutions 💬 순차탐색으로는 효율성을 만족하기 어렵기 때문에 이진탐색으로 다리를 건널 수 있는 최대 인원을 찾아야 한다. 💬 start는 1, end는 max(stones) 디딤돌의 최댓값으로, mid는 (start+end)//2로 설정 💬 디딤돌을 앞에서부터 하나씩 꺼내와 mid값을 빼고 건널 수 있는지 없는지 확인 -> 건널 수 없는 경우 cnt += 1 / 건널 수 있는 경우 cnt = 0으로 초기화 💬 cnt값이 k개 이상이면 디딤돌을 mid명 만큼 건널 수 없기 때문에 반복문 break -> end를 mid-1 로 갱신 💬 반복문이 온전히 종료된 경우, 즉 mid명이 모든 디딤돌을 건널 수 있는 경우 -> start를 mid +1 로 갱신 👨💻 code def solution(sto..
[프로그래머스] 가장 먼 노드 / 파이썬 / python / BFS
💡 solutions 💬 최단 거리 로직을 위해 BFS 알고리즘으로 구현한다. -> deque 자료구조 사용 💬 visit 배열을 가지고 방문했는지 확인함과 동시에 1부터 해당 노드까지의 거리를 저장한다. 👨💻 code from collections import deque def solution(n, edge): adj = [[] for _ in range(n+1)] visit = [0] * (n+1) for a, b in edge: adj[a].append(b) adj[b].append(a) visit[1] = 1 q = deque([1]) while q: x = q.popleft() for next in adj[x]: if not visit[next]: visit[next] = visit[x] + ..
[프로그래머스] 야근 지수 / 파이썬 / Python / heap
💡 solutions 💬 야근 피로도를 최소한으로 만들기 위해서는 주어진 N시간 동안 works 리스트 안의 작업량 요소들을 가장 큰 값부터 -1씩 줄여나가는 과정이 필요하다. 💬 works와 n의 크기를 고려했을 때, 효율성을 통과하기 위해서는 값을 비교하는 로직을 위해 heaq 자료 구조를 사용해야 한다. 💬 주어진 예제 중에 3번과 같이 주어진 N시간 동안에 모든 작업량을 모두 끝마칠 수 있는 경우에는 0을 바로 리턴할 수 있도록 조건을 추가해야 한다. 👨💻 code import heapq def solution(n, works): answer = 0 if sum(works)
[프로그래머스] 정수 삼각형 / 파이썬 / python / 다이나믹 프로그래밍
오늘 파이썬을 정말 오랜만에 쓰는 거라 어색했다. 동빈나님 알고리즘 강의 중 다이나믹 프로그래밍을 공부했고, 이와 관련된 간단한 문제를 풀어보았다. 다이나믹 프로그래밍(Dynamic Programming)이란? 완전 탐색으로 시간이 오래 걸리는 프로그램의 수행 시간을, 메모리를 적절히 사용하여 효율화하는 방법이다. 이미 계산한 결과(작은 문제)를 별도 메모리 영역에 저장하여 다시 계산하지 않도록 하는 것이다. 다음을 만족하는 경우 다이나믹 프로그래밍으로 해결한다. 최적 부분 구조 -> 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있다. 중복되는 부분 문제 -> 동일한 작은 문제를 반복적으로 해결해야 한다. 다이나믹 프로그래밍의 두 가지 유형 탑다운(메모이제이션) ..