<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>elitein_723.log</title>
        <link>https://velog.io/</link>
        <description>hello velog :)</description>
        <lastBuildDate>Mon, 05 Dec 2022 07:39:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>elitein_723.log</title>
            <url>https://velog.velcdn.com/images/elitein_723/profile/5e3e6dde-d1fa-49e4-b6c7-6c53a8928ce0/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. elitein_723.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/elitein_723" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Vue]Vue 시작하기]]></title>
            <link>https://velog.io/@elitein_723/VueVue-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@elitein_723/VueVue-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 05 Dec 2022 07:39:45 GMT</pubDate>
            <description><![CDATA[<ul>
<li>Vue 다시 공부하려니 헷갈려서 정리중...</li>
</ul>
<h1 id="vue-start">Vue start</h1>
<ol>
<li>vscode 터미널 창 켜기</li>
<li>npm install -g @vue/cli</li>
</ol>
<ul>
<li>추가 설명(vue cli)
  1) Vue 개발을 위한 표준 도구
  2) 프로젝트 구성을 도와주는 역할
  3) 확장 플러그인, GUI, Babel 등 다양한 tool 제공</li>
</ul>
<ol start="3">
<li>vue create vue-cli ( vue2 설치해줄 것 )</li>
<li>cd vue-cli</li>
<li>npm run serve (서버가 켜지는지 확인)</li>
</ol>
<h1 id="vuex-start">Vuex start</h1>
<ol>
<li>vue create vuex-app // vue 프로젝트 생성 -&gt; 현재 vue-cli로 시작했기에 만들 필요 x</li>
<li>cd vuex-app</li>
<li>vue add vuex // Vue Cli를 통해 vuex plugin 적용</li>
</ol>
<ul>
<li><p>추가 설명
  1) src/store/index.js 가 생성됨
  2) vuex 의 핵심 컨셉 4가지</p>
<pre><code>  ####    state
      - vue 인스턴스의 data
      - 중앙에서 관리하는 상태정보(끌어다가 모든 vue 페이지에서 사용 가능)
      - $store.state로 state 데이터에 접근</code></pre><h4 id="getters">getters</h4>
<pre><code>      - state를 활용해 계산한 새로운 변수 값
      - computed에 해당
      - 첫번째 인자로 state, 두번째 인자로 getter 받음</code></pre><h4 id="mutations">mutations</h4>
<pre><code>      - 실제로 state를 변경하는 유일한 방법
      - 첫번째 인자로 state를 받으며 component혹은 Actions에서 commit()메서드로 호출</code></pre><h4 id="actions">actions</h4>
<pre><code>      - mutations와 비슷하지만 비동기 작업 포함 가능
      - state를 직접 변경하지 않고 commit() 메서드로 mutations 호출 -&gt; state 변경
      - context 객체를 인자로 받음
      - dispatch() 메서드에 의해 호출</code></pre></li>
