<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>d-helle.log</title>
        <link>https://velog.io/</link>
        <description>done is better than perfect.</description>
        <lastBuildDate>Fri, 29 Oct 2021 13:43:46 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>d-helle.log</title>
            <url>https://images.velog.io/images/d-helle/profile/86428fcb-b6dd-4bc3-ace3-a560f57d8b3b/IMG_0366.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. d-helle.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/d-helle" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[React Basics : w1]]></title>
            <link>https://velog.io/@d-helle/React-Basics-w1</link>
            <guid>https://velog.io/@d-helle/React-Basics-w1</guid>
            <pubDate>Fri, 29 Oct 2021 13:43:46 GMT</pubDate>
            <description><![CDATA[<h1 id="리액트-기초-ft-코딩애플">리액트 기초 (ft. 코딩애플)</h1>
<blockquote>
<p><strong>1. 리액트 등장배경 &amp; 필요성</strong></p>
</blockquote>
<h4 id="web-app-웹앱의-등장">&lt; Web App (웹앱)의 등장 &gt;</h4>
<ul>
<li>모바일의 앱과 비슷한 사용성(UI, UX)을 제공하는 웹을 의미</li>
<li>새로고침없이 페이지 이동 가능 → 사용자 경험 증대 → 구매전환에 효과가 있음이 입증됨</li>
<li>이런 웹앱(SPA)을 만들기 쉽게 해주는 대표적인 라이브러리 : React, Vue, Angular이 있음</li>
<li>웹앱은 앱과 비슷하므로 앱으로 만들기 용이 : pwa, react native등을 사용하면 됨</li>
</ul>
<blockquote>
<p><strong>2. 리액트 구조 &amp; 동작방식</strong></p>
</blockquote>
<h4 id="setting">&lt; Setting &gt;</h4>
<ul>
<li>node 설치 : <code>node -v</code></li>
<li>npm, npx 설치 : node 설치하면 자동적으로 설치됨 → <code>npm -v</code> <code>npx -v</code><ul>
<li>npm : node.js 기반의 라이브러리들을 설치할 수 있는 스토어 (앱스토어 느낌)</li>
<li>npx : npm처럼 완전히 설치하는 것이 아니라 프로젝트를 만들때 가장 최신의 버전을 기반으로 만드는 것</li>
</ul>
</li>
<li>vscode 설치</li>
</ul>
<h4 id="create-react-app">&lt; create-react-app &gt;</h4>
<p>→ SPA를 만들기 위한 가장 보편적인 템플릿 (boilerplate)를 제공하는 라이브러리. (명령어 하나로 프로젝트 셋업을 끝낼 수 있음)</p>
<p>→ create-react-app 없이도 SPA를 만들 수 있음. 대부분의 현업에서는 create-react-app를 사용하지 않고 프로젝트에 맞는 커스터마이징을 위해 처음부터 빌드하는 경우가 많음</p>
<ul>
<li><p>folder structure</p>
<ul>
<li><p>node_modules : 프로젝트에 필요한 모든 라이브러리들이 저장된 폴더</p>
</li>
<li><p>public : static(정적인) 파일들이 저장된 폴더</p>
<ul>
<li>index.html : 프로젝트의 유일한 html 파일 → SPA 특징</li>
<li>robots.txt : SEO 로봇들이 해당 웹을 탐색할때 필요한 파일</li>
<li>build : 프로젝트를 배포할때 바벨을 통해 압축된 파일들이 저장됨</li>
<li>etc : favicon, image등이 저장됨</li>
</ul>
</li>
<li><p>src : source code를 저장하는 폴더 → 주로 작업하는 폴더</p>
<ul>
<li><p>index.js : index.html (html)과 App.js(react)를 연결시켜주는 파일</p>
<p>  → html의 id == root인 div안에 App.js와 기타 리액트 파일들이 생성한 JS파일들을 주입시켜주는 역할을 함</p>
</li>
<li><p>app.js : 리액트의 메인 파일.</p>
</li>
<li><p>app.css &amp; index.css : 각각 app.js와 index.css를 꾸며주는 css파일 BUT 생략가능</p>
</li>
</ul>
</li>
<li><p>package.json : 설치된 모든 라이브러리들의 이름과 버전이 기록됨.</p>
<p>  → 필요한 이유 : 배포를 할 때 node_modules까지 포함될 경우 너무 무거워지므로 node_modules 없이 배포를 함. 하지만 다른 사용자의 경우 해당 node_modules가 없으면 프로젝트를 실행할 수 없으므로 이때 package.json을 사용해서 해당 프로젝트에 필요한 모든 dependencies들을 한꺼번에 다운받을 수 있음 :  <code>npm install</code>  명령어로 설치가능</p>
</li>
<li><p>package-lock.json : 라이브러리들안에는 또 세부적인 패키지들이 들어있음. 이 세부적인 패키지들의 이름과 버전까지 기록된 파일.</p>
</li>
<li><p>.gitignore : git의 tracking을 받지않는 파일들을 명시하는 곳.</p>
<p>  → node_modules, build와 같은 폴더들이 주로 해당됨</p>
<p>  <img src="%E1%84%85%E1%85%B5%E1%84%8B%E1%85%A2%E1%86%A8%E1%84%90%E1%85%B3%20%E1%84%80%E1%85%B5%E1%84%8E%E1%85%A9%20(ft%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B5%E1%86%BC%E1%84%8B%E1%85%A2%E1%84%91%E1%85%B3%E1%86%AF)%20b670c5a1b3c5416088f5f27ee69ae879/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2021-10-29_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_6.19.40.png" alt="스크린샷 2021-10-29 오후 6.19.40.png"></p>
</li>
</ul>
</li>
<li><p>프로젝트 실행 : <code>npm start</code> → <a href="http://localhost:3000">localhost:3000</a> 에서 웹페이지 볼 수 있음</p>
</li>
</ul>
<blockquote>
<p><strong>3. JSX 문법</strong></p>
</blockquote>
<h4 id="jsx-javascript-xml">&lt; JSX (JavaScript XML) &gt;</h4>
<ul>
<li><p>react 고유문법</p>
</li>
<li><p>render안에서 사용됨</p>
</li>
<li><p>html과 javascript가 결합된 문법 → 리액트는 js파일내에서 html문법을 사용할 수 있도록 JSX를 만듦</p>
</li>
<li><p>JSX안에서 javascript를 사용할때는 <code>{}</code> 안에 작성해야함</p>
</li>
<li><p>class가 아닌 className을 사용 → 자바스크립트의 className api를 사용하는 것</p>
</li>
<li><p>inline style을 작성할 경우 자바스크립트 문법 + 객체를 사용 → <code>{{ }}</code> 안에 작성해야함</p>
<ul>
<li>속성은 <code>-</code> 대신 camelcase를 이용 (ex. background-color ⇒ backgroundColor)</li>
<li>스타일 구분은 <code>,</code> 로 함</li>
<li>속성값의 숫자의 디폴트 단위는 <code>px</code> 임</li>
<li>속성값은 문자열 아니면 숫자로 작성됨</li>
</ul>
</li>
<li><p>반드시 상위태그는 하나만 존재해야함</p>
<p>  → error message : `</p>
<p>  → 상위 태그가 필요없는 경우 : <fragment> 태그 사용 ( &lt;&gt; 로 대체가능 )</p>
</li>
<li><p>데이터 바인딩이 쉬움</p>
<ul>
<li><p>데이터 바인딩 : 데이터를 html에 집어넣는 것</p>
<p>  → 자바스크립트에서는 document.getElement ~~ 등 여러줄의 코드를 써야함</p>
<p>  → 리액트에서는 변수에 저장뒤 바로 html tag사이에 <code>{변수}</code> 를 사용해서 집어넣을 수 있음</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>4. State</strong></p>
</blockquote>
<h4 id="데이터를-저장하는-2가지-방법">&lt; 데이터를 저장하는 2가지 방법 &gt;</h4>
<ul>
<li>변수에 저장 : 데이터가 변경이 되어도 자동적으로 리랜더링이 진행되지 않음 → 새로고침을 해야지 업데이트된 내용을 볼 수 있음</li>
<li>state에 저장 : 데이터가 변경되면 자동적으로 리랜더링이 됨 → 새로고침없이 웹앱처럼 동작</li>
</ul>
<p>⇒ 결론: 정적인 데이터는 변수에 저장, 동적인 데이터 (값이 변경되는 데이터)는 state에 저장</p>
<h4 id="state-사용방법">&lt; state 사용방법 &gt;</h4>
<ul>
<li><p>class component</p>
</li>
<li><p>function component</p>
<ul>
<li><p>state를 사용하기 위해서 hook를 사용해야함 → useState  (import 필요)</p>
</li>
<li><p>useState(초기값)는 [초기값, 값을 변경하는 함수]를 리턴함</p>
<p>  → destructure 문법 (es6)을 사용하여 배열에 담음</p>
<p>  → 보통 <code>[데이터이름, set데이터이름]</code> 형태로 지음</p>
<p>  → useState의 인자로는 배열, 객체등이 들어갈 수 있음</p>
</li>
</ul>
</li>
</ul>
<pre><code>```jsx
import React, {useState} from &#39;react&#39;

function App() {
    return(
        const [count,setCount] = useState(0) // count=0, setCount는 함수
    )
}
```</code></pre><blockquote>
<p><strong>5. 이벤트 리스너 적용</strong></p>
</blockquote>
<ul>
<li>DOM의 모든 노드 (element)에는 이벤트를 적용할 수 있음</li>
</ul>
<h4 id="이벤트-리스너-적용-방법">&lt; 이벤트 리스너 적용 방법 &gt;</h4>
<ul>
<li>addEventListener(event 종류, event 발생시 실행시킬 함수 - 콜백)</li>
<li>html element의 속성으로 <code>onEventName</code> , 속성값으로 콜백함수 or 함수이름 주기<ul>
<li>콜백함수 : arrow function</li>
<li>함수이름 : <code>()</code> 호출없이 함수이름만 !!</li>
</ul>
</li>
</ul>
<h4 id="이벤트-리스너를-사용해서-state값을-변경할-때">&lt;이벤트 리스너를 사용해서 state값을 변경할 때 &gt;</h4>
<ul>
<li><p>state값을 변경할 때는 반드시 setState 함수를 사용해야함!!</p>
<ul>
<li><p>setState를 사용해야지만 리랜더링이 발생하기 때문</p>
</li>
<li><p>setState에서는 기존의 값의 부분을 재할당할 수 없음. 통으로 대체하는 방식임</p>
<pre><code class="language-jsx">  import React, {useState} from &#39;react&#39;

  function App() {
      const [menu, setMenu] = useState([&#39;icecream&#39;, &#39;donut&#39;, &#39;burger&#39;]);

      return (
          &lt;&gt;
              &lt;button onClick={() =&gt; setMenu(menu[0] = &#39;pizza&#39;)}&gt;메뉴변경&lt;/button&gt;  //불가
              &lt;button onClick={() =&gt; setMenu(menu = [&#39;pizza&#39;,&#39;donut&#39;, &#39;burger&#39;])}&gt;메뉴변경&lt;/button&gt; //가능
          &lt;/&gt;        
      }
  }</code></pre>
</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>6. State 변경 방법 - Deep Copy</strong></p>
</blockquote>
<h4 id="state를-변경하는-방법">&lt; State를 변경하는 방법 &gt;</h4>
<ol>
<li><p>대체할 값을 통으로 넣기 : 위에서 언급한 방법</p>
</li>
<li><p>복사본을 생성 → 수정 → setState함수에 전달하는 방법</p>
<ul>
<li><p>Deep Copy : array, object와 값이 reference data type (참조 자료형)의 경우 복사본을 그냥 만드면 복사가 아닌 값을 공유함 → 제대로 된 복사가 일어나지 않아서 deep copy를 사용해야함</p>
<ul>
<li>방법 : es6에서는 spread operator <code>...</code> 를 이용함</li>
</ul>
</li>
<li><p>Shallow Copy : 일반적인 자료형의 경우 사용하는 방법.</p>
<ul>
<li>방법 : 새로운 변수에 할당</li>
</ul>
<pre><code class="language-jsx">let menu = [&#39;icecream&#39;, &#39;burger&#39;, &#39;cake&#39;];
let coffee = &#39;americano&#39;;

&lt;&lt;&lt;&lt; SHALLOW COPY &gt;&gt;&gt;&gt;&gt;
let newMenu = menu
newMenu[0] = &#39;pizza&#39;
setMenu(newMenu)      //배열의 경우 shallow copy가 불가!! 

let newCoffee = coffee;
newCoffee = &#39;latte&#39;;
setCoffee(newCoffee);   //일반적인 자료형의 경우 shallow copy 가능

&lt;&lt;&lt;&lt; DEEP COPY &gt;&gt;&gt;&gt;&gt;
let newMenu = [...menu];
newMenu[0] = &#39;pizza&#39;
setMenu(newMenu)       //배열의 경우 deep copy를 하면 완전히 새로운 복사본이 생김!</code></pre>
</li>
</ul>
</li>
</ol>
<blockquote>
<p><strong>7. Component</strong></p>
</blockquote>
<h4 id="component란">&lt; Component란? &gt;</h4>
<ul>
<li>하나의 UI 단위 : 함수 or 클래스는 html 코드를 리턴 or 랜더</li>
</ul>
<h4 id="component-만드는-방법">&lt; Component 만드는 방법 &gt;</h4>
<ul>
<li>class component</li>
<li>function component</li>
</ul>
<h4 id="component를-만드는-기준">&lt; Component를 만드는 기준 &gt;</h4>
<ol>
<li>코드가 자주 반복되는 경우 → 가독성 향상. 재사용성 증가. 유지보수 용이</li>
<li>값이 자주 변하는 UI의 경우 → 성능 향상</li>
<li>page 단위의 경우 </li>
</ol>
<h4 id="component의-단점">&lt; Component의 단점 &gt;</h4>
<ul>
<li><p>state를 넘겨주는 것이 번거로울 수 있음</p>
<p>  → state의 경우 해당 component (함수/클래스) 안에서만 사용될 수 있으므로 다른 component에서 사용할 경우 다른 과정을 거쳐야함.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정규표현식]]></title>
            <link>https://velog.io/@d-helle/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D</link>
            <guid>https://velog.io/@d-helle/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D</guid>
            <pubDate>Thu, 02 Sep 2021 00:08:32 GMT</pubDate>
            <description><![CDATA[<h3 id="사용방법">사용방법</h3>
<ul>
<li><p>파이썬</p>
<p>  ⇒ <code>import re</code> : re = regular expression라는 라이브러리 사용</p>
<p>  ⇒ <code>re.findall(정규표현식, string)</code> 으로 사용</p>
<pre><code class="language-python">  regex = r&#39;0\d{1,2}[ -]?\d{3,4}[ -]?\d{3,4}&#39;  

  search_target = &#39;&#39;&#39;Luke Skywarker 02-123-4567 luke@daum.net
  다스베이더 070-9999-9999 darth_vader@gmail.com
  princess leia 010 2454 3457 leia@gmail.com&#39;&#39;&#39;

  import re
  result = re.findall(regex, search_target)
  print(&quot;\n&quot;.join(result))   //모든 결과를 개행해서 보여줌</code></pre>
</li>
</ul>
<hr>
<h3 id="syntax">Syntax</h3>
<p><img src="https://images.velog.io/images/d-helle/post/b34fcc84-eca5-4952-86c9-7c4c5fbe07d5/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-02%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%209.02.36.png" alt=""></p>
<p><img src="https://images.velog.io/images/d-helle/post/4a34befe-613a-4ac7-a80d-2eece1f7c7d3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-02%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%209.02.44.png" alt=""></p>
<p><img src="https://images.velog.io/images/d-helle/post/1911181f-d336-41c5-a2ae-bbb481c648ba/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-02%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%209.02.49.png" alt=""></p>
<hr>
<h3 id="practice">Practice</h3>
<pre><code class="language-python">&lt; 문제 1 &gt; 
=&gt; 전화번호 선택하기
010-000-00000
010.000.00000
010 000 00000
02-000-00000

&lt; 풀이 &gt;
step1 : \d\d\d-\d\d\d-\d\d\d\d
step2 : \d{2,3}[,. ]\d{3}[,. ]\d{4}</code></pre>
<pre><code class="language-python">&lt; 문제 2 &gt; 
=&gt; email 선택하기
dream.coder.ellie@gmail.com
hello@daum.net
hello@daum.co.kr

&lt; 풀이 &gt;
내답 : \w+.\w+.\w+@\w+.\w+.\w+
정답 : [a-zA-Z0-9_.+-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9.]+
    -&gt; @앞: 문자,숫자,특수문자들이 한개이상 반복될 수 있음
    -&gt; @뒤: 문자,숫자들이 한개이상 반복될 수 있음 + 특수문자 . + 문자,숫자들이 한개이상 반복될 수 있음</code></pre>
<pre><code class="language-python">&lt; 문제 3 &gt; 
=&gt; 유튜브 주소 뒤에 아이디만 선택하기
https://www.youtu.be/-ZClicWm0zM
https://youtu.be/-ZClicWm0zM
youtu.be/-ZClicWm0zM

&lt; 풀이 &gt;
내답 : (.*youtu.be)?
정답 : (?:https?:\/\/)?(?:www.)?youtu.be\/([a-zA-Z0-9-]{11})
    -&gt; 그룹1 : https?:\/\/  =&gt; http:// or https:// 선택  =&gt; &quot;?:&quot; 그룹을 무시, &quot;?&quot; 0-1번 반복
  -&gt; 그룹2 : www.  =&gt; &quot;?:&quot; 그룹을무시, &quot;?&quot; 0-1번 반복
    -&gt; youtu.be\/  =&gt; youtu.be/ 선택
  -&gt; 그룹3 : 문자,숫자,-로 구성된 11개 조합 

  =&gt; ?: 을 그룹1,2에 넣음으로써 그룹3만 선택될 수 있음!! 매칭된 그룹으로</code></pre>
<hr>
<h3 id="참고링크">참고링크</h3>
<p>프로그래머스 정규표현식 : <a href="https://programmers.co.kr/learn/courses/11">https://programmers.co.kr/learn/courses/11</a>
엘리님 정규표현식 강의 : <a href="https://www.youtube.com/watch?v=t3M6toIflyQ">https://www.youtube.com/watch?v=t3M6toIflyQ</a>
정규표현식 표 : <a href="https://ccambo.blogspot.com/2014/10/regular-expression.html">https://ccambo.blogspot.com/2014/10/regular-expression.html</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[카카오 2021] 신규 아이디 추천]]></title>
            <link>https://velog.io/@d-helle/%EC%B9%B4%EC%B9%B4%EC%98%A4-2021-%EC%8B%A0%EA%B7%9C-%EC%95%84%EC%9D%B4%EB%94%94-%EC%B6%94%EC%B2%9C</link>
            <guid>https://velog.io/@d-helle/%EC%B9%B4%EC%B9%B4%EC%98%A4-2021-%EC%8B%A0%EA%B7%9C-%EC%95%84%EC%9D%B4%EB%94%94-%EC%B6%94%EC%B2%9C</guid>
            <pubDate>Wed, 01 Sep 2021 23:41:22 GMT</pubDate>
            <description><![CDATA[<p><a href="https://programmers.co.kr/learn/courses/30/lessons/72410">코딩테스트 연습 - 신규 아이디 추천</a></p>
<h2 id="내-풀이-1">내 풀이 1.</h2>
<p>⇒ 정규표현식 사용</p>
<pre><code class="language-python">import re

def solution(new_id):
    answer = &#39;&#39;

    #대문자를 소문자로 치환
    new_id = new_id.lower()

    #소문자,숫자,-,_,.제외
    new_id = re.sub(&#39;[^0-9a-z-_.]&#39;,&#39;&#39;,new_id)

    #.가 2번 이상 반복 -&gt; 하나로 치환
    new_id = re.sub(&#39;[.]{2,}&#39;,&#39;.&#39;,new_id)

    #.가 처음이나 끝에 위치하는 경우 제거
    new_id = re.sub(&#39;^\.|\.$&#39;,&#39;&#39;,new_id)

    #빈 문자열인 경우 a를 대입
    new_id = &#39;a&#39; if len(new_id) == 0 else new_id

    #길이가 16이상이면 15뒤 제거
    new_id = new_id[:15] if len(new_id)&gt;=16 else new_id

    #끝에 . 있으면 제거
    new_id = re.sub(&#39;\.$&#39;, &#39;&#39;, new_id)

    #길이2 이하이면 마지막 문자를 길이가 3될때까지 반복
    new_id = new_id+new_id[-1]*(3-len(new_id)) if len(new_id)&lt;=2 else new_id


    return new_id</code></pre>
<p>⇒ 헷갈린 개념 : </p>
<ul>
<li>$를 사용할때는 <code>원하는 문자$</code> 형식으로 써야함</li>
<li>^를 사용할때는 <code>^원하는 문자</code> 형식으로 써야함</li>
</ul>
<p>⇒ 개선사항</p>
<ul>
<li>3번째 조건 : 2번 이상 반복을 한번으로 치환하는 것 → <code>[.]{2,}</code> 를 <code>\.+</code> 로 바꿀 수 있음  (한번으로 치환가능하므로)</li>
<li>6,7번째 조건 합칠 수 있음 → <code>new_id = re.sub(&#39;[.]$&#39;, &#39;&#39;, new_id[:15])</code> 로 한꺼번에 처리가능</li>
</ul>
</br>

<hr>
<h2 id="다른-사람-풀이1">다른 사람 풀이1.</h2>
<pre><code class="language-python">import re

def solution(new_id):
    st = new_id
    st = st.lower()
    st = re.sub(&#39;[^a-z0-9\-_.]&#39;, &#39;&#39;, st)
    st = re.sub(&#39;\.+&#39;, &#39;.&#39;, st)
    st = re.sub(&#39;^[.]|[.]$&#39;, &#39;&#39;, st)
    st = &#39;a&#39; if len(st) == 0 else st[:15]
    st = re.sub(&#39;^[.]|[.]$&#39;, &#39;&#39;, st)
    st = st if len(st) &gt; 2 else st + &quot;&quot;.join([st[-1] for i in range(3-len(st))])
    return st</code></pre>
<h2 id="다른-사람-풀이-2">다른 사람 풀이 2.</h2>
<pre><code class="language-python">from re import sub

def solution(new_id):
    new_id = new_id.lower()
    new_id = sub(&quot;[^a-z0-9-_.]&quot;, &quot;&quot;, new_id)
    new_id = sub(&quot;\.+&quot;, &quot;.&quot;, new_id)
    new_id = sub(&quot;(^\.|\.$)&quot;, &quot;&quot;, new_id)
    new_id = new_id if new_id else &quot;a&quot;
    new_id = sub(&quot;\.$&quot;, &quot;&quot;, new_id[:15])
    new_id = new_id if len(new_id) &gt; 3 else new_id + new_id[-1] * (3 - len(new_id))
    return new_id</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] SQL - Lev.1]]></title>
            <link>https://velog.io/@d-helle/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-Lev.1</link>
            <guid>https://velog.io/@d-helle/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-Lev.1</guid>
            <pubDate>Fri, 14 May 2021 15:47:30 GMT</pubDate>
            <description><![CDATA[<h4 id="문제링크">문제링크</h4>
<p><a href="https://programmers.co.kr/learn/challenges">https://programmers.co.kr/learn/challenges</a></p>
<h2 id="select">SELECT</h2>
<h3 id="-모든-레코드-조회하기-">[ 모든 레코드 조회하기 ]</h3>
<p>Q ) 동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID</code></pre>
<h3 id="-역순-정렬하기-">[ 역순 정렬하기 ]</h3>
<p>Q ) 동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요.</p>
<pre><code class="language-sql">SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC</code></pre>
<h3 id="-아픈-동물-찾기-">[ 아픈 동물 찾기 ]</h3>
<p>Q ) 동물 보호소에 들어온 동물 중 아픈 동물1의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.</p>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = &#39;Sick&#39;
ORDER BY ANIMAL_ID   #생략가능(defult)</code></pre>
<h3 id="-어린-동물-찾기-">[ 어린 동물 찾기 ]</h3>
<p>Q ) 동물 보호소에 들어온 동물 중 젊은 동물1의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.</p>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION &lt;&gt; &#39;Aged&#39;     
ORDER BY ANIMAL_ID   #생략가능(default)</code></pre>
<p>TIP ) &nbsp; not 연산자: &nbsp;&nbsp;<code>&lt;&gt;</code> &nbsp;or &nbsp;<code>!=</code>&nbsp; 사용가능</p>
<h3 id="-동물의-아이디와-이름-">[ 동물의 아이디와 이름 ]</h3>
<p>Q ) 동물 보호소에 들어온 모든 동물의 아이디와 이름을 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요. </p>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID   #생략가능(default)</code></pre>
<h3 id="-여러-기준으로-정렬하기-">[ 여러 기준으로 정렬하기 ]</h3>
<p>Q ) 동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.</p>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC</code></pre>
<p>TIP ) NAME은 ASC가 생략된 것임 ( default = ASC ) </p>
<h3 id="-상위-n개-레코드-">[ 상위 n개 레코드 ]</h3>
<p>Q ) 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1</code></pre>
<hr>
<h2 id="is-null">IS NULL</h2>
<h3 id="-이름이-없는-동물의-아이디-">[ 이름이 없는 동물의 아이디 ]</h3>
<p>Q ) 동물 보호소에 들어온 동물 중, 이름이 없는 채로 들어온 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.</p>
<pre><code class="language-sql">SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME is NULL
ORDER BY ANIMAL_ID    #생략가능</code></pre>
<h3 id="-이름이-있는-동물의-아이디-">[ 이름이 있는 동물의 아이디 ]</h3>
<p>Q ) 동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.</p>
<pre><code class="language-sql">SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME is not NULL
ORDER BY ANIMAL_ID    #생략가능</code></pre>
<hr>
<h2 id="sum-max-min">SUM, MAX, MIN</h2>
<h3 id="-최댓값-구하기-">[ 최댓값 구하기 ]</h3>
<p>Q ) 가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT MAX(DATETIME)
FROM ANIMAL_INS</code></pre>
<p>or...</p>
<pre><code class="language-sql">SELECT DATETIME
FROM ANIMAL_INS
ORDER BY DATETIME DESC  #오름차순 (가장 최근순)
LIMIT 1</code></pre>
]]></description>
        </item>
    </channel>
</rss>