1 . URL 이란? - URL이란 Uniform Resource Locator의 약자로, 네트워크 상에서 자원이 어디있는지 알려주기 위한 규약이다. 2 . URL의 구조 및 측명 - URL은 웹 클라이언트에서 request를 하는 시점에서 보면 이는 웹 서버에 존재하는 애플리케이션에 대한 API(Application Programming Interface, .라이브러리에 접근하기 위해 규칙을 정의해둔 것이다.)라고 할 수 있다. URL은 크게 두가지의 시선으로 바라볼수 있다 - RPC 방식 : Remote Procedure Call - REST 방식 : ReprEsentational State Transfer - RPC 방식이란 클라이언트가 네트워크 상에서 원격에 있는 서버가 제공하는 API함수를 호출..
전체 글
주로 백엔드, 클라우드 인프라 주제를 다룹니다
1 . HTTP란? - HTTP는 Hyper Text Transfer Protocal의 약자로 웹 서버와 웹 클라이언트 사이에서 데이터를 주고받기 위해 사용하는 통신 방식으로, TCP/IP프로토콜 위에서 작동한다. 이말은 즉슨 웹 서버, 클라이언트 모두 TCP/IP 작동의 필수요소인 IP주소가 필요하다는것을 의미한다. - HTTP는 이름부터 Hyper Text Transfer Protocal인 만큼 Hypertext만 전송 가능한거 아닌가 라는 생각이 들수 있는데, HTML, XML과 같이 하이퍼텍스트 뿐만 아니라, 이미지 자바스크립트 pdf등등 pc내에서 다룰수 있는 데이터모두를 전송할 수 있다. 2 . HTTP 메세지 - HTTP 메세지는 크게 두가지가 존재한다 - Client -> Server (R..

1 . Visual Studio Code에 Python 설치 우선 자신의 PC에 파이썬이 설치 되어 있어야 한다. 설치가 안되어있다면 이곳으로 -> https://www.python.org/ Welcome to Python.org The official home of the Python Programming Language www.python.org 파이썬을 설치했다면 Visual Studio Code로 들어가자. 그 우측에 Extention설치 메뉴로 들어간 후 Python을 검색해서 install 버튼을 눌러 설치를 해준다. 설치 후에는 재실행을 한번 해주자. 지정한 폴더 내에서 테스트를 해보기 위한 한줄 코드를 작성해 보자. 파이썬 코드를 실행하기 위해서는 Ctrl + Shift + B를 눌러주면 ..

코드 링크는 아래에 있습니다(queue.ipynb) https://github.com/J-hoplin1/Python-DataStructure/blob/master/Queue.ipynb 큐(Queue)란 스택과 달리 항목이 들어온 순서대로 접근이 가능한 FIFO(First In First Out, 선입선출)구조이다. 큐 또한 배열 인덱싱을 통한 접근이 불가능하다. 가장 쉽게 생각하면 우리가 줄서는 것을 생각해보면 된다. 큐 또한 스택과 동일하게 다양한 동작들이 있으며 이 또한 O(1)의 시간복잡도를 가지게 된다. - enqueue : 큐 뒤쪽에 항목을 삽입한다. - dequeue : 큐 앞쪽의 항목을 반환 후 제거 - peek : 큐의 앞쪽 항목 조회 - empty : 큐가 비었는지에 대해 확인 - siz..
마크다운이란? 마크다운(Markdown)이란 일반 텍스트 문서의 양식을 편집하는 문법이다. README파일이나, 온라인 문서, 혹은 일반 텍스트 편집기로 문서 양식을 편집할 때 쓰이며, 마큳운을 통해 작성된 문서는 HTML등 다른 문서로 변환이 가능하다. 마크다운의 기본적인 문법들 Markdown Recipe 1. 제목(header) 문자서의 메인 제목(Main Title)으로 작성할 때 Title === 다음과 같이 제목을 작성 후 그 밑에 ===를 작성해 주면 제목으로 설정이 됩니다. 이 문법의 디폴트 값은 #( == )과 동일한 기능을 가집니다. 제목(,,,,,) # 제목 ## 제목 ### 제목 #### 제목 ##### 제목 ###### 제목 제목 제목 제목 제목 제목 다음과 같이 #을 제목 앞에 ..
두개 모두 community 버전을 기준으로 명령어를 작성했습니다 Pycharm (https://www.jetbrains.com/ko-kr/pycharm/) - > sudo snap install pycharm-community --classic IntelliJ(https://www.jetbrains.com/ko-kr/idea/) -> sudo snap install intellij-idea-community --classic
필자는 모든 PC를 Linux Ubuntu로 변경하였다. 모두 괜찮았지만 2018 올뉴그램 14인치에 우분투를 설치하고 나서 마우스패드에서 우클릭이 작동하지 않는 경우가 발생하였다. 그런 경우는 다음 과정을 따르면 된다. 1 . 우선 명령어를 terminal 상에 입력해준다. $ sudo apt install gnome-tweaks 2 . 해당 명령어에대한 설치가 완료되면 application 메뉴에 들어가면 Tweaks 혹은 기능개선이라는 이름의 아이콘이 생성된것을 볼 수 있다. 이를 실행해준다. 3 . 거기서 Keyboard & mouse 메뉴를 들어가서 Mouse Click Emulation 부분을 Area로 변경해준다.

다음과 같이 그라파나에 대쉬보드 하나를 생성하였다고 가정하자. 필자는 Mysql로 테스트쿼리를 연결하여 진행하였다. 그리고 자신이 그린 대시보드 혹은 그래프를 어드민 페이지가 아닌 일반 사용자에게 보여주고 싶다고 가정을 해보자. 필자는 해당 그래프 렌더 이미지 혹은 대시보드를 에 embed한다고 가정하고 포스트를 진행한다. 대시보드를 sharing하기 위해서는 우선 dashboard 페이지에서 그래프 제목부분을 클릭해서 sharing 부분을 들어가 주어야 한다. 여기서 보면 http://localhost~~ 라는 문구 옆에 copy라는 버튼이 있다. 이 버튼을 클릭하게 되면해당 대쉬보드링크가 복사되게 된다. 만약 그래프 렌더 이미지를 가져와서 iframe에 넣고 싶다면 그 밑에 Direct link re..

1 . Grafana란? 그라파나란 metric 분석 및 시각화한 opensource 소프트웨어이며, Go언어로 구성되어있다. 2 . 그라파나 docker container 설치하기. 그라파나는 그라파나 전용 docker container를 생성해 줄 수 있다. Grafna Document는 이 곳을 클릭하면 되니 필요한 경우 참조하자.(https://grafana.com/docs/grafana/latest/). 그라파나 전용 도커를 설치하기 위해서는 다음과 같은 명령어를 입력해 주면 된다. $ docker run -d -p 3000:3000 grafana/grafana 그 후 localhost:3000을 들어가면 그라파나 로그인 창이 나오는것을 볼 수 있다. 초기 계정 정보는 admin/admin 이며..

p.s 18.03,18.04에서 ibus의 한글깨짐현상 혹은 한글 자음 모음 분리현상이 많이 심한것으로 확인되었고 저 또한 그 현상을 겪었습니다. 가장 쉬운 해결법은 재설치이지만 저는 입력기를 nimf로 변경하고 나서 어느정도 해결이 완료 되었습니다. 18. x 버전을 이용하시는 분께는 이 방법을 추천드며, 14.x 16.x 를 쓰시는 분들께는 아래 포스트 방법을 추천드리겠습니다. nimf는 이 순서대로 설치를 해주시면 되겠습니다. - $ sudo add-apt-repository ppa:hodong/nimf - $ sudo apt-get update - $ sudo apt install nimf nimf-libhangul - 그 후 재부팅을 해주시면 됩니다. nimf의 한영 전환은 윈도우와 동일한 한/..
BOJ(백준 온라인저지) 2108번 통계학 코드 및 해설 백준 온라인 저지 2108번 문제 풀이 사용언어 : Python3 문제 제목 : 통계학 링크 : https://www.acmicpc.net/problem/2108 문제와 주어진 예시들 ) Code 풀이순서 우선 문제를 보면 첫번째 입력값에는 총 입력 수의 개수를 적는것이라고 되어있다. 그 후의 입력값들은 입력개수만큼 수를 입력해 주어야 한다고 한다. 우선 우리가 값을 받기 위해서는 input도 있지만 이 input 함수는 꽤 느린 속도를 가지고 있는 함수이다. 그렇게 때문에 빠른 받기가 가능한 sys모듈의 readline를 사용해 주었다. import sys s = sys.stdin.readline io = int(s()) 우선 출력해야하는 결과값..
Git에는 명령어들이 있다. 예를 들어 add, commit, pull, fetch등 여러가지의 명령어들이 존재한다. Git 명령어들은 Git Bash를 통해서 사용할 수 있다. 또한 Visual Code에서 터미널을 Git Bash 로 설정하여 사용할 수도 있는등 다양한 방법으로 Git Bash를 이용할 수 있다. 오늘은 Git Bash 초기설정과 Github에 Git 명령어를 통해서 파일을 올려보는것까지 해볼것이다. 우선 Git Bash의 전역 User Name과 이메일을 설정해 주어야한다. 필자의 생각이지만 깃허브나 깃랩을 쓰고 있다면 계정 닉네임과 이메일대로 초기화를 해주는게 좋은거같다. 사용자명, 이메일 설정을 위해서는 다음과 같이 명령어들을 입력해주어야한다 //사용자명 초기화 $ git con..
Git, 한글로는 깃이라고 읽는 이것은 무엇일까? Git은 2005년 리눅스 커널을 개발하기 위해 초기 개발에 기여한 다른 커널 개발자들과 함께 리눅스 토발즈가 처음 개발한 것이다. 우선 깃의 한줄 정의는 다음과 같다고 한다. 프로그램등의 소스코드 관리를 위한 분산 버전과리 시스템 분산 버전관리 시스템이란, 다수의 사람들이 어떠한 작업을 같이 개발, 코드리뷰, 이슈와 같이 협업을 하면서 소프트웨어의 버전을 관리할 수 있는 시스템을 통칭한다. 필자는 평소 Github, GitLab을 사용하고, 여기에서 언급되었듯이 'Git'이라는 시스템을 자주 사용한다. 앞으로 필자는 이 'Git'이라는 것에 대해 조금 더 자세히 공부해보기 위해 Git에 대한 포스팅을 시작하려한다. 깃 다운로..
Jekyll(지킬) 이란? Jekyll 이란 개인, 프로젝트 또는 조직 사이트를 위한 간단한 블로그 인식 정적 사이트 생성기이다. 이는 Github 설립자인 Tom-Preston-Werner가 루비 언어로 작성하였으며, MIT 라이선스를 기반으로 오픈소스 배포가 된다. Jekyll 사이트 자신의 깃허브 페이지 생성하기. 자신의 깃허브 페이지를 만들어 보자. 우선 우측 상단에 New Repository를 들어가자. 그리고 repositry이름을 다음과 같은 양식에 맞게 작성해주자. (자신의 깃허브 닉네임).github.io 필자의 경우를 작성해 보면 다음과 같이 나타낼 수 있다. 여기서 경고창이 뜨는 이유는 필자는 이 글을 작성할때 이미 J-hoplin1.github.io라는 repository를 이미 만..

파이썬에서 만약 배열 원소들을 역순으로 나열해서 작성해야하는 문제가 있다고 가정하자. 필자는 이와같은 문제를 풀다가 Extended Slice라는 기본 개념을 놓쳤기에 이 포스팅을 통해 바로 잡고 가려고한다. 형태는 다음과 같다. ARR[q:w:e] : index q부터 index w 까지 e간격으로 만들겠다 이러한 형태를 띄고 있는것이 Extended Slice라고 한다. 이를 직접적으로 연계시켜 생각할수 있는 문제는 밑에 링크를 참조하자. https://www.acmicpc.net/problem/2908 2908번: 상수 문제 상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 ..

한동안 알고리즘을 건드리지 않았다. 좀더 효율적인 코딩을 요구하는 작업들을 함에 따라 백준 새로운 계정을 만들고 문제들을 서서히 풀어 나갔다. 아침에 1교시 수업을 기다리며 1110번 문제를 풀어보았다. 막힘은 없었다. 잘 풀리겠지 하면서 말이다. 우선 1110번의 문제는 다음과 같다. 주어진 예시 입력과 출력값들은 다음과 같은것들이 있다. 필자가 초반에 작성한 코드는 다음과 같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 global b global value global cycle cycle = 0 value = 0 def add_zero(num): return "0" + num #try..

1 . 누락값이란? 데이터에서 누락값은 NaN 혹은 nan 혹은 NAN과 같은 표기를 지니고 있으며, 이는 Not a Number의 약자이기도 하다. 우선적으로 누락값을 numpy 라이브러리에서 불러와보자. 한가지 유의해야할것은 NaN값은 0 혹은 ' '(White Space)과 다른 의미를 지니고 있다. 누락값 NaN은 '데이터 자체'가 없음을 의미한다. 그렇기에 '같다'의 의미 자체가 성립되지 않는 존재이다. 이러한 정의가 가능하기에 누락값은 자기 자신과 비교해도 Boolean Type의 값은 False로 출력된다. 누락값을 확인 할 수 있는 방법은 두가지가 있다. 1 . pandas 라이브러리를 이용 not null 메소드는 누락값이 아닌것에 대한 확인이다. 2 . numpy 라이브러리를 이용 누락..

기준 환경 AWS EC2 Cent OS7 (t2.micro) Cent OS Web Server $ yum install - y httpd (혹은 sudo yum install -y httpd) 생성한 보안그룹 인바운드 : 모든 TCP Default값(소스 위치무관) 아웃바운드 : 모든 TCP Default값(소스 위치무관) 1 . 고급 -> 전송설정규칙 에서 전송모드를 자동으로 변경해준다. 2 . 업로드 옵션에서 권한 오류 무시 체크를 해준다. 여기까지가 보편적인 WinSPC의 오류코드 3에 대한 해결책이다. 필자도 그랬듯이 이 방법이 적용되지 않을 수 있다. 그런 경우는 다음 순서를 따라주면 된다. 우선 sshd 설정 으로 들어가준다. $ nano /etc/ssh/sshd_config vim 혹은 vi..
csv파일을 불러오던 중에 다음과 같은 오류가 출력되는 것을 볼 수 있었다. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 0: invalid start byte 에 대한 해결방안으로는 read_csv() 메소드의 매개변수 중에는 encoding이라는 매개변수가 있는데, encoding 매개변수 값을 다음과 같이 올려주면 된다. encoding = 'ISO-8859-1'
Big - O Notation, 흔히 말하는 O표기법이란 최악, 최선의 성능중 최악의 성능에 해당한다. 최악의 성능을 평가하는 이유는 적어도 일정정도의 성능은 보장한다는 의미이다. O 표기법은 알고리즘의 성능을 평가하기 위해 처리해야할 데이터의 양에 대한 실행시간을 수학적 으로 계산한 방법이다시간 복잡도 함수에서 알고리즘 분석을 원활하게 하기 위해 시간 복잡도를 표기하는것을 Big -ONotation이라고 한다. 다음과 같은 for문이 있다고 가정하자. 이 루프 제어문은 n개의 대입연산과, n+1번의 비교연산, n번의 덧셈 연산을 포함하여, 총 3n + 1개의 연산이 생긴다. 추가적으로 루프문 내에서는 n번의 덧셈연산과, n번의 대입연산, 총 2n이 발생하여 해당 루프문은 최종적으로5n+1 이라는 연산을..
이번에는 seaborn라이브러리에서 lmplot()메소드를 이용한 산점도 그래프에서 성별에 따른 기호와 기호의 크기, 색상을 다르게 출력하여 보자. 앞에서 보았듯이 기준 변수 값에 따른 색상 변화를 주기 위해서는 hue매개변수의 값에 기준 변수명을 넣어주었다. 여기까지는 지난 포스팅에서 다루었었다. 이번에 주목해서 보아야할 매개변수 값은 markers, scatter_kws 매개변수를 주목해서 보면 된다. 우선 지불값과 성별에 따른 팁의 크기 그래프를 lmplot()으로 그려보자. hue매개변수를 이용해서 색상 구분하는거까지 해보자. 여기서 우선 성별에 따른 기호를 다르게 구분하고 싶다고 가정하자. 예시를 들어 'o'라는 기호와 'x'라는 기호로 표현하고 싶다고 하면 다음과 같이 나타내 주면 된다. ma..
이번에는 seaborn라이브러리를 좀 더 폭 넓게 활용해 보자. seaborn라이브러리도 그래프를 그릴 수 있는 라이브러리인데, seaborn라이브러리를 활용하면 matplotlib보다 더 화려하고 실용적인 그래프를 그릴 수 있다. 우선 라이브러리 호출을 해보자. matplotlib라이브러리를 활용했을 때와 동일하게 히스토그램부터 작성해 보자. seaborn라이브러리로 히스토그램 작성을 위해서는 matplotlib라이브러리와는 다르게, figure()객체 선언을 해줄 필요없이 subplot()메소드로 기본 틀만 만들어 주면된다. subplot()을 통해 기본틀을 만들어주면 다음과 같이 그래프의 기본 틀이 생성되는것을 볼 수 있다. seaborn 라이브러리 상에서 히스토그램을 그려주기 위해서는 distpl..
matplotlib는 파이썬에서 그래프를 그리기 위해서 사용하는 라이브러리 중 하나이다. matplotlib에는 여러가지 형태의 그래프를 그리기 위한 함수들이 존재하는데, seaborn 라이브러리에 내장되어있는 tips데이터를 가지고 matplotlib의 여러 형태의 그래프를 살펴보자. 우선 필요한 라이브러리를 호출하고 데이터셋을 불러오자. 우선 tips데이터 셋을 보면 변수는 total_bill, tip, sex, smoker, day, time, size로 구성 되어있는것을 볼 수 있다. 우선 간단한 히스토 그램을 그려보자. 히스토 그램이란 데이터셋의 변수에 대한 분포 및 빈도를 살펴볼 때 사용되는 그래프이다. 히스토 그램을 그릴때는 변수 하나를 사용하는데, 히스토그램과 같이 변수가 하나 사용되는 그..
이번에는 앤스콤 데이터 집합 4개 각각의 그래프를 그려보자. 각각의 그래프를 그리면 데이터 집합간의 차이점을 명확하게 파악할 수 있다는 장점이 있다. 그 전에 matplotlib라이브러리로 그래프를 그리는 순서를 알고가자. 1 . 전체 그래프가 위치할 틀 만들기 2 . 그래프를 그릴 그래프 격자 추가 3 . 격자에 그래프 하나씩 추가. 추가되는 순서는 왼쪽에서 오른쪽 4 . 격자 첫행이 꽉차면 두 번째 행에 그래프를 그린다. 이것이 matplotlib라이브러리로 그래프를 그리는 순서인 것이다. 우선 각각의 데이터 집합의 값별로 나눠주자. 그 다음 그래프가 위치할 틀을 만들어 주자. matplotlib라이브러리에서 그래프를 그리기 위해서는 figure객체와 최소 한개 이상의 subplot()을 요구하게 되..
데이터를 통계적으로 가지고 있는것도 좋지만 데이터를 시각화하는것도 매우 중요하다. 데이터 시각화의 전형적인 사례로 앤스콤 4분할 그래프가 있다. 앤스콤 4분할 그래프는 영국 프랭크 앤스콤이 데이터를 수치적으로만 확인할 때 발생할 수 있는 함정을 보여주기 위해 만든 그래프이다. 그렇다면 여기서 '함정'이라는 것은 무엇일까? 우선 앤스콤 4분할 그래프는 다음과 같이 생겼다. 데이터 그룹 I,II,III,IV가 있고 x,y열을 가지고 있다. 이 그래프에서 각 데이터 그룹을 해석해 보면 각각의 평균, 분산등의 수치값과 회귀선이 동일하다. 결론적으로 수치상으로만 보면 데이터그룹 I,II,III,IV는 모두 동일하다라는 결론이 나온다. 이 점이 바로 앤스콤이 말한 함정이라는 것이다. 데이터 그룹을 시각화 하면 데이..
이번에는 기존의 데이터를 가지고 그래프를 그려보자. 그래프를 그린다는 것은 데이터를 시각화 하는 것인데, 데이터를 시각화한다는 것은 데이터 분석에서 가장 중요한 요소인 것이다. 데이터를 가지고 그래프를 그리기 위해서는 matplotlib 라이브러리를 사용해 주어야 한다. 우선 판다스 라이브러리와 matplotlib라이브러리를 선언해 주자. %matplotlib inline부분은 주피터 노트북에서 그래프를 그리기 위해서 사용하는 매직함수부분이다. 예시로 연도별 나이의 평균을 낸다고 가정하자. 예시데이터를 불러오고 연도별로 나이의 평균을 그룹화 해보자. 필자의 경우 그룹화한 데이터 프레임을 gro라는 변수에 저장해 주었다. 필자가 사용하는 데이터의 형태는 다음과 같다. 그래프를 그리기 위해서는 다음과 같이 ..
한 클래스내에 두개 이상의 동일한 이름을 가진 메소드를 선언하는것은 불가능하다. 그러나 이름이 동일한메소드에서 매개변수에 대한 정보가 서로 다르다면 동일한 이름을 가진 메소드를 두개 이상 선언하는것이 가능한데, 이를 우리는 메소드 오버로딩(Method Overloading)이라고 한다. 매개변수 정보가 서로 다르다는것이 어떤 의미일까? 코드로 보면 다음과 같이 볼 수 있다. 12345class test{ void a(int b){} void a(int c, int p){} void a(int d, double e){}}cs다음 클래스를 보면 a라는 동일한 이름을 가진 메소드가 3개 선언되었다. 첫번째 a라는 메소드는 정수형 b라는 매개변수를 두번째 a라는 메소드는 정수형 c라는 메소드는 정수형 d라는 매..
문제 및 조건 사용 데이터 : ggplot2패키지의 midwest데이터 1 . pop adults는 해당 지역의 성인인구, poptotal은 전체 인구를 나타낸다. midwest데이터에 전체 인구 대비 미성년 인구 백분율 변수를 추가하시오 2 . 미성년 인구 백분율이 가장 높은 상위 5개 county의 미성년 인구 백분율을 출력하시오 3 . 분류표의 기준에 따라 미성년 비율 등급 변수를 추가하고 각 등급에 몇 개의 지역이 존재하는지 알아보시오 분류 기준 large 40%이상 middle 30~40%미만 small 30%미만 4 . popasian은 해당 지역의 아시아인 인구를 나타낸다. 전체 인구 대비 아시아인 인구 백분율 변수를 추가하고 하위 10개 지역의 state county아시아인 인구 백분율을 ..
mpg데이터에는 해당 차량에 들어가는 연비의 종류가 표시된 fl변수가 존재한다. fl 변수에는 c(CNG), d(Disel), e(Ethanol), p(Premium), r(Regular)을 의미하는 변수가 있다. mpg데이터 변수에 만약 내가 갤런당의 가격을 넣고 싶다고 하자. mpg데이터에 추가를 하기 위한 데이터 프레임을 다음과 같이 만들었다. 결론적으로는 '연료별 가격' 을 의미하기 때문에 기준 변수는 fl변수가 될것이고, 이는 새로운 데이터의 변수를 추가하는 것이기 때문에 가로로 붙이는것에 해당이 된다. mpg데이터에 방금 만든 fuel이라는 데이터 프레임을 붙여보자. 다음과 같이 말이다. 데이터를 부착하고 출력을 시키고 보면 다음과 같이 나올것이다. 결과를 보면 맨 오른쪽에 price_fl이라..
경우에 따라서 주어진 데이터에서 추가적인 데이터를 추가하여 새로운 데이터를 생성하고, 그 데이터로 분석을 하는 경우가 생길 수 도 있다. 예를 들면 학교에서 각반의 시험 데이터를 모아서 합친 후 데이터를 분석한다는 등을 예시로 들 수 있다. 데이터를 합치는데 있어서 두가지 경우로 또 나눌 수 있다. 1 . 같은 변수의 데이터를 가진 데이터를 합치는 경우(세로로 합치는 경우) 2 . 새로운 변수의 데이터를 가진 데이터를 합치는 경우(가로로 합치는 경우) 간단히 말해서 가로로 합치기, 세로로 합치기라고 하자. 가로로 합칠때는 left_join()이라는 함수를 이용하고 세로로 합치는 경우에는 bind_rows()라는 함수를 이용한다. 이 두 함수 또한 데이터를 전처리하는 경우에 사용하는 함수들이기 때문에 dp..