</ul>
<h1 id="vue-router">Vue Router</h1>
<ul>
<li>이미 만들어진 vue 안에서</li>
</ul>
<ol>
<li>vue add router</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python Algorithm] 병합 정렬]]></title>
            <link>https://velog.io/@elitein_723/Python-Algorithm-%EB%B3%91%ED%95%A9-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@elitein_723/Python-Algorithm-%EB%B3%91%ED%95%A9-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Mon, 14 Nov 2022 11:33:27 GMT</pubDate>
            <description><![CDATA[<h1 id="merge-sort병합정렬">Merge Sort(병합정렬)</h1>
<ul>
<li><p>분할정복(divide and conquer) 방식을 사용해 데이터를 분할하고 분할한 집합을 정렬하여 합치는 알고리즘</p>
</li>
<li><p>시간복잡도 (nlogn)</p>
</li>
</ul>
<p>문제 - 백준 2751</p>
<ul>
<li>index 1 -&gt; 앞 그룹 시작점</li>
<li>index 2 -&gt; 뒷 그룹 시작점</li>
</ul>
<pre><code class="language-python">import sys
input = sys.stdin.readline
n = int(input())
number = [0]+list(map(int,input().split()))
tmp = [0]*(n+1)
def merge_sort(s,e): # 병합정렬
    if e-s &lt; 1 : # e보다 s가 크면 종료 
        return
    m = int((s+e)/2) # s와 e 사이의 중간값 구하기
    merge_sort(s,m) # 분할한 구간에서 앞 부분 병합정렬
    merge_sort(m+1,e) # 분할한 구간에서 뒷 부분 병합정렬
    for i in range(s,e+1):
        tmp[i]=number[i]
    k = s
    index1 = s
    index2 = m+1
    while index1 &lt;= m and index2&lt;=e: # 각각의 수행조건(s&lt;=m, m+1&lt;=e)
        if tmp[index1]&gt;tmp[index2]:
            number[k]=tmp[index2]
            k += 1
            index2+=1
        else :          # index1보다 index2가 클 경우, index1늘려주기
            number[k]=tmp[index1]
            k+=1
            index1+=1
    while index1 &lt;= m:
        number[k]=tmp[index1]   # index1이 더 커서 남아있는 경우
        k+=1
        index1+=1
    while index2 &lt;= e:
        number[k]=tmp[index2]   # index2가 값이 더 커서 남아있는 경우
        k+=1
        index2+=1

merge_sort(1,n)</code></pre>
<p>mergesort를 통해 정렬
해당 값은 for문으로 출력하기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue]Vue 개념]]></title>
            <link>https://velog.io/@elitein_723/Vue%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@elitein_723/Vue%EA%B0%9C%EB%85%90</guid>
            <pubDate>Fri, 11 Nov 2022 06:45:55 GMT</pubDate>
            <description><![CDATA[<h1 id="용어-정리">용어 정리</h1>
<h2 id="npm">NPM</h2>
<ul>
<li>전 세계에 있는 js 패키지 관리자</li>
</ul>
<h3 id="npm-run-build">npm run build</h3>
<ul>
<li>build가 되면 용량이 작아짐</li>
<li>타인에게 vue 보여줄 수 있음</li>
</ul>
<hr>
<h2 id="spasingle-page-application">SPA(Single Page Application)</h2>
<ul>
<li>HTML은 페이지가 하나밖에 없다.</li>
<li>vue 파일은 ? -&gt; 하나가 아님 ( 여러개 ) 
but) 하나의 html이 된다.</li>
</ul>
<h1 id="csr-ssr">CSR, SSR</h1>
<p>CSR : Client Side Rendering (Vue.js)
SPA : Single Page Application</p>
<p>SSR : Server Side Rendering (장고)
MPA : Mutiple Page Application (HTML이 여러개)</p>
<ul>
<li>CSR 과 SPA 
클라이언트 측에서 그리는것은 CSR
페이지가 하나인 것에 집중하면 SPA</li>
<li><em>특징은 똑같이 가져가지만 강조하는 point가 다르다.*</em></li>
</ul>
<p><strong>Vue.js는 CSR, SSR 둘 다 사용가능 ? (가능 : Nuxt.js) -&gt; 이를 보완하기 위해 새로운 프레임워크 나옴</strong></p>
<ul>
<li>Nuxt.js (vue.js 를 SSR로 사용하기 위해서 만든 웹 개발 프레임워크)</li>
<li>Next.jx (React 를 SSR로 사용하기 위해 만든 웹 개발 프레임워크)</li>
</ul>
<hr>
<h2 id="cdncontent-delivery-network">CDN(Content Delivery Network)</h2>
<pre><code class="language-vue">&lt;div id=&quot;app&quot;&gt;&lt;/div&gt;</code></pre>
<p>el:&quot;#app&quot;
app 영역을 vue.js로 사용하겠다는 의미</p>
<p>** 시간되면 typescript 꼭 보기!!!!!!!!!!!!!! **</p>
<hr>
<p><strong>mounted()</strong>
어떤 시점이 되면 자동 실행 (화면에 붙이고 나서 DOM 조작할 때 사용)
ref로 간접적으로 써야 함</p>
<p><strong>created()</strong>
화면에 붙여지지 않았을 때 자동실행(컴포넌트 생성되었는데 화면 생성 x 일 때)</p>
<p><strong>computed()</strong>
자동실행 o, 화면에 직접 쓸 수도 있음(자바스크립트를) 그러나 화면서 자바스크립트를 바로 넣으면 보기 안 좋음, and 화면에 연산 많이들어가면 화면 성능 감소. -&gt; 전처리를 목적으로 사용</p>
<p><strong>methods()</strong>
함수들 모아놓음 (v-on:click 등) </p>
<pre><code>computed와 methods의 차이 : 
methods -&gt; 실행을 시켜야 동작
computed -&gt; 자동 실행 (데이터 변경 감지 시)</code></pre><hr>
<p><strong>v-bind</strong>
<strong>v-if</strong>
<strong>v-else</strong>
<strong>v-on</strong>
<strong>v-model</strong>
<strong>v-for</strong></p>
<h3 id="바인딩">바인딩</h3>
<h4 id="양방향-바인딩">양방향 바인딩</h4>
<ul>
<li>유저가 변경할 수 있는 것<pre><code class="language-html">v-model &lt;input&gt;</code></pre>
<h4 id="단방향-바인딩">단방향 바인딩</h4>
</li>
<li>유저가 클릭해도 바꿀 수 없는 것<pre><code>  v-on, 
  v-bind -&gt; 태그의 속성 바꿀때 사용 -&gt; 변수지정, props
  {{ data }} </code></pre></li>
</ul>
<h3 id="컴포넌트">컴포넌트</h3>
<ol>
<li>자식컴포넌트 부모 컴포넌트에 붙이는 법</li>
</ol>
<ul>
<li>import (자식컴포넌트)</li>
<li>components에 등록</li>
<li>화면에 태그 형식으로 붙이기
:abd(자식) = &quot;movie&quot;(부모) -&gt; 줄 데이터</li>
</ul>
<ol start="2">
<li>컴포넌트 안에 컴포넌트 가능</li>
<li>루트 컴포넌트 가능</li>
</ol>
<h4 id="img-v-bind-다는-법">img v-bind 다는 법</h4>
<pre><code>&lt;img v-bind:src=&#39;imgUrl&#39;&gt;

 computed : {
    imgUrl() {
      return  url 주소 넣기
    }</code></pre><h4 id="this">this</h4>
<ul>
<li>template 에 붙일때는 this가 없음 -&gt; templates는 html의 영역
{{data}}</li>
</ul>
<h4 id="emit">$emit</h4>
<ul>
<li>자식 -&gt; 부모 (단, 특별한것임)</li>
</ul>
<h4 id="watch">watch</h4>
<p>감시할 데이터를 지정하고 데이터가 변경되면 실행할 자동실행함수 설정 영역, 테스트할 때 사용</p>
<h4 id="emit-1">emit</h4>
<pre><code>templates 안 구문
&lt;input @keyup.enter=&quot;onInput&quot;&gt; -&gt; 사용자가 enter키를 눌렀다 떼면 실행됨

script 안 구문
methods : {
    onInput(event) { #이벤트가 발생될 때 작동할 함수 onInput- 자식꺼)
        this.$emit(&#39;oninput&#39;) # 부모에 있는 함수(oninput)
    }
}</code></pre><h4 id="router">router</h4>
<p>template에서 사용할때,</p>
<pre><code>templates 안 구문
&lt;router-link to=&quot;/movies&quot;&gt; 전체 영화 출력 &lt;/router-link&gt; # router-link =&gt; a태그와 유사
# to에 해당하는 링크를 찾아서 해당하면 라우터 뷰에 그린다.
&lt;router-view/&gt;

/views/
/components/</code></pre><p>javascript에서 사용할 때</p>
<pre><code>this.$router.push()
방법1
this.$router.push(&#39;/movies&#39;); #경로 직접 가기
방법2
this.$router.push({name:&quot;Movies&quot;}); #네임스페이스 달아서 경로 찾기</code></pre><p><strong>router params 알아보기</strong></p>
<pre><code>배열안의 객체
const routes =[
    {
      path: &#39;/movies/id&#39;,
      name : &#39;movieDetail&#39;,
      component : MovieDetail,
    }
]
localhost:8080/movies/13000 -&gt; 13000번째 영화 뜰거임
this.$route.params.id -&gt; 사용자가 접근한 13000번을 아이디로 받아서 해당하는 값을 호출
호출되면 axios 로 해당 Id에 대한 detail 가져옴</code></pre><h4 id="navigation-guard">navigation guard</h4>
<ul>
<li>방법 1
특정 url에 접근할때 , 다른 url로 리다이렉트, 또는 해당 url로의 접근 제한
(404페이지 띄울 때)
to, from, next </li>
</ul>
<p>next() 여러번 못 씀, 딱 한 번 사용</p>
<ul>
<li>방법 2<pre><code>const routes = [
  {
      path: &quot;*&quot;,
      redirect : &quot;/404&quot;
  }
]
사용자가 지정한 라우트 값을 찾을 수 없는 경우 *로 이동</code></pre></li>
</ul>
<h4 id="vuex-는-필수인가">vuex 는 필수인가?</h4>
<ul>
<li>nono( vuex는 선택사항 )</li>
<li>컴퓨터의 갯수와는 상관없이 component에서 남의 컴퓨터에 얼마나 영향을 끼치는가에 따라 vuex 고려<pre><code>new Vuex.Store({
      state:{},    # 데이터
      mutations: {}, # state를 바꿀 때 씀. 아예 갈아엎거나 
      actions: {},    # 함수 들어감 , vue.js에서 component를 변경할 일이 있을때 사용, 들어가면 좋은게 axios(비동기 작업은 action에 들어가면 좋다)
      getters: {},     
  })
</code></pre></li>
</ul>
<pre><code>








</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Python Algorithm] 선택 정렬]]></title>
            <link>https://velog.io/@elitein_723/Python-Algorithm-%EC%84%A0%ED%83%9D-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@elitein_723/Python-Algorithm-%EC%84%A0%ED%83%9D-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Wed, 09 Nov 2022 01:35:54 GMT</pubDate>
            <description><![CDATA[<h1 id="선택정렬selection-sort">선택정렬(Selection Sort)</h1>
<ul>
<li>대상 데이터에서 최대나 최소 데이터를 데이터가 나열된 순으로 찾아가며 선택하는 방법</li>
<li>단점 : 구현 방법이 복잡, 시간 복잡도 O(n^2) -&gt; 비효율적</li>
</ul>
<h2 id="선택정렬-과정">선택정렬 과정</h2>
<ol>
<li>남은 정렬 부분에서 최솟값 또는 최댓값을 찾는다.</li>
<li>남은 정렬 부분에서 가장 앞에 있는 데이터와 선택된 데이터를 swap</li>
<li>가장 앞에 있는 데이터의 위치를 변경해(index++) 남은 정렬 부분의 범위 축소</li>
<li>전체 데이터 크기만큼 index 가 커질 때까지, 즉 남은 정렬 부분이 없을 때까지 반복</li>
</ol>
<p><img src="https://velog.velcdn.com/images/elitein_723/post/799f5fae-5474-4a24-a975-8bdda4e0e224/image.png" alt="선택정렬"></p>
<pre><code class="language-Python">1427 소트인사이드 (백준)
num=list(input())
n = len(num)
k = 0
max_num = -1
while k&lt;n and max_num!=0:   #  k는 max값 구해줄 index
    max_num = max(num[k:])
    for i in range(n):
        if max_num == 0:    # max_num==0일 시, 바뀔 값이 없으므로 break
            break
        if max_num == num[i]:      #max_num과 num[i]가 같을 시 swap -&gt; 단 같은 값이 여러개 있을 수 있으니 모든 값을 확인하며 바꿔
            num[k],num[i]=num[i],num[k]
            k+=1

print(&#39;&#39;.join(num))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python Algorithm]버블정렬]]></title>
            <link>https://velog.io/@elitein_723/Python-Algorithm%EB%B2%84%EB%B8%94%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@elitein_723/Python-Algorithm%EB%B2%84%EB%B8%94%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Wed, 09 Nov 2022 00:19:44 GMT</pubDate>
            <description><![CDATA[<h1 id="버블-정렬-bubble-sort">버블 정렬 (Bubble Sort)</h1>
<ul>
<li>두 인접한 데이터의 크기를 비교해 정렬하는 방법</li>
<li>시간복잡도 O(n^2)</li>
</ul>
<h2 id="버블-정렬-과정">버블 정렬 과정</h2>
<ol>
<li>비교 연산이 필요한 루프 범위 설정</li>
<li>인접한 데이터 값 비교</li>
<li>swap 조건에 부합하면 swap 연산 수행</li>
<li>루프의 범위가 끝날 때까지 2-3번 반복</li>
<li>정렬 영역 설정, 다음 루프 실행 시 이 영역 제외</li>
<li>비교대상이 없을 때까지 1-5번 반복<ul>
<li>출처 : Do-it 정렬</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/elitein_723/post/5fa3020a-b455-4673-a54c-0d7386275a78/image.png" alt=""></p>
<h2 id="코드">코드</h2>
<pre><code class="language-python">length = [3,7,1,2,8]
n = len(length)
for i in range(n):
    for j in range(n):
        if length[i]&gt;length[j]:
            length[i],length[j] = length[j],length[i] # swap

# 결과값 [8, 7, 3, 2, 1]
내림차순 정렬
-&gt; 오름차순 정렬 시,  length[i] &lt; length[j]로 조건 변경해주면 됨</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[웹-네트워크] HTTP 메서드 활용]]></title>
            <link>https://velog.io/@elitein_723/%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@elitein_723/%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Tue, 08 Nov 2022 15:08:36 GMT</pubDate>
            <description><![CDATA[<h2 id=""></h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[웹-네트워크]HTTP 메서드]]></title>
            <link>https://velog.io/@elitein_723/%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%ACHTTP-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@elitein_723/%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%ACHTTP-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Tue, 08 Nov 2022 14:50:09 GMT</pubDate>
            <description><![CDATA[<h2 id="리소스">리소스</h2>
<ul>
<li><p>ex) 미네랄을 캐라 -&gt; 미네랄이 리소스</p>
</li>
<li><p>회원이라는 개념 자체가 리소스</p>
</li>
<li><p>리소스 식별법</p>
<ul>
<li>회원 등록, 수정, 조회하는 것 모두 배제</li>
<li>회원이라는 리소스만 식별 -&gt; URI 매핑</li>
</ul>
</li>
</ul>
<h2 id="http-메서드">HTTP 메서드</h2>
<h3 id="--get-post-put-patch-delete">- GET, POST, PUT, PATCH, DELETE</h3>
<ul>
<li>GET : 리소스 조회</li>
<li>POST : 요청 데이터 처리, 주로 등록에 사용</li>
<li>PUT : 리소스 대체, 해당 리소스가 없으면 생성</li>
<li>PATCH : 리소스 부분 변경</li>
<li>DELETE : 리소스 삭제</li>
</ul>
<p>&#39; 최근에는 Representation으로 바뀜</p>
<ul>
<li>기타 메서드<ul>
<li>HEAD : 상태 줄과 헤더만 반환</li>
<li>OPTITONS</li>
<li>CONNECT</li>
</ul>
</li>
</ul>
<h3 id="get">GET</h3>
<ul>
<li>리소스 조회</li>
<li>서버에 전달하고 싶은 데이터느 query를 통해서 전달</li>
</ul>
<h3 id="post">POST</h3>
<ul>
<li><strong>요청 데이터 처리</strong><ul>
<li>주문 결제완료 -&gt;(배달 시작 요청은 POST) 배달시작 -&gt; 배달완료</li>
<li>프로세스 진행에 사용</li>
</ul>
</li>
<li>클라이언트에서 서버로 요청을 보낼 때, 서버 받아서 요청 데이터 처리<ul>
<li>메시지 바디를 통해 들어온 데이터 처리</li>
</ul>
</li>
<li>주로 전달된 데이터로 신규 리소스 등록
( 주로 등록에 많이 사용 )</li>
<li>JSON으로 조회데이터를 넘겨야 하는데 GET 메서드 사용하기 어려운 경우 POST 사용</li>
<li>POST는 모든걸 할 수 있다. but 조회할때는 GET을 쓰는게 유리</li>
</ul>
<h4 id="post는-요청-데이터를-어떻게-처리한다는-뜻인가">POST는 요청 데이터를 어떻게 처리한다는 뜻인가?</h4>
<ul>
<li>대상 리소스가 리소스의 고유 한 의미 체계에 따라 요청에 포함 된 표현을 처리하도록 요청</li>
<li>HTML FROM에서 회원가입, 주문 등 사용</li>
<li>게시판 글 , 뉴스, 그룹, 메일링 등 </li>
<li>서버가 식별하지 않은 새 리소스 생성</li>
<li>기존 자원에 데이터 추가</li>
</ul>
<h3 id="put">PUT</h3>
<ul>
<li>리소스 대체<ul>
<li>리소스가 있으면 대체<ul>
<li>리소스가 없으면 생성</li>
</ul>
</li>
<li>쉽게 이야기해서 덮어버림</li>
</ul>
</li>
<li>클라이언트가 리소스 식별<ul>
<li>클라이언트가 리소스 위치 알고 URI 지정</li>
<li>POST와 차이점</li>
</ul>
</li>
</ul>
<h3 id="patch">PATCH</h3>
<ul>
<li>PATCH 로 보내게 되면 age만 50으로 변경</li>
<li>리소스를 부분적으로 바꾸고 싶을때 사용</li>
<li>PATCH가 지원이 안 되는 서버일 경우, POST를 하면 된다. ( 요즘에는 대부분 지원 )</li>
</ul>
<h3 id="delete">DELETE</h3>
<ul>
<li>리소스 제거</li>
</ul>
<h2 id="http-메서드의-속성">HTTP 메서드의 속성</h2>
<h3 id="안전">안전</h3>
<ul>
<li>호출해도 리소스 변경 x</li>
<li>GET,HEAD 안전 </li>
<li>POST,DELETE 안전 x</li>
</ul>
<h3 id="멱등idempotent">멱등(Idempotent)</h3>
<ul>
<li><p>한 번 호출하든 두 번 호출하든 결과가 똑같다.</p>
</li>
<li><p>PUT, GET, DELETE, POST(멱등아님)</p>
<ul>
<li>GET : 조회는 언제해도 결과가 같다.</li>
<li>PUT : 결과를 대체한다. 요청을 여러번 해도 최종 결과는 같다.</li>
<li>DELETE : 결과 삭제 , 여러번 해도 삭제되는 것은 같다</li>
<li>POST : 멱등이 아님!!!!! 두번 결제하면 중복결제됨</li>
</ul>
</li>
<li><p>자동 복구 메커니즘 (DELETE 했는데 서버에 응답이 없을때, ( 재요청 가능 - 결과는 같기에 ) 자동복구 메커니즘 사용 가능 )</p>
</li>
<li><p>but 재요청 중간에 다른 곳에서 리소스 변경해버리면?</p>
<ul>
<li>사용자 1 GET: username A age 20<ul>
<li>사용자 2 PUT: username A age 30</li>
<li>사용자 1 GET: username A age 30
중간에 리소스가 변경되는 것을 멱등은 고려 x -&gt; 해당 상황은 멱등하지 x</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="캐시가능">캐시가능</h3>
<ul>
<li>응답 결과를 캐시해서 사용해도 되는가?</li>
<li>GET, HEAD, POST, PATCH 캐시 가능</li>
<li>실제로는 GET, HEAD 정도만 캐시로 가능<ul>
<li>POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지않음</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[웹 네트워크] # URL, URN , URI]]></title>
            <link>https://velog.io/@elitein_723/%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-URL-URN-URI</link>
            <guid>https://velog.io/@elitein_723/%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-URL-URN-URI</guid>
            <pubDate>Tue, 08 Nov 2022 13:44:19 GMT</pubDate>
            <description><![CDATA[<h1 id="uri-url-urn">URI, URL, URN</h1>
<h2 id="uri와-웹브라우저-요청-흐름">URI와 웹브라우저 요청 흐름</h2>
<ul>
<li>URI (Resource Identifier)</li>
</ul>
<ol>
<li>Uniform : 리소스 식별하는 통일된 방식</li>
<li>Resource : 자원, URI로 식별할 수 있는 모든 것</li>
<li>Identifier : 다른 항목과 구분하는데 필요한 정보</li>
</ol>
<ul>
<li>URL (Resource Locator)<ul>
<li>김영한이 있는 위치 (naver.com)</li>
</ul>
</li>
<li>URN(Resource Name)<ul>
<li>김영한 그 자체 (IP 주소)</li>
</ul>
</li>
</ul>
<p>ex) <a href="https://www.google.com:443/search?q=hello&amp;hl=ko">https://www.google.com:443/search?q=hello&amp;hl=ko</a>
IP : 200.200.200.2
웹 브라우저 DNS 조회 -&gt; HTTP 요청 메시지 만들어줌
Path 부터 query 정보, host 정보 등을 포함한 HTTP 요청 메서드 만들어짐</p>
<ol>
<li>웹 브라우저가 HTTP 메시지 생성</li>
<li>SOCKET 라이브러리 통해 전달<ul>
<li>A : TCP/IP 연결(IP,PORT)</li>
<li>B : 데이터 전달</li>
</ul>
</li>
<li>패킷 생성</li>
<li>인터넷망으로 요청 패킷 전달. -&gt; 구글 서버가 HTTP 메시지만 꺼내서 확인</li>
<li>구글 웹 서버에서 HTTP 응답 메시지 만들어둠</li>
<li>구글 웹 서버가 응답 패킷 만들어서 웹 브라우저에 전달</li>
<li>HTML 데이타를 웹 브라우저가 받아서 렌더링, HTML 정보를 보게됨</li>
</ol>
<h2 id="http">HTTP</h2>
<h3 id="모든-것이-http">모든 것이 HTTP</h3>
<p>Hyper Text Transfer Protocol</p>
<ul>
<li>HTML, TEXT, IMAGE, 음성,영상, 파일</li>
<li>JSON, XML(API)</li>
<li>거의 모든 형태의 데이터 전송 가능</li>
<li>서버간에 데이터를 주고받을 때도 대부분 HTTP 사용</li>
</ul>
<h3 id="http-의-역사">HTTP 의 역사</h3>
<ul>
<li>HTTP/1.1 1997년 : 우리에게 가장 중요한 버전<ul>
<li>대부분의 기능 첨부</li>
</ul>
</li>
</ul>
<h3 id="기반-프로토콜">기반 프로토콜</h3>
<ul>
<li><strong>TCP</strong> : HTTP/1.1 ,HTTP/2</li>
<li><strong>UDP</strong> : HTTP/3</li>
</ul>
<h3 id="http-특징">HTTP 특징</h3>
<ul>
<li>클라이언트 서버 구조</li>
<li>무상태 프로토콜, 비연결성</li>
<li>HTTP 메시지</li>
<li>단순함, 확장 가능</li>
</ul>
<h4 id="클라이언트-서버-구조">클라이언트 서버 구조</h4>
<ul>
<li>클라이언트가 서버에 요청</li>
<li>서버에서 결과를 만들어서 응답</li>
<li>클라이언트와 서버가 중요한 이유<ul>
<li>분리됨으로 데이터를 서버에 몰고, URN 은 클라이언트에 집중</li>
<li>클라이언트 복잡한 구조를 다룰 필요 x 다 데이터가 다룸</li>
<li>복잡한 비지니스 로직 서버 한곳에서 집중</li>
<li>회사가 비즈니스가 잘 되어서 트래픽 폭파 시, 클라이언트는 몰라도 됨, 서버에서 고민할 부분</li>
<li>양쪽이 독립적으로 활동 가능</li>
</ul>
</li>
</ul>
<h4 id="무상태-프로토콜stateless">무상태 프로토콜(Stateless)</h4>
<ul>
<li>예시
(Stateful)
고객 : 이 노트북 얼마인가요? 
점원 : 100만원 입니다.
고객 : 2개 구매
점원 : 200만원 입니다.</li>
<li><blockquote>
<p>중간에 다른 점원으로 바뀌면 안 됨</p>
</blockquote>
</li>
</ul>
<p>(Stateless)
고객 : 노트북 얼마?
점원 A : 100만원
고객 : 노트북 2개 살게요
점원 B : 신용카드로 구매하실건가요?
고객 : 노트북 2개 신용카드로
점원 C : 결제 완료</p>
<p><strong>Stateless 장점</strong></p>
<ul>
<li>서버가 클라이언트의 상태 보존 x</li>
<li>중간에 다른 점원으로 바뀌면 원하는 데이터(문맥) 이 없어짐 - 고객이 필요한 데이터를 중간 중간에 다 보내야 함</li>
<li>상태 유지를 안 하기에 무한 증식이 가능 (확장성 多) : 스케일 아웃</li>
<li>갑자기 클라이언트 요청이 증가해도 서버를 대거 투입 할 수 있음</li>
</ul>
<p><strong>Stateless 단점</strong></p>
<ul>
<li>모든 것을 무상태로 설계할 수 있는 경우도 있고 없는 경우도 있음</li>
<li>브라우저 쿠키와 서버 세션 등을 이용해 상태 유지(서버 세션 날아가면 다 로그인 정보 풀림)</li>
<li>상태 유지는 최소한만 써야 함</li>
<li>데이터를 너무 많이 보냄</li>
</ul>
<h4 id="비연결성">비연결성</h4>
<ul>
<li>연결 주고 받으면 연결을 바로 끊어버림</li>
<li>서버에서는 자원을 현재 요청을 주고받을때만 쓰고 끊어버려서 자원을 최소한으로 유지 가능</li>
<li>HTTP 는 기본이 연결을 유지하지 않는 모델</li>
<li>초단위 이하의 빠른 속도로 응답</li>
<li>1시간동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음</li>
</ul>
<p>비연결성의 단점</p>
<ul>
<li>TCP/IP 연결을 새로 해야함 (새로고침 할 때마다)</li>
<li>웹 브라우저로 사이트 요청하면 수많은 자원 함께 다운로드</li>
<li>HTTP 지속 연결로 문제를 해결함</li>
</ul>
<h4 id="http-메시지">HTTP 메시지</h4>
<p><img src="https://velog.velcdn.com/images/elitein_723/post/85e240bf-fd97-4c81-8e9a-0054e07404af/image.png" alt="HTTP 메시지 구조"></p>
<ul>
<li><strong>시작라인</strong><ul>
<li>request-line<ul>
<li>요청메시지 : GET, POST, PUT, DELETE</li>
</ul>
</li>
<li>요청 대상<ul>
<li>absolute-path[?query] 절대경로[?쿼리]</li>
</ul>
</li>
<li>HTTP 버전</li>
</ul>
</li>
</ul>
<h4 id="http-헤더">HTTP 헤더</h4>
<p>용도</p>
<ul>
<li>HTTP전송에 필요한 모든 부가정보</li>
<li>표준 헤더가 너무 많음</li>
<li>필요시 임의의 헤더 추가 가능</li>
</ul>
<h4 id="http-메시지-바디">HTTP 메시지 바디</h4>
<ul>
<li>실제 전송할 데이터</li>
<li>HTML 문서, 이미지, 영상 등</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준 1541] 잃어버린괄호]]></title>
            <link>https://velog.io/@elitein_723/%EB%B0%B1%EC%A4%80-1541-%EC%9E%83%EC%96%B4%EB%B2%84%EB%A6%B0%EA%B4%84%ED%98%B8</link>
            <guid>https://velog.io/@elitein_723/%EB%B0%B1%EC%A4%80-1541-%EC%9E%83%EC%96%B4%EB%B2%84%EB%A6%B0%EA%B4%84%ED%98%B8</guid>
            <pubDate>Sun, 04 Sep 2022 12:15:46 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p>세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.</p>
<p>그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.</p>
<p>괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.</p>
<h3 id="출력">출력</h3>
<p>첫째 줄에 정답을 출력한다.</p>
<h3 id="풀이">풀이</h3>
<p>부등호를 넣어주는 리스트와 값을 넣어주는 리스트를 따로 만들어준다. 처음 for문에서는 값을 int로 바꿔주기위해 ex에서 숫자일 경우 문자열로 묶어 저장해준 후 int로 변환하여 값을 넣어주는 리스트에 넣어준다. 부등호일 시, 부등호를 넣기위해 만든 리스트에 저장, 첫 값은 plus에 저장시키고 pop을 이용해 빼준다. </p>
<pre><code class="language-python">#1541번
ex = input()
ex_list,ineq = [],[]
ex_num = &#39;&#39;

for i in ex :
    if i.isdigit():                 # 값이 숫자면 ex_num문자열에 i 더해주기
        ex_num += i
    else :
        ex_list.append(int(ex_num)) # 숫자 아닐 시, ex_num 문자열에 모은 값 int값으로 변형해서 ex_list에 넣어주기
        ineq.append(i)              # 해당 i는 ineq리스트에 넣어주기
        ex_num = &#39;&#39;                 # ex_num 초기화

ex_list.append(int(ex_num))
plus,minus = ex_list.pop(0),0

for i in range(len(ex_list)):       
    if ineq[i] == &#39;-&#39;:              # ineq가 -일 경우
        if minus :                  # minus가 양의 값이면 plus에 넣어주고 초기화
            plus -= minus
            minus = 0
            minus += ex_list[i]
        else :                      # minus가 0일 시, minus에 값 채워주기
            minus += ex_list[i]
    else :
        if minus :                  # + 단위일 때, minus가 양수면 minus에 계속 채워주기
            minus += ex_list[i]
        else :                      # 0일 시, plus값에 계속 더해주기
            plus += ex_list[i]
print(plus-minus)</code></pre>
<h3 id="후기">후기</h3>
<p>생각보다 if문을 많이 쓰게만든 문제, 더 간단한 조건 알아보기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준 13305] 주유소]]></title>
            <link>https://velog.io/@elitein_723/%EB%B0%B1%EC%A4%80-13305-%EC%A3%BC%EC%9C%A0%EC%86%8C</link>
            <guid>https://velog.io/@elitein_723/%EB%B0%B1%EC%A4%80-13305-%EC%A3%BC%EC%9C%A0%EC%86%8C</guid>
            <pubDate>Sun, 04 Sep 2022 11:32:14 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p>어떤 나라에 N개의 도시가 있다. 이 도시들은 일직선 도로 위에 있다. 편의상 일직선을 수평 방향으로 두자. 제일 왼쪽의 도시에서 제일 오른쪽의 도시로 자동차를 이용하여 이동하려고 한다. 인접한 두 도시 사이의 도로들은 서로 길이가 다를 수 있다. 도로 길이의 단위는 km를 사용한다.</p>
