분류 전체보기

· BackEnd
학교 DB 수업 시간에 교수님께서 학교 시스템 DB 설계할 때 드는 돈이 100억이라고 말씀하셔서 매우 놀랐다. 학생과 수업 간 DB를 잠깐만 생각해봐도, 고려해야 할 사항도 많고 실수 없이 깔끔하게 짜야 하는 부분들이 많다. 암튼, 이번에 4, 5주차 UMC 과제가 ERD 설계 / Query문 / QuickDBD 이용 / MySQL 로 DB 설계 이라서, 배달의 민족 DB를 한번 설계해 보기로 했다. 1. DB 설계자 입장에 섰을 때 거쳐야 하는 과정 1. database에 저장되어야 할 정보가 무엇인지 생각한다. 2. 그렇게 해서 어떤 프로젝트가 돌아가게 하는지 고려한다. 3. 개념을 설계한다. --정형적이지 않은 요구사항을 정형화한다. (ex. 제약조건이 무엇인가? 20학번 학생이 들어야 하는 필수..
· KAU
나만 알아보는 정리일 수 있음 주의 main 용어 RELATION -테이블이름 (예_STUDENT)이라고 생각하자. -R(A1, A2, A3, A4, …)라고 하면 R은 intension r은 extension r(R) INTENSION: 틀 R =(relation schema-테이블 정의, relation scheme, relation type) EXTENSION: 내용물 r=(relation, relation state, relation instance-실제 값들) DOMAIN- column value들의 집합 (100,200,300) =단순도메인:애트리뷰트가 원자값 / 복합도메인:복합값(연.월.일) ATTRIBUTE-맨 위에 있는 애들(ATTRIBUTE이름은 다 달라야 한다.) -(=relation..
· KAU
컴퓨터 기본 구성 사용자 응용 소프트웨어 시스템 소프트웨어 (ex. 운영체제, Device Driver, Compiler, Interpreter, linker분할, loader적재) 하드웨어 컴퓨터 주요 기능 (입출력, 기억, 제어, 연산, 통제) (프로그램 실행, 데이터 저장, 데이터 이동, 입출력, 제어) SOFTWARE 하드웨어의 동작을 지시하고 제어하는 역할을 하는 역할을 하는 명령어들의 집합인 프로그램과 프로그램에 필요한 데이터 통칭 -컴퓨터가 일을 처리하기 위해 컴퓨터가 이해할 수 있는 언어로 작성한 명령어들의 집합 -프로그램+데이터+관련 문서 -시스템 소프트웨어 -응용 소프트웨어 HARDWARE -정보/데이터의 전송 및 처리가 실제 일어나는 물리적인 실체 컴퓨터 시스템의 개념적 구성요소 HW..
나중에 DB 짤 일이 있을 지도 모른다는 생각에 sql 쿼리문 정도는 한 번 정리해 두기로 했다. 문제: 직원 급여(salary)의 평균이 $30,000 이상인 부서에 대해, 그 부서의 이름과 그 부서에서 일하는 직원을 구하라." 중첩문은 무언가 추려내고 싶을 때 사용하는 것 같다. 예를 들어 A인 상황에서의 B상황 ->직업급여 평균이 30000이상인 부서에 대해서(A)의 , 이름과 직원 구하기(B) 아래는 WITH ~AS ~로 A상황을 떼어내어 작성한 쿼리문이다. 문제: 한 명 이상의 사원이 근무하는 부서의 개수를 검색하라 ---- EXISTS 의 핵심은 '존재하니?'이다. 'EXISTS 를 이용해서 급여가 10000보다 큰 직원의 이름과 급여를 검색하라'-이런 유형도 존재할 수 있다. 잘생각해보면 됨..
· 회고
대회 참여 계기 올해 2번째로 KAUPC가 열렸고, 나는 이번이 첫 참여였다. 아무래도 KOALA에서 주최하는 대회이다 보니 막중한 책임을 가지고 이 대회에 임하게 되었다. 여름방학 때 알고리즘 공부를 진지하게 해야겠다 생각해서 친구들 약속을 싹 미뤘던 생각이 난다... 그만큼 제대로 준비했었다. 대회는 3인 1조로 문제를 푸는 것으로, 시간은 3시간이 주어졌고 문제는 9문제였다. 25팀(75명)이나 참여해서 사람들이 바글바글 있어서 조금 놀랐고 긴장했다.. 대회 준비 개인으로 준비- ‘알고리즘 유형별로 최소 10문제는 풀어봐야 그 유형을 알 수 있다!’라는 생각을 가지고 주어진 알고리즘에 해당하는 좋은 문제들을 매일매일 1개씩 선별하여 풀어보았다. (DP, 에라토스테네스의 체, 누적합, 투포인터 등 )..
진짜 이번 2학년 여름방학이 아니면 운동을 배워볼 시간이 없을 것 같아서 큰 마음을 먹고 웨이트를 배웠었다. 피티쌤이 나랑 동갑에 나랑 MBTI 하나만 다른 ENFJ였고 그 분도 맨날 운동하셔서 같이 파트너 운동도 하고 진짜 재밌었다. 개꿀잼 암튼 그런 일이 있었다. 그래서 운동도 제대로 해보고 싶을 겸, 또 기록하고 저장해두는 걸 좋아하는 나를 떠올리며 내가 가지고 있는 기술 스택을 모아서 구현할 수 있는, 프로젝트 하나를 피그마로 구성해 보았었다. 대충 이렇다.. 그냥 진짜 내가 쓰고 싶어서 만들어본 거라 내 주관이 잔뜩 있는 데다가 왕 허접하다.. 그래서 저 중에 아주 일부분을 구현해보았다! 그냥 간단한 CRUD이다. 일기는 실시간 전송으로 현재 날짜와 내용이 전송된다. import axios fr..
테스트케이스를 만들어보다가 깨달았다…ㅠㅠㅠㅠ DP에 LIS인데, LIS가 2차원이라고 하더라도 똑같은 로직을 따라가면 된다. 이 문제에서 일단 ‘최소거리’로 간다고 했으므로 항상 오른쪽 아래로 가는 방식이다. 그래서 그냥 이 그림으로 쉽게 살펴보자. 노란색으로 동그라미 친 곳의 LIS를 살펴보고 싶다면 파란색 박스를 다 살폈을 때, 노란색 박스가 그 특정 박스보다 크다면 그 특정 박스의 LIS+1과 현재 LIS값을 살피고 갱신해주면 된다 자세한 건 코드에서 확인 가능 그리고 마지막 출력이 중요하다. 마지막 temp[N-1][N-1]을 출력한다고 계속 생각하다보니까 헤맸는데, 그냥 해당 temp 배열에서 가장 큰 값을 가져오면 그게 가장 긴 LIS이다. import sys input=sys.stdin.re..
세상에서 제일 화나는 TOP DOWN DP 유형이다. 저번 글에서 본 것처럼 DP-TOPDOWN의 형식적인 코드는 다음과 같다 (느낌만 알아두자) def topdown: if 마지막 노드에 다다른 조건: return ~~ if 이미 DP 테이블에 값이 있다면(memoization): return 그냥 그거 가져온다. #밑에 있는 노드를 호출해서 답 갱신 + 필요하다면 DP 테이블에도 값 갱신 DP[][]+= 또는 min .. topdown() return 해당 노드값 이 문제에서는 ‘되냐 안되냐’의 문제를 다룬다. 이럴 때 0, 1, max를 사용해서 풀 수 있다. 만약 조건에 만족하는 것이 하나라도 나올 시에는 return 1을 하고 안 나오면 계속 return 0을 한다. memoization 방법은..
일단 이 문제는 구현이 되게 생소하고 어렵다. 그래프를 표현하는 방법에 대해 생각을 많이 해볼 수 있는 문제라 좋다. 그래프를 배울 때 가장 먼저 배우는 것이자 많이 사용하는 것이 바로 계산하는 순서인 전위/중위/후위 표기식이다. 이런 표기식을 잘 생각해 보면서 문제를 풀어야 한다. 잘 나타내 보면, 규칙은 다음과 같다. ‘+’일 때는 그냥 내려간다. ‘-’일 때는 -오른쪽 자식의 상태를 switch 시킨다. -왼쪽은 그냥 내려간다. 이런 식으로 계속 상태를 바꾸어 주다가 마지막 노드인 1~N까지의 수에 도달하였을 때 연산자가 -라면 -가 몇 개 나오는지 모두 더해준다. 마지막으로 -의 개수(만약 3개라면) 에 따라서 가장 작은 수(3개)의 개수만큼을 최소 heapq에서 뽑아 SUM 값에서 빼준다. SU..
지금껏 다익스트라는 adj라는 배열만 만들어서 사용했었는데, 이 문제는 dijkstra를 눈치채고 다익스트라를 구현하기까지 쉽지 않았다. 일단 맨 처음 문제를 보았을 때에는 floodfill 먼저 떠올랐는데(GridWorld라서 더 그랬다), floodfill과는 결이 다르다. 왜냐면 이미 갔던 곳도 더 빠른 방법이 있다면 왼/오/위/아래 의 방법을 선택해서 빠른 방법으로 갱신해낼 수 있기 때문이다. 그래서 가중치를 가지는 다익스트라로 구현할 수 있다. 다익스트라의 특징은 다음과 같다. 가중치가 모두 양수이다. 방문하지 않은 노드 중 최단 거리인 노드를 선택하는 과정을 반복한다. 각 단계마다 탐색 노드로 한 번 선택된 노드는 최단 거리를 갱신하고, 그 뒤에는 더 작은 값으로 다시 갱신되지 않는다. 우선순..
밑은 내가 맨 처음에 호다닥 작성한 코드. 그리고 시간초과를 받았다😥 bottom up 방식으로, 외판원이 현재 위치에서 갈 수 있는 위치로 간 후 갱신 -> 다시 그 위치에서 갈 수 있는 위치로 간 후 갱신 ---> 이 방법을 반복하였다. 어떻게 보면 DFS 느낌?으로 해결하려 했다.(이 발상이 이게 참 문제임 ) 이 코드의 문제는 DP에서 가장 중요한 문제인 MEMOIZATION이었다. DP 테이블을 갱신하는 방법은 이미 계산된 결과 이용하기 가 바탕이고, 다양한 방법이 있는데, 내가 짠 건.. 앞에서 왔던 길을 보는 게 아니라 갈 길에 체크를 하는 ,, 아주 바보같고 느린 방법을 사용했다. 암튼 이 코드는 매우 비효율적. '차곡차곡 쌓자'라는 접근방식을 자꾸 생각하는 걸 줄여나갈 필요가 있다. 배낭..
분할정복의 시간복잡도는 NlogN이다. (단계 별 문제 개수 (N//2^K) X 해당 단계에서 쪼개는/병합하는 시간(2^K) X 단계 개수(크기가 이진탐색 수준으로 줄기 때문에 logN)) 이것을 밑으로 내려가면서 쪼갤 때 / 위로 올라오면서 병합할 때 2번해서 어차피 2 NlogN이므로 시간복잡도는 그냥 NlogN이다. (DP테이블은 문제 종류가 M이라고 하면 O(NM)이라 더 효과적인 것을 확인할 수 있음) ★DP와 다른 점 부분 문제가 서로 중복되지 않는다. 위 사항 덕분에 Memoization이 필요하지 않다. 굳이 내가 알아낸 데이터를 저장하지 않는다. ★이분탐색트리 또는 세그먼트 트리와 다른 점 이분탐색/세그먼트는 일단 아는 노드를 쭉 나열해 두고 둘씩 짝지어서 위로 올라가며 판단하는 과정을 ..
binary search, 이분법적으로 딱 ' 이 시간. 이 숫자. 이 갯수 '를 구하고 싶을 때 매우 강력한 툴이다. 하지만 너무 생각할 게 많다.. 그래서 꾸준히 정리를 해보도록 하겠다!!! (자꾸 끼워 맞추면서 풀다가 실전에서 시간 너무 오래 잡지 말자...) [1, 2, 3, 3, 3, 3, 4, 5, 5] 라는 배열이 있다. 우리는 3을 찾고 싶다. 음.. 3 중에서도 가장 최소의 index를 가지는 3을 찾고 싶다면, 이렇게 mid가 가장 왼쪽을 향하게 하도록 극한으로 몰아세운다. (직접 해보면 이해 잘 됨) while lo target: return binary_search(array, target, start, mid) #중간값의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인 elif ar..
비트마스킹을 이용하면 굳이 배열을 쓰지 않아도 되므로 메모리도 절약될 뿐만 아니라 배열의 index로도 쓸 수 있어(0001은 1로, 0010은 2로 쓸 수 있다.) 매우 강력한 툴이다! 주로 있다/없다 의 이분법적 현상을 반영해서 표현할 수 있다. 이것만 알면..!! 된다!! & -> 모두 1일때 1반환 | -> 하나라도 1일때 1 반환 / 모두 0일 때 0반환 ^ -> 대응하는 두 비트가 서로 다를 때 1반환 >> -> 오른쪽으로 비트 옮김 100>>2:1 ★삽입 시! i번째 비트를 i값으로 변경할 때 10101에서 11101 만들고 싶다면 10101 | 1
문제정리 https://www.acmicpc.net/problem/15684 15684번: 사다리 조작 사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선 www.acmicpc.net 사다리 문제. 일단 문제 파악이 쉽지 않아 여러 사다리를 마구 만들어봤다. 생각노트 세로선이 - - 이렇게 똑같은 높이에 그어지면 안된다. 앞에서부터 최대한으로 만족 시키다가 아무리 앞을 바꿔도 뒤에서 더이상 안되는 경우가 생긴다. 위의 경우처럼. 선을 추가하는 경우와 추가하지 않는 경우를 생각해볼 수 있는데, 선을 추가하는 경우 그 칸이 홀수일 때, 선을 추가하지 않는 경우는 그 칸이..
문제정리 https://www.acmicpc.net/problem/2618 2618번: 경찰차 첫째 줄에는 동서방향 도로의 개수를 나타내는 정수 N(5 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 처리해야 하는 사건의 개수를 나타내는 정수 W(1 ≤ W ≤ 1,000)가 주어진다. 셋째 줄부터 (W+2)번째 줄 www.acmicpc.net 생각노트 두 자동차가 가는 길이 있다고 했을 때 어떻게 하면 최소로 갈 수 있을까. 이때 각 자동차를 "무조건 가까운 곳"으로 선택해서 가는 방법은 조금 생각해보면 안 된다는 것을 알 수 있다. 몇 번째 사건을 누가 처리하느냐에 따라 의존성이 계속해서 바뀌기 때문이다. (아무리 경찰차2랑 현재 거리에서는 가깝다고 하더라도 경찰차1이 사건 1,2,3을 처리하다가 더 ..
평소 backend가 잘 구현되었는지 확인할 때, frontend에서 axios / fetch 등으로 데이터를 보내고 front에서 만들어진 데이터를 DB에서 직접 확인해보는 단계를 밟아왔다. 하지만 backend만 맡아서 개발하려고 할 시에는 그런 단계를 밟을 수가 없다. 그래서 postman이나 node js로 데이터를 만들어 검사해보는 과정이 필요하다. 그럼 데이터를 많이 만드는 데 공을 들이느라 시간 낭비 아닐까?? 라는 생각이 들 수 있다. 데이터양에 부담 가질 필요는 없다. 요청이 한 개라면 데이터는 사실 한, 두개? 만 만들어보면 되고, 요청이 여러 개라면(여러 사용자의 댓글이라거나, 댓글에 댓글이 또 달리게 되는 대댓글 등) 데이터는 그래도 세, 네 개 정도만 만들어 테스트해보면 된다. 1..
· 협업도구
맨 처음 Git/Github에 대해서 배울 때 너무 혼자 야매로 배웠어서 다양한 용어에 대해 미숙했당... cmd 창에 명령어를 어렵게 치지 않아도 SOURCETREE 를 이용하면 1. git commit / git merge 등을 클릭으로 해결할 수 있다. 2. 내가 지금까지 commit했던 내용들을 가시화해서 밑 그림처럼 친절하게 보여준다. (merge 과정들도 딱 보임) 이런 장점들이 있어서 평소 그냥 이렇게 써왔는데, 이번에 처음으로 협업하면서 PR을 날리다가 + 스터디원들 git 연결을 도와주다가 많이 헤맨 경험을 하고 말았다..😥 결국 해결은 sourcetree를 깔아서 해주긴 했지만.. 그래도 한 번 정리를 해놓으면 좋을 것 같다!!! 일단 나는 항상 default branch로 master..
실내 운동 기구 object detection 을 해보고 싶어 이번에 구글에서 이미지 크롤링으로 이미지 데이터를 수집해 보았다. selenium 크롤링은 간단히 말해 우리가 일일히 손으로 타자 쳐서 검색하고, 이미지를 클릭하고, 이미지를 저장하는 일련의 과정을 자동적으로 해주는 메소드이다. automatically control!! 신기했다. 가상환경에서 실행된다. 아래 코드는 selenium 관련 명령어+python이 주로 이루어져 있으며, time과 관련된 명령어들은 '클릭할 때', '페이지를 로딩할 때', '스크롤할 때' 조금 기다리게 하여 과도하게 빠르게 진행되는 현상을 막는다. import threading from selenium import webdriver chrome_options = w..
'useState' 웹/앱 개발 시 정말 많이 사용하게 되는 상태관리 라이브러리이다. 그리고 Javascript를 사용할 때 정말 혁신적이다고 항상 생각하는 tool 중 하나이기도 하다. 하지만 이 useState 형제들에게도 한계가 있는데, 바로, 한 컴포넌트에서 저장한 state를 다른 컴포넌트에서도 사용하려고 할 때 props로 전달해야 하는 불편함이 있다는 것이다. props에 대한 설명은 이게 '딱'인 것 같아 참고용으로 가져와봤다!! 우리가 페이지를 여럿 만들다 보면 리액트 페이지 간에도 부모-자식 관계가 생기게 된다. 예를 들어보자면, App.js (React 만들 때 가장 상위 DOM인 컴포넌트)에서 로그인했을 때 설정하는 이름 정보를 mypage.js 컴포넌트로 가져가야 한다고 하자. 이..
jeonyoungseo
'분류 전체보기' 카테고리의 글 목록 (7 Page)