<p>처음 출발할 때 자동차에는 기름이 없어서 주유소에서 기름을 넣고 출발하여야 한다. 기름통의 크기는 무제한이어서 얼마든지 많은 기름을 넣을 수 있다. 도로를 이용하여 이동할 때 1km마다 1리터의 기름을 사용한다. 각 도시에는 단 하나의 주유소가 있으며, 도시 마다 주유소의 리터당 가격은 다를 수 있다. 가격의 단위는 원을 사용한다.</p>
<p>예를 들어, 이 나라에 다음 그림처럼 4개의 도시가 있다고 하자. 원 안에 있는 숫자는 그 도시에 있는 주유소의 리터당 가격이다. 도로 위에 있는 숫자는 도로의 길이를 표시한 것이다. </p>
<p>제일 왼쪽 도시에서 6리터의 기름을 넣고, 더 이상의 주유 없이 제일 오른쪽 도시까지 이동하면 총 비용은 30원이다. 만약 제일 왼쪽 도시에서 2리터의 기름을 넣고(2×5 = 10원) 다음 번 도시까지 이동한 후 3리터의 기름을 넣고(3×2 = 6원) 다음 도시에서 1리터의 기름을 넣어(1×4 = 4원) 제일 오른쪽 도시로 이동하면, 총 비용은 20원이다. 또 다른 방법으로 제일 왼쪽 도시에서 2리터의 기름을 넣고(2×5 = 10원) 다음 번 도시까지 이동한 후 4리터의 기름을 넣고(4×2 = 8원) 제일 오른쪽 도시까지 이동하면, 총 비용은 18원이다.</p>
<p>각 도시에 있는 주유소의 기름 가격과, 각 도시를 연결하는 도로의 길이를 입력으로 받아 제일 왼쪽 도시에서 제일 오른쪽 도시로 이동하는 최소의 비용을 계산하는 프로그램을 작성하시오.</p>
<h3 id="입력">입력</h3>
<p>표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1개의 자연수로 주어진다. 다음 줄에는 주유소의 리터당 가격이 제일 왼쪽 도시부터 순서대로 N개의 자연수로 주어진다. 제일 왼쪽 도시부터 제일 오른쪽 도시까지의 거리는 1이상 1,000,000,000 이하의 자연수이다. 리터당 가격은 1 이상 1,000,000,000 이하의 자연수이다. </p>
<h3 id="출력">출력</h3>
<p>표준 출력으로 제일 왼쪽 도시에서 제일 오른쪽 도시로 가는 최소 비용을 출력한다. </p>
<h3 id="풀이">풀이</h3>
<pre><code class="language-python"># 주유소
N = int(input())
min_price = 1000000001
road = list(map(int,input().split()))
price = list(map(int,input().split()))
ans = 0
for i in range(N-1):
    if price[i] &lt; min_price :       # 최솟값일 시 다음 길을 갈 때 최솟값만큼 주유
        min_price = price[i]
    ans += min_price * road[i]
print(ans)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준 1931]회의실 배정 ]]></title>
            <link>https://velog.io/@elitein_723/%EB%B0%B1%EC%A4%80-1931%ED%9A%8C%EC%9D%98%EC%8B%A4-%EB%B0%B0%EC%A0%95</link>
            <guid>https://velog.io/@elitein_723/%EB%B0%B1%EC%A4%80-1931%ED%9A%8C%EC%9D%98%EC%8B%A4-%EB%B0%B0%EC%A0%95</guid>
            <pubDate>Sun, 04 Sep 2022 11:29:22 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p>한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.</p>
<h3 id="출력">출력</h3>
<p>첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.</p>
<h3 id="풀이">풀이</h3>
<p>회의실을 배정할 때, 리스트의 가장 앞 값을 정렬해주어 작은 값부터 for문으로 돌리는게 효율적 따라서 sort로 정렬해준다. 후 가장 작은 값부터 끝나는 시간이 다음 시작시간보다 작다면 min_time 변수를 다음 값으로 바꿔준 후 카운트 값을 올려준다. 만약 받는 arr의 값이 min_time 의 값보다 시작시간이 크거나 같지만 끝나는 시간이 작다면 min_time 값을 해당 값으로 바꿔주고 다시 for문을 진행한다.</p>
<pre><code class="language-python">#회의실배정
N = int(input())
arr = [list(map(int,input().split())) for _ in range(N)]
arr=sorted(arr)                 #회의실 값 앞에서부터 정렬
min_time = arr[0]
cnt = 1
for i in range(1,N):            # 시작시간 &lt;= 끝나는시간일 시 , min_time 교체
    if min_time[1] &lt;= arr[i][0]:
        min_time = arr[i]
        cnt += 1
    elif min_time[0]&lt;=arr[i][0] and min_time[1]&gt;=arr[i][1]:     # 1의시작시간&lt;=2의시작시간, 1의끝나는시간&gt;=2의끝나는시간
        min_time = arr[i]
print(cnt)
</code></pre>
<h3 id="후기">후기</h3>
<p>처음 이중 for문을 사용해서 시간초과가 났다. 그리디형 문제의 경우 효율적 코드에 대한 고민을 해봐야 할듯</p>
]]></description>
        </item>
    </channel>
</rss>