<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jjang_naa.log</title>
        <link>https://velog.io/</link>
        <description>귀여운게 좋아</description>
        <lastBuildDate>Fri, 01 Sep 2023 08:54:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jjang_naa.log</title>
            <url>https://velog.velcdn.com/images/jjang_naa/profile/a925bc96-105f-4b7a-95e6-d26bbd1ff04f/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jjang_naa.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jjang_naa" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Outro]]></title>
            <link>https://velog.io/@jjang_naa/PY4E-2023-Outro</link>
            <guid>https://velog.io/@jjang_naa/PY4E-2023-Outro</guid>
            <pubDate>Fri, 01 Sep 2023 08:54:09 GMT</pubDate>
            <description><![CDATA[<p>🎊🎉🎇 <strong>수료 완료</strong><a href="https://drive.google.com/file/d/1AYhjy8MLc0m074bNKWjOAa-k0mOQdNn0/view?usp=sharing"><span style='color: #aaaaaa'> (수료증)</span></a> 🎇🎉🎊 </p>
<hr>
<p>✨ <strong>소감</strong> ✨</p>
<p><span style='color: #0000'>--</span> 코치님 피드백으로 코드를 조금 더 깔끔하게 작성하는 방법과 if-elif-else 구문의 단이 많으면 좋지 않을 것같다는 의문도 해결되서 좋았다.</p>
<p><span style='color: #0000'>--</span> 그리고 4주차 때 우수미션 팀으로 뽑혔고, 내가 작성한 코드도 라이브 방송 때 소개 되어서 뿌듯한 경험이 되었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PY4E 2023] week_6]]></title>
            <link>https://velog.io/@jjang_naa/PY4E-2023-week6</link>
            <guid>https://velog.io/@jjang_naa/PY4E-2023-week6</guid>
            <pubDate>Thu, 17 Aug 2023 04:53:10 GMT</pubDate>
            <description><![CDATA[<h1 id="6주차-학습-커리큘럼">6주차 학습 커리큘럼</h1>
<p>👉 <strong>딕셔너리와 튜플</strong> ✨</p>
<p>👀 <a href="https://colab.research.google.com/drive/1c1LSBtWsGOQ4wD9MCwAavkd_v43I2iwC?usp=sharing">코드 보러가기 (colab)</a></p>
<hr>
<h3 id="q1-고려-및-조선-두-시대에-모두-사용된-이름의-개수">Q1. 고려 및 조선 두 시대에 모두 사용된 이름의 개수</h3>
<blockquote>
<p><strong>출력조건</strong></p>
</blockquote>
<p><strong>1.</strong> 중복되는 왕 이름 목록
<strong>2.</strong> 중복되는 왕 이름의 수</p>
</br>

<h3 id="q2-실적-평가">Q2. 실적 평가</h3>
<blockquote>
<p><strong>요구사항</strong></p>
</blockquote>
<p><strong>1.</strong> 보너스 대상자는 평균 실적 1등과 2등 입니다.
<strong>2.</strong> 면담 대상자는 평균 실적 5등과 6등 입니다.
<strong>3.</strong> 보너스 대상자의 평균 실적이 5보다 크지 않으면, 보너스 대상자에서 제외됩니다.
<strong>4.</strong> 면담 대상자의 평균 실적이 3보다 크면, 면담 대상자에서 제외됩니다.</p>
</br>

<h3 id="q3-수익률-계산">Q3. 수익률 계산</h3>
</br>

<h3 id="q4-vip-회원-구분">Q4. VIP 회원 구분</h3>
<blockquote>
<p><strong>VIP 회원 조건</strong></p>
</blockquote>
<p><strong>1.</strong> 구매 횟수가 8회 이상인 회원
<strong>2.</strong> 쿠폰 발행을 위한 전화번호가 있어야 함 (전화번호가 없을 경우, &quot;000-0000-0000&quot;으로 출력할 것)</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI_PY4ML] Pythonic Code]]></title>
            <link>https://velog.io/@jjang_naa/Artifical-Intelligence-PY4ML-Pythonic-Code</link>
            <guid>https://velog.io/@jjang_naa/Artifical-Intelligence-PY4ML-Pythonic-Code</guid>
            <pubDate>Tue, 15 Aug 2023 03:41:40 GMT</pubDate>
            <description><![CDATA[<h1 id="1-overview">1. Overview</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>
- Pythonic Code는 간단하게, 다른 사람의 코드를 잘 이해하기 위해서 파이썬 특유의 문법을 활용하여 효율적으로 코드를 표현하는 기법을 말한다.
- Pythonic Code 를 작성하는 방법과 Matrices 와 Vector 의 연산을 Pythonic Code 로 구현하는 방법을 배운다.</li>
</ul>
</blockquote>
<h2 id="1-여러-단어를-하나로-붙일-때">1) 여러 단어를 하나로 붙일 때</h2>
<pre><code class="language-python">colors = [&#39;red&#39;, &#39;blue&#39;, &#39;green&#39;, &#39;yellow&#39;]
result = &#39;&#39;
for s in colors:
    result += s</code></pre>
<pre><code class="language-Python">colors = [&#39;red&#39;, &#39;blue&#39;, &#39;green&#39;, &#39;yellow&#39;]
result = &#39;&#39;.join(colors)</code></pre>
<h2 id="2-pythonic-code">2) Pythonic Code</h2>
<ul>
<li>파이썬 스타일의 코딩 기법</li>
<li><strong>파이썬 특유의 문법</strong>을 활용하여 효율적으로 코드를 표현함</li>
<li>고급 코드를 작성 할 수록 더 많이 필요해짐</li>
</ul>
<blockquote>
<p>- Split &amp; Join</br>- List Comprehension</br>- Enumerate &amp; Zip</p>
</blockquote>
<h2 id="3-why-python-code">3) Why Python Code?</h2>
<ul>
<li><p><strong>남 코드에 대한 이해도</strong>
<span style='color:#0000'>--</span> : 많은 개발자들이 python 스타일로 코딩함</p>
</li>
<li><p><strong>효율</strong>
<span style='color:#0000'>--</span> : 단순 for loop append 보다 list가 조금 더 빠르고, 익숙해지면 코드도 짧아짐
<span style='color:#0000'>--</span><span style='color: #bbbbbb'>_ ↪ numpy가 훨씬 빠름_</span></p>
</li>
</ul>
</br>

<hr>
<h1 id="2-split--join">2. Split &amp; Join</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: Split &amp; Join 을 사용하여 String Type 의 값을 List 형태로 변환하고, List Type 의 값을 String Type 의 값으로 변환하는 Python Code 작성법을 알아본다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>
- Split</br>- Join</br>- String</br>- List</br>- Unpacking</li>
</ul>
<h2 id="1-split-함수">1) Split 함수</h2>
<p><span style='color:#0000'>--</span>String Type의 값을 나눠서 List 형태로 변환
<span style='color:#0000'>--</span><span style='color: #bbbbbb'>_ ↪ 많이 쓰이는 경우: 뉴스와 같은 데이터에 특정 단어가 몇번 등장하는지 등_</span></p>
<pre><code class="language-python">items = &#39;zero one two three&#39;.split()
    ## [&#39;zero&#39;, &#39;one&#39;, &#39;two&#39;, &#39;three&#39;]

example = &#39;python,query,javascript&#39;
example.split(&#39;,&#39;)
    ## [&#39;python&#39;, &#39;query&#39;, &#39;javascript&#39;]

a, b, c = example.split(&#39;,&#39;)
    ## a is &#39;python&#39;, b is &#39;query&#39;, c is &#39;javascript&#39; : Unpacking

example = &#39;cs50.gachon.edu&#39;
subdomain, domain, tld = example.split(&#39;.&#39;)
    ## subdomain is &#39;cs50&#39;, domain is &#39;gachon&#39;, tld is &#39;edu&#39;</code></pre>
<h2 id="2-join-함수">2) Join 함수</h2>
<p><span style='color:#0000'>--</span> String List를 합쳐 하나의 String 으로 반환할 때 사용</p>
<pre><code class="language-python">colors = [&#39;red&#39;, &#39;blue&#39;, &#39;green&#39;, &#39;yellow&#39;]
&#39;&#39;.join(colors)
    ## &#39;redbluegreenyellow&#39;
&#39; &#39;.join(colors)
    ## &#39;red blue green yellow&#39;
&#39;, &#39;.join(colors)
    ## &#39;red, blue, green, yellow&#39;
&#39;-&#39;.join(colors)
    ## &#39;red-blue-green-yellow&#39;</code></pre>
</br>

<hr>
<h1 id="3-list-comprehension">3. List Comprehension</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 파이썬에서 가장 많이 사용되는 기법 중 하나인 List Comprehension 을 사용하여 Pythonic Code 를 작성하는 방법을 알아본다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>
- List Comprehension</br>- Nested For loop</li>
</ul>
<h2 id="1-정의">1) 정의</h2>
<ul>
<li><p>기존 List 사용하여 간단히 다른 List를 만드는 기법</p>
</li>
<li><p>포괄적인 List, 포함되는 리스트라는 의미로 사용됨</p>
</li>
<li><p>파이썬에서 가장 많이 사용되는 기법 중 하나</p>
</li>
<li><p>일반적으로 for + append 보다 속도가 빠름</p>
</li>
</ul>
<h2 id="2-예시-1">2) 예시 (1)</h2>
<pre><code class="language-python">result = []
for i in range(10):
    result.append(i)

    ## [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</code></pre>
<pre><code class="language-python">[i for i in range(10)]    # list comprehensions
    ## [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</code></pre>
<pre><code class="language-python">[i for i in range(10) if i % 2 == 0]    # list comprehensions &amp; filter
    ## [0, 2, 4, 6, 8]</code></pre>
<h2 id="3-예시-2">3) 예시 (2)</h2>
<pre><code class="language-python">word_1 = &quot;Hello&quot;
word_2 = &quot;World&quot;

[i+j for i in word_1 for j in word_2]    # Nested For loop

## [&#39;HW&#39;, &#39;Ho&#39;, &#39;Hr&#39;, &#39;Hl&#39;, &#39;Hd&#39;, &#39;eW&#39;, &#39;eo&#39;, ...]</code></pre>
<h2 id="4-예시-3">4) 예시 (3)</h2>
<pre><code class="language-python">case_1 = [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;]
case_2 = [&quot;D&quot;, &quot;E&quot;, &quot;F&quot;]

[i+j for i in case_1 for j in case_2]

result = [i+j for i in case_1 for j in case_2 if not(i==j)]

result.sort()</code></pre>
<h2 id="5-예시-4">5) 예시 (4)</h2>
<pre><code class="language-python">words = &#39;The quick brown fox jumps over the lazy dog&#39;.split()

stuff = [[w.upper(), w.lower(), len(w)] for w in words]
# list의 값 elements 들을 대문자, 소문자, 길이로 변환하여 two dimensional list로 변환

for i in stuff:
    print(i)</code></pre>
<h2 id="6-two-dimensional-vs-one-dimentional">6) Two dimensional vs One dimentional</h2>
<pre><code class="language-python">case_1 = [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;]
case_2 = [&quot;D&quot;, &quot;E&quot;, &quot;F&quot;]

[a+b for a in case_1 for b in case_2]
# [&#39;AD&#39;, &#39;AE&#39;, &#39;AF&#39;, &#39;BD&#39;, &#39;BE&#39;, &#39;BF&#39;, &#39;CD&#39;, &#39;CE&#39;, &#39;CF&#39;]

[[a+b for a in case_1] for b in case_2]        # for b in case_2 부분이 먼저 고정 됨
# [[&#39;AD&#39;, &#39;BD&#39;, &#39;CD&#39;], [&#39;BD&#39;, &#39;BE&#39;, &#39;BF&#39;], [&#39;CD&#39;, &#39;CE&#39;, &#39;CF&#39;]]</code></pre>
</br>

<hr>
<h1 id="4-enumerate--zip">4. Enumerate &amp; Zip</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 리스트의 값을 추출할 때 함께 인덱스를 추출할 수 있는 방법으로 이용되는 enumerate 와 두 개 이상의 list 값을 병렬적으로 추출할 수 있는 zip 모듈을 사용하여 pythonic code 를 작성하는 방법을 알아본다</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>
- Zip</br>- Enumerate</li>
</ul>
<h2 id="1-enumerate">1) Enumerate</h2>
<p><span style='color:#0000'>--</span> List 의 element 를 추출할 때 번호를 붙여서 추출</p>
<pre><code class="language-python">for i, v in enumerate([&#39;tic&#39;, &#39;tac&#39;, &#39;toc&#39;]):
    print(i, v)
## 0 tic / 1 tac / 2 toc

mylist = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]
list(enumerate(mylist))        # list의 index 와 value 를 unpacking 하여 list로 저장
## [(0, &#39;a&#39;), (1, &#39;b&#39;), (2, &#39;c&#39;), (3, &#39;d&#39;)]

{i:j for i, j in enumerate(&quot;Gachon University in an academic institute located in South Kores.&quot;.split())}
# 문장을 list로 만들고 그 list의 index 와 value 를 unpacking 하여 dict 로 저장</code></pre>
<h2 id="2-zip">2) Zip</h2>
<p><span style='color:#0000'>--</span> 두 개의 list 의 값을 병렬적으로 추출함</span></p>
<pre><code class="language-python">alist = [&#39;a1&#39;, &#39;a2&#39;, &#39;a3&#39;]
blist = [&#39;b1&#39;, &#39;b2&#39;, &#39;b3&#39;]

for a, b in zip(alist, blist):    # 병렬적으로 값을 추출
    print(a, b)

## a1 b1 / a2 b2 / a3 b3

a, b, c = zip((1, 2, 3), (10, 20, 30), (100, 200, 300))    # 각 tuple 의 같은 index 끼리 묶음
## ((1, 10, 100), (2, 20, 200), (3, 30, 300))

[sum(x) for x in zip((1, 2, 3), (10, 20, 30), (100, 200, 300))]    # list comprehension 이랑 같이 사용해보기
## [111, 222, 333]</code></pre>
<h2 id="3-enumerate--zip">3) Enumerate &amp; Zip</h2>
<pre><code class="language-python">alist = [&#39;a1&#39;, &#39;a2&#39;, &#39;a3&#39;]
blist = [&#39;b1&#39;, &#39;b2&#39;, &#39;b3&#39;]

for i, (a, b) in enumerate(zip(alist, blist)):
    print(i, a, b)    # index alist[index] blist[index]

## 0 a1 b1 / 1 a2 b2 / 2 a3 b3</code></pre>
</br>

<hr>
<h1 id="5-lambda--mapreduce">5. Lambda &amp; MapReduce</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 함수처럼 사용가능한 익명함수인 Lambda, Sequence 자로형의 데이터에서 함수를 적용하는 방법인 Map Function 과 Reduce Function 에 대해서 여러 예제 코드를 이용해 실습하면서 Pythonic Code 를 작성하는 방법에 대해 공부합니다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>
- Lambda</br>- Map Function</br>- Reduce Function</li>
</ul>
<h2 id="1-lambda">1) Lambda</h2>
<ul>
<li>함수 이름 없이 함수처럼 쓸 수 있는 익명함수로 수학의 람다 대수에서 유래함</li>
<li>map 함수와 함께 쓰면 더 효율적임</li>
</ul>
<table>
<thead>
<tr>
<th>General function</th>
<th>Lambda function</th>
</tr>
</thead>
<tbody><tr>
<td><code>def f(x,y) : return x+y</code></td>
<td><code>f = lambda x, y: x + y</code></td>
</tr>
</tbody></table>
<pre><code class="language-python">f = lambda x, y: x+ y
print(f(1, 4))    # 5

f = lambda x: x ** 2
print(f(3))    # 9

f = lambda x: x / 2
print(f(3))    # 1.5

print((lambda x: x + 1)(5))    # 6</code></pre>
<h2 id="2-map">2) Map</h2>
<ul>
<li>Sequence 자료형 각 elemnet 에 동일한 function 을 적용함
↪ <code>map(function_name, list_data)</code></li>
</ul>
<pre><code class="language-python">ex = [1, 2, 3, 4, 5]
f = lambda x: x ** 2
print(list(map(f, ex)))    ## [1, 4, 9, 16, 25]

f = lambda x, y: x+ y
print(list(map(f, ex, ex)))    ## [2, 4, 6, 8, 10]

list(map(
    lambda x: x ** 2 if x % 2 == 0 else x,
    ex))
# lambda 에 filter 가능, else 는 필수로 넣어야 함
## [1, 4, 3, 16, 5]</code></pre>
<h2 id="3-reduce">3) Reduce</h2>
<p><span style='color:#0000'>--</span> map function 과 달리 list 에 똑같은 함수를 적용해서 통합 <span style='color:#bbbbbb'><em>(map과 같이 쓰는 경우가 많음, pandas 사용시 map과 함께 유용하게 쓰임)</em></span></p>
<pre><code class="language-python">from functools import reduce
print(reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]))    ## 15

## x = 1, y = 2
## x = 3, y = 3
## x = 6, y = 4
## x = 10, y = 5</code></pre>
<pre><code class="language-python">def factorial(n):
    return reduce(
        lambda x, y: x*y, range(1, n+1))

factorial(5)    ## 120</code></pre>
<h2 id="⨁-summary">⨁ Summary</h2>
<ul>
<li>Lambda, map, reduce 는 간단한 코드로 다양한 기능을 제공</li>
<li>그러나 코드의 직관성이 떨어져서 lambda 나 reduce 는 python3 에서 사용을 권장하지 않음</li>
<li>Legacy library 나 다양한 머신러닝 코드에서 여전히 사용중</li>
</ul>
</br>

<hr>
<h1 id="6-asterisk">6. Asterisk</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 단순 곱셈, 제곱연산, 가변인자 활용 등 여러 부분에서 다양하게 사용되는 Asterisk(*) 의 사용법을 여러 예제 코드를 직접 실습하며 공부한다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: Asterisk</li>
</ul>
<h2 id="1-asterisk">1) Asterisk</h2>
<p><span style='color:#0000'>--</span> 흔이 알고 있는 * 를 의미하며, &#39;단순곱셈&#39; &#39;제곱연산&#39; &#39;가변인자활용&#39; 등 다양하게 사용됨</p>
<table>
<thead>
<tr>
<th>*args</th>
<th>**kargs</th>
</tr>
</thead>
<tbody><tr>
<td><code>def asterisk_test(a, *args)</code> </br> : 함수 만들 때 몇 개의 인자를 받을지 정할 수 없을 때 여러 개 값을 한번에 받을 수 있음</td>
<td><code>def asterisk_test(a, **kargs)</code> </br>: 키워드 인자, dict type 이며,  pandas matplotlib 등에 사용됨</td>
</tr>
</tbody></table>
<pre><code class="language-python">def asterisk_test(a, *args):
    print(a, args)
    print(type(args))

asterisk_test(1, 2, 3, 4, 5, 6)
##    1 (2, 3, 4, 5, 6)
## &lt;class &#39;tuple&#39;&gt;</code></pre>
<pre><code class="language-python">def asterisk_test(a, **kargs):
    print(a, kargs)
    print(type(kargs))

asterisk_test(1, b=2, c=3, d=4, e=5, f=6)
## 1 {&#39;b&#39;: 2, &#39;c&#39;: 3, &#39;d&#39;: 4, &#39;e&#39;: 5, &#39;f&#39;: 6}
## &lt;class &#39;dict&#39;&gt;</code></pre>
<h2 id="2-asterisk---unpacking-a-container">2) Asterisk - unpacking a container</h2>
<ul>
<li>tuple, dict 등 자료형에 들어가 있는 값을 unpacking</li>
<li>함수의 입력값, zip 등에 유용하게 사용 가능<pre><code class="language-python">def asterisk_test(a, *args):
  print(a, args)
  print(type(args))
asterisk_test(1, *(2, 3, 4, 5, 6))
## 1 (2, 3, 4, 5, 6)    /    &lt;class &#39;tuple&#39;&gt;
</code></pre>
</li>
</ul>
<p>def asterisk_test(a, args):
    print(a, *args)
    print(type(args))
asterisk_test(1, (2, 3, 4, 5, 6))</p>
<h2 id="1-2-3-4-5-6--------class-tuple">1 2 3 4 5 6    /    &lt;class &#39;tuple&#39;&gt;</h2>
<pre><code>```python
def asterisk_test(a, *args):
    print(a, args[0])
    print(type(args))
asterisk_test(1, (2, 3, 4, 5, 6))
## 1 (2, 3, 4, 5, 6)    /    &lt;class &#39;tuple&#39;&gt;

def asterisk_test(a, *args):
    print(a, args)
    print(type(args))
asterisk_test(1, (2, 3, 4, 5, 6))
## 1 ((2, 3, 4, 5, 6), )    /    &lt;class &#39;tuple&#39;&gt;</code></pre><ul>
<li>예시<pre><code class="language-python">a, b, c = ([1, 2], [3, 4], [5, 6])
## a is [1, 2] / b is [3, 4] / c is [5, 6]
</code></pre>
</li>
</ul>
<p>data = ([1, 2], [3, 4], [5, 6])
print(*data)</p>
<h2 id="1-2-3-4-5-6">[1, 2] [3, 4] [5, 6]</h2>
<p>def asterisk_test(a, b, c, d):
    print(a, b, c, d)
data = {&quot;b&quot;: 1, &quot;c&quot;: 2, &quot;d&quot;: 3}
asterisk_test(10, **data)</p>
<h2 id="asterisk_test10-data">asterisk_test(10, **data)</h2>
<p>for data in zip(*([1, 2], [3, 4], [5, 6])):        ## [1, 2] [3, 4] [5, 6]
    print(data)</p>
<h2 id="1-3-5">(1, 3, 5)</h2>
<h2 id="2-4-6">(2, 4, 6)</h2>
<pre><code>

&lt;/br&gt;

---


# 7. Data Structure - Collections
&gt; - **학습목표**: tuple, dict 에 대한 확장 데이터 구조를 제공하는 Collections 안에 포함된 모듈을 이용하여 Data Structure 의 기본 개념을 이해하고 사용하는 방법을 알아본다.
- **핵심단어**
\- Collections&lt;/br&gt;\- Data Structure&lt;/br&gt;\- deque&lt;/br&gt;\- Counter&lt;/br&gt;\- orderdDict&lt;/br&gt;\- defaultdict&lt;/br&gt;\- namedtuple

## 1) Collections
- List, Tuple Dict 에 대한 Python Built-in 확장 자료 구조 (모듈)
- 편의성, 실행 효율 등을 사용자에게 제공함
- 아래의 모듈이 존재함
```python
from collections import deque
from collections import Counter
from collections import OrderedDict
from collections import defaultdict
from collections import namedtuple</code></pre><h2 id="2-deque">2) deque</h2>
<ul>
<li>Stack 과 Queue 를 지원하는 모듈</li>
<li>List 에 비해 효율적인 자료 저장 방식을 지원함<pre><code class="language-python">from collections import deque
</code></pre>
</li>
</ul>
<p>deque_list = deque()
for i in range(5):
    deque_list.append(i)
print(deque_list)    ## [0, 1, 2, 3, 4]</p>
<p>deque_list.appendleft(10)
print(deque_list)    ## [10, 0, 1, 2, 3, 4]</p>
<pre><code>
- rotate, reverse 등 Linked List 의 특성을 지원함
- 기존 list 형태의 함수를 모두 지원함
```python
deque_list.rotate(2); print(deque_list)

deque_list.rotate(2); print(deque_list)

deque_list.extend([5, 6, 7]); print(deque_list)

deque_list.extendleft([5, 6, 7]); print(deque_list)

print(deque_list)
print(deque(reversed(deque_list)))</code></pre><ul>
<li>deque 는 기본 list 보다 효율적인 자료구조를 제공</li>
<li>효율적 메모리 구조로 처리 속도 향상<pre><code class="language-python">### deque
from collections import deque
import time
</code></pre>
</li>
</ul>
<p>start_time = time.clock()
deque_list = deque()</p>
<h1 id="stack">Stack</h1>
<p>for i in range(10000):
    for i in range(10000):
        deque_list.append(i)
        deque_list.pop()
print(time.clock() - start_time, &#39;seconds&#39;)</p>
<h3 id="general-list">general list</h3>
<p>import time
start_time = time.clock()
just_list = []
for i in range(10000):
    for i in range(10000):
        just_list.append(i)
        just_list.pop()
print(time.clock() - start_time, &#39;seconds&#39;)</p>
<pre><code>
## 3) OrderedDict

### (1) OrderdDict
- Dict 와 달리, 데이터를 입력한 순서대로 dict 를 반환함
```python
d = {}
d[&#39;x&#39;] = 100; d[&#39;y&#39;] = 200; d[&#39;z&#39;] = 300; d[&#39;l&#39;] = 500

for k, v in d.items():
    print(k, v)

## l 500  /  x 100  /  y 200  /  z 300</code></pre><pre><code class="language-python">from collections import OrderedDict

d = OrderedDict()
d[&#39;x&#39;] = 100; d[&#39;y&#39;] = 200; d[&#39;z&#39;] = 300; d[&#39;l&#39;] = 500

for k, v in d.items():
    print(k, v)

## x 100  /  y 200  /  z 300  /  l 500</code></pre>
<ul>
<li>Dict type 의 값을, value 또는 key 값으로 정렬할 때 사용 가능<pre><code class="language-python">for k, v in OrderedDict(sorted(d.items(), key=lambda t: t[0])).items():
  print(k,v)
</code></pre>
</li>
</ul>
<h2 id="l-500----x-100----y-200----z-300">l 500  /  x 100  /  y 200  /  z 300</h2>
<pre><code>
```python
for k, v in OrderedDict(sorted(d.items(), key=lambda t: t[1])).items():
    print(k,v)

## x 100  /  y 200  /  z 300  /  l 500</code></pre><h3 id="2-defaultdict">(2) defaultdict</h3>
<p><span style='color: #0000'>--</span> Dict type 의 값에 기본 값을 지정, 신규 값 생성 시 사용하는 방법</p>
<pre><code class="language-python">d = dict()
print(d[&quot;first&quot;])    ## KeyError</code></pre>
<pre><code class="language-python">from collections import defaultdict
d = defaultdict(object)    # Default dictionary 를 생성
d = defaultdict(lambda: 0)    # Default 값을 0으로 설정함
print(d[&quot;first&quot;])    ## 0</code></pre>
<p>예시</p>
<pre><code class="language-python">from collections import OrderdDict
from collections import defaultdict

word_count = defaultdict(object)    # Default dictionary 를 생성
word_count = defaultdict(lambda: 0)    # Default 값을 0으로 설정함

for word in text:
    word_count[word] += 1
for i, v in OrderedDict(sorted(word_count.items(), key=lambda t: t[1],
                                reverse=Treu)).items():
    print(i, v)

## a 12  /  to 10  /  and 9  /  the 0  /  press 8  /  release 8   /  that 7</code></pre>
<h2 id="4-counter">4) Counter</h2>
<h3 id="1-counter">(1) counter</h3>
<p>-Sequence type 의 data element 들의 갯수를 dict 형태로 반환</p>
<pre><code class="language-python">from collections import Counter

c = Counter()    # a new, empty counter
c = Counter(&#39;gallahad&#39;)    # a new counter from an iterable

print(c)    ## Counter({&#39;a&#39;: 3, &#39;l&#39;: 2, &#39;g&#39;: 1, &#39;d&#39;: 1, &#39;h&#39;: 1})</code></pre>
<ul>
<li>Dict type, keyword parameter 등도 모두 처리 가능<pre><code class="language-python">c = Counter({&#39;red&#39;: 4, &#39;blue&#39;: 2})    # a new counter from a mapping
</code></pre>
</li>
</ul>
<p>print(c)    # Counter({&#39;red&#39;: 4, &#39;blue&#39;: 2})
print(list(c.elements()))    # [&#39;blue&#39;, blue&#39;, &#39;red&#39;, &#39;red&#39;, &#39;red&#39;, &#39;red&#39;]</p>
<p>c = Counter({cats=4, dogs=8})    # a new counter from keyword args</p>
<p>print(c)    # Counter({&#39;dogs&#39;: 8, &#39;cats&#39;: 4})
print(list(c.elements()))    # [&#39;dogs&#39;, &#39;dogs&#39;, &#39;dogs&#39;, &#39;dogs&#39;, &#39;dogs&#39;, &#39;dogs&#39;,&#39;dogs&#39;,&#39;dogs&#39;, &#39;cats&#39;, &#39;cats&#39;, &#39;cats&#39;, &#39;cats&#39;]</p>
<pre><code>
### (2) namedtuple
&lt;span style=&#39;color: #0000&#39;&gt;--&lt;/span&gt; Tuple 형태로 Data 구조체를 저장하는 방법으로 저장되는 data 의 variable 을 사전에 지정해서 저장함
&lt;span style=&#39;color: #bbbbbb&#39;&gt;_↪ C의 struct 와 비슷_&lt;/span&gt;

```python
from collections import namedtuple
Point = namedtuple(&#39;Point&#39;, [&#39;x&#39;, &#39;y&#39;])
p = Point(11, y=22)
print(p[0] + p[1])

x, y = p
print(x, y)
print(p.x + p.y)
print(Point(x=11, y=22))</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[AI_PY4ML] Intro]]></title>
            <link>https://velog.io/@jjang_naa/Artifical-Intelligence-PY4ML-intro</link>
            <guid>https://velog.io/@jjang_naa/Artifical-Intelligence-PY4ML-intro</guid>
            <pubDate>Tue, 15 Aug 2023 03:36:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jjang_naa/post/a7ee97de-45c9-44c1-a274-9fb30fa1a62b/image.png" alt="python for ML"></p>
<blockquote>
<p><strong>학습 커리큘럼</strong> 📝
01. Pythonic Code
02. Python for Machine Learning (ML)
03. Data Handling
04. 선형 회귀 (Linear Regreesion)
05. 로지스틱 회귀 (Logistic Regreesion)
06. Classification</p>
</blockquote>
<p><a href="https://www.boostcourse.org/ai222?type=stay">수강신청 하러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PY4E 2023] week_5]]></title>
            <link>https://velog.io/@jjang_naa/PY4E-2023-week5</link>
            <guid>https://velog.io/@jjang_naa/PY4E-2023-week5</guid>
            <pubDate>Sun, 13 Aug 2023 09:37:50 GMT</pubDate>
            <description><![CDATA[<h1 id="5주차-학습-커리큘럼">5주차 학습 커리큘럼</h1>
<p>👉 <strong>리스트</strong> ✨</p>
<p>👀 <a href="https://colab.research.google.com/drive/1STE2tteEugFDb4BJu2WI311l8pGOt7qx?usp=sharing">코드 보러가기 (colab)</a></p>
<hr>
<h3 id="q1-베스킨라빈스31-게임">Q1. 베스킨라빈스31 게임</h3>
</br>

<h3 id="q2-답안-채점">Q2. 답안 채점</h3>
</br>

<h3 id="q3-up--down-게임">Q3. Up &amp; Down 게임</h3>
</br>

<h3 id="q4--d-day-계산기-프로그램">Q4.  D-Day 계산기 프로그램</h3>
<blockquote>
<p><strong>조건</strong></p>
</blockquote>
<p><strong>1.</strong> 입력한 날짜를 하루로 포함
<strong>2.</strong>  연도는 구분하지 않으며, 윤년을 고려하지 않고 2월은 항상 28일로 가정</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI_CS] Outro]]></title>
            <link>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Outro</link>
            <guid>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Outro</guid>
            <pubDate>Fri, 11 Aug 2023 06:50:16 GMT</pubDate>
            <description><![CDATA[<p>🎊🎉🎇 <strong>수료 완료</strong><a href="https://drive.google.com/file/d/1ieeHE7J6lye1GmhqzxIIccMfnrpXhllJ/view?usp=sharing"><span style='color: #aaaaaa'> (수료증)</span></a> 🎇🎉🎊 </p>
<hr>
<p>✨ <strong>소감</strong> ✨</p>
<p><span style='color: #0000'>--</span> Java를 다시 배우는 기분이었다. Python 만 실컷하다가 오랜만에 각잡힌 언어 배우니 머릿속이 좀 복잡했지만! 그래도 Java 언어를 배운 적이 있어 많이 어렵지 않았다.</p>
<p><span style='color: #0000'>--</span> 그리고 <strong>do-while</strong>, <strong>string</strong> 자료형 존재X, <strong>pointer</strong> 등등 C 에서 몇몇 새로운 걸 배웠다. 특히 string 자료형은 없다는 것과 pointer 는 가장 흥미로웠다! python 처음 배울 때 주소 가르키는 거나 메모리 누수 같은 거에 대한 건 조금 알고 있었는데 pointer 를 배우니 정말 반가웠다.</p>
<p><span style='color: #0000'>--</span> 추가로 개인적으로 컴파일러, bit byte 등, 메모리 구조 같은 컴퓨터의 기초 지식..! 을 배울 수 있어서 정말 만족스러웠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI_CS] Data Structures]]></title>
            <link>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Data-Structures</link>
            <guid>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Data-Structures</guid>
            <pubDate>Fri, 11 Aug 2023 06:41:37 GMT</pubDate>
            <description><![CDATA[<h1 id="1-malloc-과-포인터-복습">1. malloc 과 포인터 복습</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 포인터의 개념과 malloc 함수의 용법을 잘 이해할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 포인터, malloc</li>
</ul>
<p>- 포인터를 선언한 후 malloc 사용하여 메모리를 할당한 후 값을 넣을 수 있다.</p>
<p>- 메모리를 할당하지 않고 값을 넣으려고 한다면 error 발생
</br></p>
<hr>
<h1 id="2-배열의-크기-조정하기">2. 배열의 크기 조정하기</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 배열의 크기는 조정하는 코드를 작성할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: malloc, realloc</li>
</ul>
<p>- 메모리 주변에 다른 것들이 있을 경우 배열에 새 값을 추가할 수 없다.</p>
<p>- 메모리를 할당할 때마다 NULL이 반환되는지 확인하는 것이 좋은 방법이다.</p>
<p>- realloc(재할당할 것, 배열크기, sizeof(자료형))
<span style='color:#0000'>--</span> <span style='color:#aaaaaa'><em>ex) realloc(<u>list</u>, 4, sizeof(int));</em></span>
<span style='color:#0000'>--------------</span> <span style='color:#aaaaaa'><em>↪ int *list = malloc(3 * sizeof(int));</em></span></p>
</br>

<hr>
<h1 id="3-연결리스트-도입">3. 연결리스트 도입</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 연결리스트의 정의를 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 연결리스트</li>
</ul>
<p>- <strong>.</strong> <span style='color:#cccccc'>(dot)</span> : 구조체의 속성 값을 가져올 때 <span style='color:#0000'>--</span> <span style='color:#aaaaaa'><em>ex) 이름.<del>~</del></em></span></p>
<p>- * : 역참조 연산자 <span style='color:#cccccc'>(using pointer)</span></p>
<p>- 메모리 덩어리 여러개를 포함한 데이터 구조를 연결리스트라고 한다.</p>
<blockquote>
<p>ex) 하나의 메모리 덩어리만 사용하지 않고 두 배의 메모리를 주어 더 유연하게 만들 수 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/e34f2010-7b1a-413c-83d7-2da7c649ae9d/image.png" alt="memory pointer"></p>
<blockquote>
</blockquote>
<p><span style='color:#bbbbbb'> <em>※ 컴퓨터 공학에서 node 는 직사각형으로 나타낼 수 있는 메모리 덩어리를 의미함</em></span></p>
<blockquote>
<hr>
</blockquote>
<ul>
<li><strong>ex_wrong</strong>
: node 정의되기 전이므로 사용 X<pre><code>typedef struct{
  int number;
  node *next;
}node;    // node가 정의 되는 때</code></pre><blockquote>
</blockquote>
</li>
<li><strong>ex_right</strong>
: <u>struct node</u> : 구조체의 정식 명칭<pre><code class="language-C">typedef struct node{
  int number;
  struct node *next;
}node;    // node가 정의 되는 때, 구조체의 별칭</code></pre>
<blockquote>
</blockquote>
</li>
</ul>
</br>

<hr>
<h1 id="4-연결리스트--코딩">4. 연결리스트 : 코딩</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 연결리스트를 구현하고 사용할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 연결리스트</li>
</ul>
<pre><code class="language-C">node *n = malloc(sizeof(node));</code></pre>
<p><span style='color:#0000'>-</span> <span style='color:#555555'><em>↪ 3번에서 정의한 node 크기만큼 메모리를 할당 받는다.</em></span>
<span style='color:#0000'>-</span> <span style='color:#555555'><em>↪ pointer <strong>n</strong> 은 node를 가르키는 주소를 담고 있다.</em></span>
</br></p>
<p><span style='color:#0000'>-----------------------------------</span><span style='color:#eeeeee'>———————————————</span></p>
<pre><code class="language-C">(*n).number = 2;</code></pre>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/834a0ec3-aad1-468f-a88a-caebc9db5179/image.png" alt=""></p>
<p><span style='color:#0000'>-</span> <span style='color:#555555'><em>↪ n 은 pointer 이므로 n.number 는 잘못된 방법</em></span>
<span style='color:#0000'>-</span> <span style='color:#555555'><em>↪ 화살표를 사용한 다른 방법 O</em></span>
<span style='color:#0000'>-----</span> <span style='color:#555555'><em>ex) n → number = 2;</em></span>
<span style='color:#0000'>-----</span> <span style='color:#555555'><em>ex)  n → next = NULL;</em></span>
</br></p>
<p><span style='color:#0000'>-----------------------------------</span><span style='color:#eeeeee'>———————————————</span></p>
<pre><code class="language-C">if(n != NULL)</code></pre>
<p><span style='color:#0000'>-</span> <span style='color:#555555'><em>↪ n 이 NULL 인지 확인 <span style='color:#bbbbbb'>(= 끝인지 확인)</span></em></span></p>
<p><span style='color:#0000'>-----------------------------------</span><span style='color:#eeeeee'>———————————————</span></p>
<pre><code class="language-C">node *tmp = list;
while (tmp -&gt; next != NULL){
    tmp = tmp -&gt; next
}
tmp -&gt; next = n;</code></pre>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/ffdb1bff-7afd-48fb-a1ce-4b2ffbb27f2e/image.png" alt="연결리스트(1)"></p>
<p><span style='color:#0000'>-----------------------------------</span><span style='color:#eeeeee'>———————————————</span></p>
<blockquote>
<p><strong>1을 앞에 끼우고 싶을 때</strong></p>
<ul>
<li><strong>wrong</strong>
새로운 node를 할당하는 코드를 사용한다.
<span style='color:#0000'>-</span> <span style='color:#aaaaaa'><em>↪ ❗ 메모리 누수 발생</em></span>
<img src="https://velog.velcdn.com/images/jjang_naa/post/1ca5f045-d5d9-422e-a38f-68ae540a7403/image.png" alt="연결리스트(2)"></li>
</ul>
<ul>
<li><strong>right</strong>
1이 2를 가르키게 한 후 list가 1을 가르키게 한다.</li>
</ul>
</blockquote>
<pre><code class="language-C">n -&gt; next = list;
list = n;</code></pre>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/7f91889b-dab8-4833-aeae-4384c9327273/image.png" alt="연결리스트(3)"></p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/15bbd62e-dd03-4cfd-a55a-76f4805d1880/image.png" alt="연결리스트(4)"></p>
<p><span style='color:#0000'>-----------------------------------</span><span style='color:#eeeeee'>———————————————</span></p>
<blockquote>
<p><strong>순서에 맞춰 중간에 값을 넣고 싶을 때</strong></p>
</blockquote>
<p><span style='color:#0000'>--</span>반복문 등으로 대소 비교하고 포인터를 업데이트 하는 과정이 필요하다.</p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/25816c79-b1e0-4a19-be21-f8917641fdb6/image.png" alt="연결리스트(5)"></p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/2c9317bb-cc04-42d7-b317-b1baadf2fc54/image.png" alt="연결리스트(6)"></p>
<blockquote>
</blockquote>
<p><span style='color:#aaaaaa'><em>↪ 2의 next 가 3으로 가르키는 것으로 바꾸기 전에 3의 next 가 2의 next 와 같도록 한 후 2가 3을 가르키도록 해야 한다.</em></span></p>
</br>

<hr>
<h1 id="5-연결리스트--시연">5. 연결리스트 : 시연</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 연결리스트와 배열의 장점을 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 연결리스트, 배열</li>
</ul>
<p>- 장점: 배열처럼 숫자를 추가하기 위해 크기를 조절하고 기존의 값을 모두 옮기지 않아도 된다는 것</p>
<p>- 단점: 임의 접근법 X <span style='color:#0000'>--</span> <span style='color:#aaaaaa'><em>ex) 이진탐색</em></span></p>
<p>- Big O : O(n) <span style='color:#0000'>-</span><span style='color:#aaaaaa'><em>insert</em></span></p>
<pre><code class="language-C">// Represents a node

typedef struct node{
    int number;
    struct node *next;
}
node;

int main(void){
    // List of size 0
    node *list = NULL;

    // Add number to List
    node *n = malloc(sizeof(node));
    if(n == NULL){
        return 1;
    }
    n -&gt; number = 1;
    n -&gt; next = NULL;
    list = n;

    // Add number to List
    n = malloc(sizeof(node));
    if(n == NULL){
        return 1;
    }
    n -&gt; number = 2;
    n -&gt; next = NULL;
    list -&gt; next = n;

    // …
    // …(생략 및 반복)…
    // …

    // Print list
    for (node *tmp = list; tmp != NULL; tmp = tmp -&gt;next){
        printf(&quot;%i\n&quot;, tmp -&gt; number);
    }

    // Free list
    while (list != NULL) {
        node *tmp = list -&gt; next;
        free(list)
        list = tmp;
    }
}</code></pre>
</br>

<hr>
<h1 id="6-연결리스트--트리">6. 연결리스트 : 트리</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 트리의 구조를 설명하고 활용하는 코드를 작성할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 트리, 루트</li>
</ul>
<p><span style='color:#0000'>--</span>연결리스트는 역동성을 주기 때문에 값들을 옮기느라 시간을 낭비하지 않을 수 있다. 하지만 그렇기 때문에 임의 접근을 할 수 없다.</p>
<p><span style='color:#0000'>--</span>그렇지만 1차원적인 자료구조만 만드는 것이 아닌 수직적인 개념을 사용해서 더 흥미로운 방식으로 요소들을 배열할 수 있다.</p>
<h2 id="binary-search-tress">binary search tress</h2>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/01d68dba-0646-499f-aa9a-dc6cb302cd03/image.png" alt="연결리스트 트리"></p>
<pre><code class="language-C">typedef struct node{
    int number;
    struct node *left;
    struct node *right;
}
node;</code></pre>
<p><span style='color:#0000'>--</span> <span style='color:#aaaaaa'><em>↪ ▼ 재귀 알고리즘으로 생각해 보면 ▼</em></span></p>
<pre><code class="language-C">bool search(node *tree){
    if(tree == NULL){
        return false;
    }
    else if (50 &lt; tree -&gt; number){
        return search(tree -&gt; right);
    }
    else if (50 &gt; tree -&gt; number){
        return search(tree -&gt;left);
    }
    else {
           return true;
    }
}</code></pre>
<p>- Big O : O (log n)</p>
</br>

<hr>
<h1 id="7-해시-테이블">7. 해시 테이블</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 해시 테이블의 원리와 구조를 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 해시 테이블, 해시 함수</li>
</ul>
<p>- 배열과 연결리스트를 조합한 것이다.</p>
<p>- 데이터 검색에 대한 연산과정을 줄일 수 있는 자료구조이다.</p>
<p>- key-value 형태</p>
</br>

<hr>
<h1 id="8-트라이">8. 트라이</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 트라이의 원리와 구조를 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 트라이</li>
</ul>
<p>- 어떤 자원을 절약하기 위해 다른 자원을 소비하는 패턴을 가진다.</p>
<p>- 많은 메모리가 들지만, 자료 구조 안에 있는 이름이나 단어를 찾는데 일정한 실행시간을 가진다.</p>
<p>- 트라이는 각 노드가 배열로 구성되어 있는 트리이다.</p>
<p>- 자식 노드 등 인덱스로 이동</p>
<p>- Big O : O(k) 즉 O(1)<span style='color: #0000'>--</span><span style='color: #aaaaaa'> * k 는 상수</span></p>
<p>- 속도는 빠르지만 메모리가 많이 필요하다.</p>
</br>

<hr>
<h1 id="9-스택-큐-딕셔너리">9. 스택, 큐, 딕셔너리</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 스택, 큐, 딕셔너리의 원리와 구조를 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 스택, 큐, 딕셔너리</li>
</ul>
<h2 id="1-queus">1) queus</h2>
<p><span style='color: #0000'>--</span> FIFO (선입선출) 의 특징을 가진 자료구조<span style='color: #0000'>--</span><span style='color: #aaaaaa'><em>cf) LIFO (Last In First Out)</em></span></p>
<table>
<thead>
<tr>
<th>in</th>
<th>out</th>
</tr>
</thead>
<tbody><tr>
<td>enqueue</td>
<td>dequeue</td>
</tr>
</tbody></table>
<h2 id="2-stacks">2) stacks</h2>
<p><span style='color: #0000'>--</span> LIFO (후입선출) 의 특징을 가진 자료구조<span style='color: #0000'>--</span><span style='color: #aaaaaa'><em>ex) 받은 메일함</em></span></p>
<table>
<thead>
<tr>
<th>in</th>
<th>out</th>
</tr>
</thead>
<tbody><tr>
<td>push</td>
<td>pop</td>
</tr>
</tbody></table>
<h2 id="3-dictionaries">3) dictionaries</h2>
<p>- hash table 과 비슷하다 (key-value)</p>
<p>- 대표적인 차이점으로 hash table은 한 객체 안에 다양한 데이터 타입을 넣을 수 있지만 dictionary 는 객체 생성 시 타입이 정해진다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI_CS] Memory]]></title>
            <link>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Memory</link>
            <guid>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Memory</guid>
            <pubDate>Fri, 11 Aug 2023 06:40:42 GMT</pubDate>
            <description><![CDATA[<h1 id="1-메모리-주소">1. 메모리 주소</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>
- 16진법을 읽고 쓸 수 있다.
- 메모리 주소에 접근하고 값을 받아오는 코드를 C로 작성할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 16진법, 메모리주소</li>
</ul>
<p>- 16진법 (hexadecimal)
<span style='color:#0000'>--</span> : 9보다 큰 숫자를 A B C D E F 라고 쓴다. 알파벳을 사용하는 이유는 한 자리로 0<del>9 뿐만 아니라 10</del>15까지 셀 수 있기 때문이다.</p>
<p>- 8bit 로 표현할 수 있는 가장 큰 숫자 : 255</p>
<p>- 255 의 다른 표현 방식</p>
<table>
<thead>
<tr>
<th>16¹</th>
<th>16⁰</th>
<th>10진법</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>⁝</td>
<td>⁝</td>
<td>⁝</td>
</tr>
<tr>
<td>0</td>
<td>9</td>
<td>9</td>
</tr>
<tr>
<td>0</td>
<td>A</td>
<td>10</td>
</tr>
<tr>
<td>⁝</td>
<td>⁝</td>
<td>⁝</td>
</tr>
<tr>
<td>0</td>
<td>F</td>
<td>15</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>16</td>
</tr>
</tbody></table>
<p>- RGB : 000000 ~ FFFFFF</p>
<p>- 0x00 : 10진법 등과의 혼동을 방지하기 위해 16진수를 사용할 때는 모든 수 앞에 0x 를 붙여서 표현해야 함 <span style='color:#bbbbbb'><em>(수학적 의미X)</em></span></p>
<p>- &quot; ~ 의 주소&quot; <span style='color:#666666'><em>(메모리 속의 위치)</em></span>
<span style='color:#0000'>--</span> ↪ <strong>&amp;</strong> <span style='color:#0000'>---</span> <span style='color:#aaaaaa'><em>ex) printf(&quot;%i\n&quot;, <strong>&amp;n</strong>);</em></span>
<span style='color:#0000'>--</span> ↪ <strong>%p</strong> : 가리키는 포인터 값을 돌려 받음 <span style='color:#0000'>--</span> <span style='color:#aaaaaa'><em>ex) printf(&quot;<strong>%p</strong>\n&quot;, &amp;n);</em></span></p>
<p>- &quot;그 주소로 가줘&quot; <span style='color:#666666'><em>(&amp; 과 반대)</em></span> : <strong>*** <span style='color:#0000'>--</span> <span style='color:#aaaaaa'>_ex) printf(&quot;</strong>%i<strong>\n&quot;, <em>*\</em>&amp;n</strong>); ⇒ n에 담긴 값 출력_</span></p>
</br>

<blockquote>
<p>💁‍♀️ <strong>Thinking</strong> 💡
Q. CS50 16진법으로 표현한다면?
A. 0x43 0x53 0x32</p>
</blockquote>
</br>

<hr>
<h1 id="2-포인터">2. 포인터</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 포인터 변수를 정의하고 사용할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 포인터</li>
</ul>
<p>- 변수 주소 저장하기
<span style='color:#0000'>--</span> int n = 50;
<span style='color:#0000'>--</span> int <em>p = &n; <span style='color:#aaaaaa'><span style='color:#0000'>--</span>_int: 포인터가 가르키는 값의 자료형을 뜻함, \</em>p: 포인터라는 표시_</span></p>
<blockquote>
<p><span style='color:#555555'><em>⚠ &#39; * &#39; 없이 한다면 clang 컴파일러가 경고하므로 주소는 반드시 포인터에 저장해야 함</em></span></p>
</blockquote>
<p>- 아주 정교한 자료형<span style='color: #bbbbbb'><em>(가계도, 배열)</em></span>을 만들 수 있음</p>
<p>- 수 많은 데이터를 관리하기 위해 사용하는 알고리즘의 기초가 됨</p>
<blockquote>
<p>포인터의 크기 ❔
<span style='color:#0000'>-</span> : 최신 컴퓨터는 64bit 포인터로 사용 <span style='color: #bbbbbb'><em>(= long type 의 크기)</em></span>되지만, 반드시 그런 것은 아니다. <span style='color: #bbbbbb'><em>(하드웨어에 따름)</em></span></p>
</blockquote>
</br>

<hr>
<h1 id="3-문자열">3. 문자열</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 문자열 형태의 새로운 자료형인 string이 어떻게 정의 되었는지 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 포인터, 문자열</li>
</ul>
<p>- 문자열의 포인터는 시작 문자의 주소를 저장</p>
<table>
<thead>
<tr>
<th>E</th>
<th>M</th>
<th>M</th>
<th>A</th>
<th>\0</th>
</tr>
</thead>
<tbody><tr>
<td>0x123</td>
<td>0x124</td>
<td>0x125</td>
<td>0x126</td>
<td>0x127</td>
</tr>
<tr>
<td><span style='color:#0000'>--</span> <span style='color:#aaaaaa'><em>↪ 포인터는 0x123</em></span></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></br></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<p>- c에는 사실 문자열이라는 자료형은 없다고 한다. 그렇기에 char의 포인터를 활용하여 문자열이라는 자료형을 만들어야 한다.</p>
<blockquote>
<p><strong>typedef char *string;</strong> </p>
</blockquote>
<table>
<thead>
<tr>
<th>typedef</th>
<th>char *</th>
<th>string;</th>
</tr>
</thead>
<tbody><tr>
<td>새로운 자료형 선언</td>
<td>값의 형태 (문자의 주소)</td>
<td>자료형의 이름</td>
</tr>
</tbody></table>
<blockquote>
</blockquote>
<p><span style='color:#555555'><em>↪ char의 주소를 가지는 string 자료형 생성</em></span></p>
</br>

<hr>
<h1 id="4-문자열-비교">4. 문자열 비교</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 문자열이 저장되어 있는 방식에 근거해서 문자열을 비교하는 방법에 대해 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 문자열</li>
</ul>
<p><span style='color:#0000'>--</span> 문자열은 비교연산자 사용 X</p>
</br>

<hr>
<h1 id="5-문자열-복사">5. 문자열 복사</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 문자열을 복사할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: malloc</li>
</ul>
<blockquote>
</blockquote>
<pre><code class="language-C">char *s = &quot;emma&quot;;
char *t = s;
t[0] = toupper(t[0]);
&gt;
printf(&quot;%s\n&quot;, s); // Emma
printf(&quot;%s\n&quot;, t); // Emma</code></pre>
<blockquote>
<p>s는 &#39;emma&#39; 에서 첫글자인 &#39;e&#39;의 주소가 담기는데 그 주소를 가르키는 포인터 t가 있다. 즉 두 포인터는 같은 주소를 가르키고 있으므로 t를 수정하게 되면 s도 같이 수정된다.</p>
</blockquote>
<p>서로 다른 메모리 공간에 복사하려면?
<span style='color:#555555'><em>↪ 메모리를 추가로 사용해서 동일한 크기의 변수를 만들고 글자를 하나씩 복사해야 함</em></span></p>
<h2 id="1-malloc">1) malloc</h2>
<p>메모리 할당 함수
<span style='color:#555555'><em>↪ 인자: 할당받을 메모리 크기</em></span> <span style='color:#0000'>---</span> <span style='color:#aaaaaa'><em>ex) malloc(strlen(s)+1);</em></span></p>
<blockquote>
</blockquote>
<pre><code class="language-C">for (int=i; n=strlen(s); i&lt;=n; i++){
    t[i] = s[i];
}</code></pre>
<h2 id="2-strcopy">2) strcopy</h2>
<p>위 for 구문을 간단히 할 수 있는 함수 <span style='color:#aaaaaa'><em>ex) strcopy(t, s);</em></span></p>
</br>

<hr>
<h1 id="6-메모리-할당과-해제">6. 메모리 할당과 해제</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 메모리를 할당하고 해제할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: free, valgrind</li>
</ul>
<p><span style='color:#0000'>--</span> malloc 사용 후 free를 사용하여 메모리 할당 해제를 해주어야 함. 만약, 해제하지 않고 계속 호출한다면 느려지고 error가 발생함</p>
<p><span style='color:#0000'>--</span> 이를 방지하기 위해 valgrind를 사용함 <span style='color:#0000'>--</span><span style='color:#aaaaaa'><em>ex) $ valgrind ./-out 파일 이름-</em></span></p>
<blockquote>
</blockquote>
<pre><code class="language-C"># include &lt;stdio.h&gt;
&gt;
void f(void){
    int *x = malloc(10 * sizeof(int));
    x[10] = 0;
}
&gt;
void main(void){
    f();
    return 0;
}</code></pre>
<blockquote>
</blockquote>
<p>① sizeof (자료형) : 자료형의 크기
<span style='color:#0000'>--</span> <span style='color:#555555'><em>↪ sizeof(int) : 4byte</em></span>
② malloc (10 * sizeof(int)) : 10개의 정수를 담을 수 있는 메모리 할당
<span style='color:#0000'>--</span> <span style='color:#555555'><em>↪ 10 * 4byte : 40byte</em></span>
③ x[10] : error
<span style='color:#0000'>--</span> <span style='color:#555555'><em>↪ x에는 10개의 정수 즉, index 0~9</em></span>
④ free(x) : 메모리 할당 해제를 위해 추가 필요
<span style='color:#0000'>--</span> <span style='color:#555555'><em>↪ &#39;x[10] = 0;&#39; 밑에 추가</em></span></p>
</br>

<hr>
<h1 id="7-메모리-교환-스택-힙">7. 메모리 교환, 스택, 힙</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 메모리에 저장된 두 값을 교환하는 코드를 작성할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 스택, 힙, 포인터</li>
</ul>
<p>- 함수에 인자를 전달할 때 그 값을 복사해서 전달
</br></p>
<p>- memory in computer : 조직적으로 메모리를 사용</p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/c16ed094-66ec-446f-870e-73ea66f2fafa/image.png" alt="memory in computer"></p>
<p>- 값을 복사해서 전달하므로 원하는 결과를 얻을 수 없음</p>
<p>- 인자를 전달할 때 값이 아닌 주소를 전달 <span style='color: #bbbbbb'><em>(포인터)</em></span></p>
</br>

<hr>
<h1 id="8-파일-쓰기">8. 파일 쓰기</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 사용자로부터 값을 입력받아 파일에 출력하는 프로그램을 작성할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: scanf, fopen, fprintf, fclose</li>
</ul>
</br>

<hr>
<h1 id="9-파일-읽기">9. 파일 읽기</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 파일을 읽고 JPEG 파일인지를 검사하는 프로그램을 작성할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: JPEG, fread</li>
</ul>
<p>- fopen, malloc, get_string 과 같은 함수는 error 발생시 NULL 을 return</p>
<p>- fread(배열, 읽을 바이트, 읽을 횟수, 읽을 파일)</p>
<p>- JPEG 형식에 관한 설명문서에 따르면, 카메라로 사진을 찍을 때 생기는 모든 JPEG 파일의 첫 세 바이트는 무조건 &#39;FF&#39;, &#39;D8&#39;, &#39;FF&#39; 로 시작한다고 함</p>
<p>- file I/O <span style='color: #666666'><em>(파일 입출력)</em></span>
<span style='color:#0000'>--</span> <span style='color:#666666'>↪ 사진 또는 비트맵이 이미지의 픽셀을 나타냄</span></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI_CS] Algorithms]]></title>
            <link>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Algorithms</link>
            <guid>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Algorithms</guid>
            <pubDate>Fri, 11 Aug 2023 06:39:38 GMT</pubDate>
            <description><![CDATA[<h1 id="1-검색-알고리즘">1. 검색 알고리즘</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 주어진 배열 속에서 특정 값을 찾는 방법을 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 선형검색, 이진검색</li>
</ul>
<p><span style='color:#0000'>--</span> 선형검색, 이진검색 : 정렬 X, 정렬 O</p>
</br>

<hr>
<h1 id="2-알고리즘-표기법">2. 알고리즘 표기법</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 알고리즘의 실행시간의 상한과 하한을 표기할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: Big O, Big Ω</li>
</ul>
<h2 id="1-big-o">1) Big O</h2>
<p><span style='color:#0000'>--</span> 알고리즘을 수행하는데 필요한 시간의 상한선을 의미 <span style='color:#cccccc'><em>(최악의 경우)</em></span></p>
<h2 id="2-big-ω">2) Big Ω</h2>
<p><span style='color:#0000'>--</span> Big O 와 상반되는 관계 <span style='color:#cccccc'><em>(최상의 경우)</em></span></p>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th></th>
<th>Big O</th>
<th>Big Ω</th>
</tr>
</thead>
<tbody><tr>
<td>O (n²)</td>
<td>selection sort</br>bubble sort</td>
<td>selection sort</br><del>bubble sort</del></td>
</tr>
<tr>
<td>————</td>
<td>—————</td>
<td>—————</td>
</tr>
<tr>
<td>O (n log n)</td>
<td>merge sort</td>
<td>merge sort</td>
</tr>
<tr>
<td>————</td>
<td>—————</td>
<td>—————</td>
</tr>
<tr>
<td>O (n)</td>
<td>linear search</td>
<td>bubble sort</td>
</tr>
<tr>
<td>————</td>
<td>—————</td>
<td>—————</td>
</tr>
<tr>
<td>O (log n)</td>
<td>binary search</td>
<td>-</td>
</tr>
<tr>
<td>————</td>
<td>—————</td>
<td>—————</td>
</tr>
<tr>
<td>O (1)</td>
<td>-</td>
<td>linear search</br>binary search</td>
</tr>
</tbody></table>
<blockquote>
</blockquote>
<p><span style='color: #aaaaaa'> <em>bubbble sort 의 경우, 더 이상 교환이 일어나지 않을 때 멈추는 최적화 기법이 존재한다면 소요 시간이 줄어들어 하한선이 낮아짐</em> </span></p>
</br>

<hr>
<h1 id="3-선형-검색">3. 선형 검색</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 주어진 배열 또는 구조체에서 선형검색을 할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 선형검색, 구조체</li>
</ul>
<p>- 자바와 동일하게 문자열을 비교할 때 비교연산자를 사용할 수 없음
</br></p>
<p>- strcmp 함수: 두 문자열이 같다면 0 반환</p>
<p><span style='color:#0000'>--</span> ↪ 양수를 반환한다면 첫번째 문자열이 큰 경우이고 음수를 반환한다면 작은 경우 <span style='color: #cccccc'><em>(알파벳 기준)</em></span></p>
<p><span style='color:#0000'>--</span> ↪ # include string.h 필요
</br></p>
<p>- typedef : 새로운 타입을 정의 <span style='color: #cccccc'><em>(나만의 자료형 만들기)</em></span></p>
<p><span style='color:#0000'>--</span> ⨁ struct (구조체) : 그릇처럼 여러가지 자료형을 담을 수 있음</p>
<blockquote>
</blockquote>
<pre><code class="language-C">typedef struct {
    string name;
    string number;
} person;</code></pre>
<p><span style='color: #aaaaaa'> <em>중괄호로 감싸져 있는 것을 <strong>캡슐화</strong> 라고 하며 마지막에 person 은 <strong>구조체의 이름(별칭)</strong> 이다.</em></span></p>
</br>

<hr>
<h1 id="4-버블-정렬">4. 버블 정렬</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 버블 정렬의 원리와 실행시간을 설명하고 구현할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 버블정렬</li>
</ul>
<h2 id="1-big-o--o-n²">1) Big O : O (n²)</h2>
<p><span style='color:#0000'>--</span> 선형 및 이진 검색보다 상한선이 높음</p>
<blockquote>
<p>(n-1) ⨯ (n-1)
n² - 1n - 1n + 1
n² -2n + 1</p>
<hr>
<p><span style='color: #bbbbbb'><em>⨁ 이진 검색이 선형 검색보다 상한선이 낮지만, 이진 검색을 위한 조건이 정렬인 것을 생각해보면 이진 검색이 선형 검색보다 반드시 좋다고 할 수는 없다는 것을 알 수 있다.</em></span></p>
</blockquote>
<h2 id="2-big-ω--ω-n²">2) Big Ω : Ω (n²)</h2>
<p><span style='color:#0000'>--</span> 이미 정렬된 배열이더라도 작동하므로 하한선 역시 제곱이다. <span style='color:#cccccc'> <em>(최적화 기법이 없을 때)</em></span></p>
</br>

<hr>
<h1 id="5-선택정렬">5. 선택정렬</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 선택정렬의 원리와 실행시간을 설명 및 구현할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 선택정렬</li>
</ul>
<h2 id="1-big-o--o-n²-1">1) Big O : O (n²)</h2>
<p><span style='color:#0000'>--</span> 버블정렬과는 근본적으로 다른 알고리즘이지만, 수학적 혹은 실제로는 같은 성능을 가짐</p>
<blockquote>
<p>n + (n-1) + (n-2) + … + 1
n(n+1) / 2
(n²+n) / 2
n²/2 + n/2</p>
</blockquote>
<h2 id="2-big-ω--ω-n²-1">2) Big Ω : Ω (n²)</h2>
<p><span style='color:#0000'>--</span> 버블정렬과 같은 의미로 최선의 경우에도 시간이 똑같이 소요됨</p>
</br>

<hr>
<h1 id="6-정렬-알고리즘의-실행시간">6. 정렬 알고리즘의 실행시간</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 여러 정렬 및 검색 알고리즘의 실행시간을 Big O, Big Ω 로 정의할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: Big O, Big Ω</li>
</ul>
<p><span style='color:#0000'>--</span> 교환이 없을 때 알고리즘을 일찍 종료한다면 최선의 경우에 n-1 번의 과정이 필요 ⇒ Ω (n²) → Ω (n)</p>
</br>

<hr>
<h1 id="7-재귀-recursion">7. 재귀 (Recursion)</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 함수를 재귀적으로 사용하는 코드를 작성할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 재귀</li>
</ul>
<p>- 눈에 보보는 혹은 가상의 물체의 구조를 그 물체 자체를 이용하여 설명하는 것</p>
<blockquote>
<p>ex) 슈퍼마리오에 있는 피라미드
<img src="https://velog.velcdn.com/images/jjang_naa/post/e5578e86-1028-4cab-b246-d4e3bc585399/image.png" alt="재귀 예시"></p>
</blockquote>
<p><span style='color: #bbbbbb'><em>↪ 높이 4 피라미드에서 하나씩 줄일 때 마지막 부분에서 반환 or 종료 or 정지 등 알고리즘에 맞게 처리가 필요</em></span></p>
<p>- 스스로 호출하면서 기존 문제보다 더 작은 크기의 문제를 풀어감 <span style='color: #bbbbbb'><em>(like 이진탐색, 분할 정복법)</em></span></p>
</br>

<hr>
<h1 id="8-병합-정렬">8. 병합 정렬</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 재귀를 활용한 병합 정렬을 구현할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 병합정렬</li>
</ul>
<h2 id="1-재귀-알고리즘의-핵심">1) 재귀 알고리즘의 핵심</h2>
<p><span style='color:#0000'>--</span> 왼쪽~오른쪽, 병합<span style='color: #bbbbbb'><em>(else)</em></span>, return <span style='color: #bbbbbb'><em>(if item==one)</em></sapn></p>
<blockquote>
<p>ex) 두 배열 중 가장 작은 값을 꺼내 다른 배열의 가장 작은 값의 다음에 두는 과정</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/d7142e19-889e-48d0-a3d1-f98fcde94cfc/image.png" alt="병합정렬"></p>
<h2 id="2-병합정렬의-실행시간-n-⨯-log-n">2) 병합정렬의 실행시간: n ⨯ log n</h2>
<p><span style='color:#0000'>--</span> 크기 8인 배열을 쪼개서 크기 1인 배열 8개로 만드는데 필요한 과정으로 약 <strong>log n</strong>, 그 후 n개의 숫자를 다시 합치는 과정을 <strong>n</strong>번 반복
</br></p>
<p>⨁ Theta 표기법: 어떤 알고리즘의 상한선과 하한선이 같을 때</p>
<table>
<thead>
<tr>
<th></th>
<th>theta (θ)</th>
</tr>
</thead>
<tbody><tr>
<td>θ (n²)</td>
<td>selection sort</td>
</tr>
<tr>
<td>————</td>
<td>——————</td>
</tr>
<tr>
<td>θ (n log n)</td>
<td>merge sort</td>
</tr>
<tr>
<td>————</td>
<td>——————</td>
</tr>
<tr>
<td>θ (n)</td>
<td>-</td>
</tr>
<tr>
<td>————</td>
<td>——————</td>
</tr>
<tr>
<td>θ (log n)</td>
<td>-</td>
</tr>
<tr>
<td>————</td>
<td>——————</td>
</tr>
<tr>
<td>θ (1)</td>
<td>-</td>
</tr>
</tbody></table>
<p><span style='color:#0000'>--</span> <span style='color:#666666'>↪ 선택정렬 및 병합정렬은 맹목적으로 같은 알고리즘을 계속 반복하므로 상한선과 하한선이 같음</span></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI_CS] Array]]></title>
            <link>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Array</link>
            <guid>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Array</guid>
            <pubDate>Fri, 11 Aug 2023 06:38:42 GMT</pubDate>
            <description><![CDATA[<h1 id="1-컴파일링">1. 컴파일링</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 컴파일링의 네 단계를 설명할 수 있다,.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 컴파일러, 어셈블링, 링킹</li>
</ul>
<p><span style='color:#0000'>--</span> 4개의 단계가 존재: preprocessing, compiling, assembling, linking</p>
<h2 id="1-preprocessing">1) preprocessing</h2>
<p><span style='color:#0000'>--</span> clang 혹은 make 즉 명령어를 사용하여 프로그램을 실행하면 해당 파일의 실제 코드로 대체</p>
<p><span style='color:#0000'>--</span> <span style='color:#bbbbbb'> <em>ex) # include stdio.h =&gt; string get_string(string prompt);</em></span></p>
<h2 id="2-compiling">2) compiling</h2>
<ul>
<li><p>소스코드 → 머신코드</p>
</li>
<li><p>전처리가 된 코드가 clang 과 같은 컴파일러에 의해 어셈블리 코드로 바뀐다.</p>
</li>
</ul>
<h2 id="3-assembling">3) assembling</h2>
<p><span style='color:#0000'>--</span> 어셈블리 코드가 생기면 그걸 실제 0과 1로 이루어진 머신코드로 바꿔야 하는데, 이걸 clang 이 수행하는 어셈블링이라고 하는 것이다.</p>
<h2 id="4-linking">4) linking</h2>
<p><span style='color:#0000'>--</span> 위 세단계를 거친 후 모든 0과 1들을 하나의 큰 파일로 합치는 것</p>
<p><span style='color:#0000'>--</span> 프로그램은 여러 다른 파일과 연관되어 있으므로 그 파일들을 clang 이 컴파일 해야 한다. 이를 위해 clang 을 여러번 실행해야 한다면 시간 소요가 늘어나겠지만 컴퓨터가 자동으로 해주므로 괜찮다.</p>
</br>

<hr>
<h1 id="2-디버깅">2. 디버깅</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 디버깅 하는 여러방법을 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 디버깅, help50, debug50</li>
</ul>
<p><span style='color:#0000'>--</span> 문법 오류 및 논리 오류 : help, debugging</p>
</br>

<hr>
<h1 id="3-코드의-디자인">3. 코드의 디자인</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 코드의 정확성과 디자인을 관리하는 방법을 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: check50, style50, 고무오리</li>
</ul>
<p><span style='color:#0000'>--</span> 가독성이 좋아야 하는 이유 : 유지보수 및 협업시 큰 도움이 됨</p>
</br>

<hr>
<h1 id="4-배열-1">4. 배열 (1)</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 배열을 정의하고 사용하는 방법을 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 배열</li>
</ul>
<p>- 모두 같은 자료형의 값들로 구성되어 있으며 길이를 선언해줘야 함</p>
<p>- c에서는 char를 사용할 때 <del>쌍따옴표</del>가 아닌 따옴표 !</p>
<p>- 형변환 변수 앞에 괄호 사용 <span style='color:#cccccc'> <em>ex) (int) a</em></span></p>
<p>- 2진법 ASCII 등 컴퓨터에 저장될 때 어떤식으로 저장되는지 대응 관계를 항상 인지하기</p>
</br>

<hr>
<h1 id="5-배열-2">5. 배열 (2)</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 배열을 정의하고 사용하는 방법을 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 배열, 전역변수</li>
</ul>
<p>- 전역변수는 대문자로, 선언할 때 const</p>
<p>- main 이 위에 있는 것이 좋음</p>
<p>- C 에서는 정수를 정수로 나누면 정수가 나옴</p>
<p>- 강력한 자료형으로 반환 <span style='color:#cccccc'> <em>ex) int/float =&gt; float</em></span></p>
</br>

<hr>
<h1 id="6-문자열과-배열">6. 문자열과 배열</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 문자열이 C에서 정의되는 방식과 메모리에 저장되는 방식을 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 문자, 문자열</li>
</ul>
<p>- string 은 정해진 크기를 가질 수 없음</p>
<p>- 문자열이 언제 끝나는지를 알려주는 정보가 필요</p>
<p><span style='color:#0000'>--</span> ↪ null 문자 (\0) : 8개의 bit 가 모두 0인 상태</p>
<p>- %s 에 변수명을 넣으면 printf가 일종의 루프를 만들어 첫번째 글자부터 반복해서 널문자 전까지 출력</p>
</br>

<hr>
<h1 id="7-문자열의-활용">7. 문자열의 활용</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 문자열을 탐색하고 일부 문자를 수정하는 코드를 구현할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: strlen, toupper</li>
</ul>
<p>- # include &lt;string.h&gt; : 문자열과 관련된 다양한 함수들이 있는 라이브러리</p>
<p>- # include &lt;ctype.h&gt; : toupper 함수가 있는 라이브러리</p>
<p><span style='color:#bbbbbb'>⨁ 프로그래밍은 결국 추상화를 이용해서 복잡한 기계어를 간단하게 처리하는 것</span></p>
</br>

<hr>
<h1 id="8-명령행-인자">8. 명령행 인자</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 명령형 인자를 받는 프로그램을 C로 작성할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 명령행 인자, argv, argc</li>
</ul>
<p>- 실행하고자 하는 프로그램 뒤에 적는다. <span style='color:#bbbbbb'><em>ex) $ clang <strong>-o</strong> hello hello.c</em></span></p>
<p>- 정보를 보호하기 위한 암호화</p>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/bf82a5cb-2bff-4fb1-87c8-2c2ffa8df334/image.png" alt="암호화 input output"></p>
<blockquote>
<p>⨁ 송신자와 수신자가 사전에 어떤 키를 사용해서 문자를 암호화 할지 정해야 한다.</p>
<hr>
<p>ex)
<img src="https://velog.velcdn.com/images/jjang_naa/post/e4f7b521-7343-4520-893f-5da41d746d0b/image.png" alt="예시 암호화 input output"></p>
</blockquote>
<p><span style='color:#aaaaaa'>위와 같은 구조에서 key = 1, plaintext = I LOVE YOU 라고 가정할 때, 컴파일 과정에서 plaintext 는 ASCII 코드를 사용하여 변환 후 각 수에 1을 더해주어 ciphertext 로 ouput 한다면 다른 사람들은 원래 값을 알 수 없다.</span></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI_CS] C (programming language)]]></title>
            <link>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-C</link>
            <guid>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-C</guid>
            <pubDate>Fri, 11 Aug 2023 06:37:18 GMT</pubDate>
            <description><![CDATA[<h1 id="1-c-기초">1. C 기초</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: C로 &quot;hello, word&quot; 를 출력하는 프로그램을 만들 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: stdio.h, clang, 컴파일러</li>
</ul>
<p>- #include &lt;stdio.h&gt; 하지 않으면 printf() 함수 사용 X</p>
<p>- 컴파일러
<img src="https://velog.velcdn.com/images/jjang_naa/post/55f1520d-eae6-42fb-a3de-d37a0b602377/image.png" alt="컴파일러"></p>
<p>- $ clang: 코드를 컴파일 해줌</p>
<ul>
<li>실행시 a.out 파일 생성 (머신코드)</li>
<li>./a.out : 현재 디렉토리에 있는 a.out 실행</li>
</ul>
<p>- 파일 내용 수정 후 ./a.out 실행시 변경 전 내용 출력 <span style='color: #aaaaaa'><em>(컴파일 하지 않았기 때문)</em></span></p>
<p>- $ clang 뒤에는 파일명만 적을 수 있는 것이 아닌 명령행 인자를 추가할 수 있음</p>
<ul>
<li>ex) $ clang -o hello hello.c</li>
<li>$ ls → a.out* hello* hello.c <span style='color: #bbbbbb'><em>&#39;*&#39; 표시는 머신코드라는 뜻(≒실행가능)</em></span>
<span style='color:#cccccc'>⨁ 이 외: rm, mkdir, rmdir 등</span></li>
</ul>
<table>
<thead>
<tr>
<th>10진법</th>
<th>2진법</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>2</td>
<td>010</td>
<td>0<em>4 + 1\</em>2 + 0*1</td>
</tr>
<tr>
<td>3</td>
<td>011</td>
<td>0<em>4 + 1\</em>2 + 1*1</td>
</tr>
<tr>
<td>4</td>
<td>100</td>
<td>1<em>4 + 0\</em>2 + 0*1</td>
</tr>
<tr>
<td>8</td>
<td>1000</td>
<td>1*8 + 0*4 + 0*2 + 0*1</td>
</tr>
</tbody></table>
</br>

<hr>
<h1 id="2-문자열">2. 문자열</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: C로 문자열을 가진 변수를 선언 및 출력하는 프로그램을 만들 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 형식지정자, string, make</li>
</ul>
<h2 id="1-형식지정자">1) 형식지정자</h2>
<ul>
<li>%s, %i, %d 등 형태</li>
</ul>
<p>⨁ #include 하는 과정
: clang 을 통해 컴파일, 이는 컴퓨터가 include 하려는 파일을 사용자의 소스코드에 추가하고 명령어로 연결을 시켜 두 코드가 한 프로그램으로 실행될 수 있도록 함
<span style='color:#dddddd'><em>ex) $ clang -o string string.c -lcs50</em></span></p>
<h2 id="2-make">2) make</h2>
<p>바로 위 설명에서 clang 을 사용하여 컴파일하는 과정보다 보다 간단하다.</p>
<p>ex) $ make string <span style='color:#cccccc'><em>make 뒤에는 프로그램 이름 인자만 입력해야 함</em></span></p>
<p>위 예시를 실행하게 된다면 string.c 파일을 찾고 string 이름으로 머신코드를 output 한다(string*).</p>
</br>

<hr>
<h1 id="3-조건문과-루프">3. 조건문과 루프</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 조건문과 루프를 C로 작성할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: int, if, while, for</li>
</ul>
<p>- ⊜: 할당 연산자</p>
<p>- type 선언은 한번만</p>
<p>- 구문설탕: 새로운 기능 추가X, 기존 기능을 더욱 보기 좋고 간결하게 활용할 수 있도록 해준다는 뜻</p>
<p>- c에서는 true 첫글자 소문자 가능 <span style='color:#cccccc'><em>(Python은 True)</em></span></p>
<p>- for 구문: 인자 세개 <span style='color:#cccccc'><em>(Java와 동일, 형태: (변수선언, boolean, 변수증감))</em></span> </p>
</br>

<hr>
<h1 id="4-자료형-형식지정자-연산자">4. 자료형, 형식지정자, 연산자</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>
- 다양한 데이터 타입과 형식지정자를 나타내는 방법을 학습한다.
- 다양한 연산자를 이용하여 조건문을 표현하는 방법을 학습한다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: char, long, float, double, %, &amp;&amp;, ||</li>
</ul>
<p>- cd <span style='color:#cccccc'><em>(경로 설정)</em></span>, pwd <span style='color:#cccccc'><em>(경로 확인)</em></span></p>
</br>

<hr>
<h1 id="5-사용자-정의-함수-중첩루프">5. 사용자 정의 함수, 중첩루프</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 사용자 정의 함수와 중첩루프를 작성할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 사용자 정의 함수, 중첩루프</li>
</ul>
<p>- void <span style='color:#cccccc'><em>(return 값 X)</em></span> 선언하는 등 생성</p>
<p>- 위에서 아래로 왼쪽에서 오른쪽으로 순차적으로 작동하기 때문에 main을 사용자 정의 함수보다 아래에 둔다면 error 발생.
<span style='color:#0000'>--</span> ⨁ main 위에 선언한다면 가능 <span style='color:#bbbbbb'><em>ex) void cough(void);</em></span></p>
<p>- do-while 루프: boolean → 수행</p>
</br>

<hr>
<h1 id="6-하드웨어의-한계">6. 하드웨어의 한계</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 메모리 용량이 프로그램의 구동에 미치는 영향을 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 메모리, 오버플로우</li>
</ul>
<h2 id="1-ram">1) RAM</h2>
<ul>
<li>모든 프로그램이 실행 중 (열려있는 동안) 저장되는 곳</li>
<li>컴퓨터가 여러 일들을 한번에 할 때 기억하기 위해 사용되는 것</li>
<li>하드웨어로 성능은 유한함</li>
</ul>
<h2 id="2-overflow">2) overflow</h2>
<p><span style='color:#0000'>--</span> 메모리 저장공간이 유한하다면 컴퓨터는 특정 지점에서 한계에 부딪힌다. float 은 32bit 를 사용하고 double은 64bit 를 사용하므로 보다 정확한 계산이 가능하지만 이 또한 완벽하지 않다. 왜냐하면 결국 저장할 수 있는 정보는 유한하기 때문이다.</p>
<p><span style='color:#0000'>--</span> 따라서 컴퓨터는 계산할 수 있는 값들 중 원하는 값과 가장 가까운 값을 저장한다. <span style='color:#bbbbbb'> <em>ex) 1 나누기 10을 한다면 0.1(1/10)에 가까운 값을 저장</em></span></p>
<p><span style='color:#0000'>--</span> overflow를 예시와 함께 설명한다면, 10진법인 세자리 숫자가 있을 때 1을 더하다보면 999가 되고 일 때 1을 더해주면 1,000 이ehlsek. 하지만 세자리 까지의 숫자만 저장할 수 있는 메모리 공간이라면 000만 남게 된다. <span style='color:#cccccc'><em>2진법도 같음</em></span></p>
<p><span style='color:#0000'>--</span> 이 설명은  <strong>Y2K</strong> 와 <strong>보잉 787</strong> 사례를 안다면 더 쉽게 이해할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI_CS] Intro]]></title>
            <link>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Intro</link>
            <guid>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Intro</guid>
            <pubDate>Fri, 11 Aug 2023 04:10:17 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jjang_naa/post/2612371c-6a37-48b6-8f11-22c2e7cc556f/image.png" alt=""></p>
<blockquote>
<p><strong>학습 커리큘럼</strong> 📝
01. 컴퓨팅사고 (Computational Thinking)
02. C언어
03. 배열 (Arrays)
04. 알고리즘 (Algorithms)
05. 메모리 (Memory)
06. 자료구조 (Data structures) </p>
</blockquote>
<p><a href="https://www.boostcourse.org/cs112">수강신청 하러가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AI_CS] Computational Thinking]]></title>
            <link>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Computational-Thinking</link>
            <guid>https://velog.io/@jjang_naa/Artifical-Intelligence-CS-Computational-Thinking</guid>
            <pubDate>Fri, 04 Aug 2023 04:56:23 GMT</pubDate>
            <description><![CDATA[<h1 id="1-2진법">1. 2진법</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: CS 정의 및 컴퓨터가 정보를 표현하는 방법에 대해 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 컴퓨터과학, 2진법, 비트, 바이트</li>
</ul>
<p>- 10진법은 10의 거듭제곱 ex. 123 = 1<em>100 + 2\</em>10 + 3*1</p>
<p>- 2진법은 2의 거듭제곱 ex. 010 = 0<em>4 + 1\</em>2 + 0*1</p>
<table>
<thead>
<tr>
<th>10진법</th>
<th>2진법</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>2</td>
<td>010</td>
<td>0<em>4 + 1\</em>2 + 0*1</td>
</tr>
<tr>
<td>3</td>
<td>011</td>
<td>0<em>4 + 1\</em>2 + 1*1</td>
</tr>
<tr>
<td>4</td>
<td>100</td>
<td>1<em>4 + 0\</em>2 + 0*1</td>
</tr>
<tr>
<td>8</td>
<td>1000</td>
<td>1*8 + 0*4 + 0*2 + 0*1</td>
</tr>
</tbody></table>
<blockquote>
<p>📌 2진법을 위해서 더 많은 0과 1을 필요로 하는 데 이것을 비트(bit) 라고 표현한다. 컴퓨터는 수많은 bit를 활용하여 정보를 표현하고 bit 보다 더 많은 0과 1을 필요로 한다면 byte (바이트)를 사용한다.</br>byte = 8bit, 즉 8개의 1과 0을 의미한다.</p>
<hr>
</blockquote>
<table>
<thead>
<tr>
<th>💡</th>
<th>💡</th>
<th>💡</th>
<th>💡</th>
<th>💡</th>
<th>💡</th>
<th>💡</th>
<th>💡</th>
</tr>
</thead>
<tbody><tr>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td>8</td>
<td>4</td>
<td>2</td>
<td>1</td>
</tr>
<tr>
<td>off</td>
<td>off</td>
<td>off</td>
<td>off</td>
<td>off</td>
<td>off</td>
<td>off</td>
<td>off</td>
</tr>
</tbody></table>
<blockquote>
</blockquote>
<p>🎓 50을 이진법으로 한다면 어떤 스위치를 켜야 할까 ?
🔑 32, 16, 2 (00110010)</p>
<blockquote>
</blockquote>
<p>🎓 13을 이진법으로 한다면 어떤 스위치를 켜야 할까 ?
🔑 8, 4, 1 (00001101)</p>
<blockquote>
<blockquote>
<p>※ 컴퓨터 안에 <strong>트랜지스터</strong><span style='color: #868E96'><em>(컴퓨터 안에 있는 아주 작은 스위치)</em></span> 를 물리적으로 이용해서 정보를 표현하고 값을 저장.
<span style='color: #cdcdcd'> + 컴퓨터는 수백만 수십억개의 트랜지스터를 가지고 있음</span></p>
</blockquote>
<hr>
<ul>
<li>다양한 데이터 표현하기</li>
</ul>
<table>
<thead>
<tr>
<th>단위</th>
<th>정의</th>
<th>저장공간 크기</th>
</tr>
</thead>
<tbody><tr>
<td>bit</td>
<td>0 또는 1</td>
<td>예 / 아니오, true / false</td>
</tr>
<tr>
<td>byte</td>
<td>8bit</td>
<td>영어 알파벳 1개</td>
</tr>
<tr>
<td>KB</td>
<td>1,000 byte</td>
<td>몇 개의 문단</td>
</tr>
<tr>
<td>MB</td>
<td>1,000 KB</td>
<td>1분 길이의 MP3 노래</td>
</tr>
<tr>
<td>GB</td>
<td>1,000 MB</td>
<td>30분 길이의 HD 영화</td>
</tr>
<tr>
<td>TB</td>
<td>1,000 GB</td>
<td>&#39;심슨네 가족&#39; 열 여섯 시즌</td>
</tr>
</tbody></table>
</blockquote>
<hr>
<h1 id="2-정보의-표현">2) 정보의 표현</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>: 컴퓨터가 문자, 사진, 영상, 음악 등 다양한 정보를 처리하는 방식을 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: ASCII, 유니코드, RGB</li>
</ul>
<h2 id="1-ascii">(1) ASCII</h2>
<p>정보 교환을 위한 미국 표준 코드</p>
<blockquote>
<p>ex. <strong>H I !</strong> : 72 73 33</p>
</blockquote>
<table>
<thead>
<tr>
<th>A</th>
<th>B</th>
<th>C</th>
<th>D</th>
<th>E</th>
<th>F</th>
<th>G</th>
<th>H</th>
<th>...</th>
</tr>
</thead>
<tbody><tr>
<td>65</td>
<td>66</td>
<td>67</td>
<td>68</td>
<td>69</td>
<td>70</td>
<td>71</td>
<td>72</td>
<td>...</td>
</tr>
<tr>
<td><span style='color:#aaaaaa'>* A<del>Z: 65</del>90</span></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h2 id="2-유니코드">(2) 유니코드</h2>
<p>ASCII 의 상위집합과 같다고 보면 된다.
차이점으로 8, 16, 24 혹은 32 bit 까지도 사용된다는 것이 있다.</p>
<blockquote>
<p>ex. <strong>이모티콘</strong> : 😂
<span style='color:#cccccc'><em>위 이모티콘의 10진법은 &#39;128,514&#39; 이라고 한다. 이모티콘은사진 그 자체로 수많은 작은 점들로 이루어져 있다.</em></span></p>
</blockquote>
<h2 id="3-rgb">(3) RGB</h2>
<p>수 많은 점들을 표현한 것으로 그래픽을 사용하는 프로그램에서는 &#39;72 73 33&#39;을 숫자로 해석하여 &#39;HI!&#39;로 표현하는 대신에 빨강(R) 초록(G) 파랑(B)의 양으로 받아들인다.</br>
즉, 어떤 방법을 사용해서 정보를 나타내든 결국 0과 1들로 표현된다.</p>
<blockquote>
</blockquote>
<p>🎓 CS 50을 이진법으로 표현한다면 ?
🔑 67, 83, 50 (01000011, 01010011, 00110010)</p>
<blockquote>
</blockquote>
</br>

<hr>
<h1 id="3-알고리즘">3) 알고리즘</h1>
<blockquote>
<ul>
<li><strong>학습목표</strong>
- 우리가 일상생활에서 하는 일들을 컴퓨터가 이해할 수 있는 알고리즘으로 표현할 수 있다.
- 효율적인 알고리즘에 대해 설명할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong>핵심단어</strong>: 알고리즘, 의사코드</li>
</ul>
</br>
🎓 입력으로부터 출력을 어떻게 얻을 수 있을까?

<p><img src="https://velog.velcdn.com/images/jjang_naa/post/8b3e1f07-aa2f-4e60-8185-21e474fb49d1/image.png" alt="input &gt; algorithms &gt; output"></p>
<blockquote>
<p>🔑 전화번호부에서 특정 인물을 찾기 위한 알고리즘을 구현하려고 했을 때, 아래의 3가지 알고리즘의 성능을 확인해 보자.</p>
<blockquote>
<p><span style='color:#ed7d31'>(a)</span> 한장씩 차례대로 찾는다.
<span style='color:#ffc000'>(b)</span> 두장씩 차례대로 찾는다.
<span style='color:#70ad47'>(c)</span> 반으로 나눴을 때 찾고자 하는 것이 없는 범위의 것을 버리고 찾을 때까지 이를 반복한다.</p>
</blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/d40230da-a5df-4ccf-a1d5-56cc0c3cde9b/image.png" alt="algorithms speed"></p>
<blockquote>
</blockquote>
<p>전화번호부가 총 1,024장이라고 가정한다.
a와 b를 비교해보면 시간 소요의 차이가 확연하다. 이 결과에 따르면 a보다 b가 더 좋은 알고리즘이라고 할 수 있다.</br>
하지만, b 역시 문제의 크기가 클수록 시간소요가 증가한다는 점은 해결하지 못했다. </br>
c를 보면 문제 양에 상관이 거의 없게 시간 소요 변동이 없다. 이는 효율성 측면에서 아주 큰 차이다.</p>
</br>

<hr>
<h2 id="4-스크래치-기초">4) 스크래치: 기초</h2>
<h2 id="5-스크래치-심화">5) 스크래치: 심화</h2>
<p>위 두 과정은 프로그래밍 기초 (블록 만드는 것)에 대한 것으로 포스팅은 생략 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Intro]]></title>
            <link>https://velog.io/@jjang_naa/Intro</link>
            <guid>https://velog.io/@jjang_naa/Intro</guid>
            <pubDate>Fri, 04 Aug 2023 02:39:05 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jjang_naa/post/e53cb98d-9b60-4536-949c-1d1cf48d0912/image.png" alt=""></p>
<blockquote>
<p>📕 학습 커리큘럼 :
1주차 : 파이썬 소개, 변수 표현식 및 코드
2주차 : 조건부 실행, 함수 
3주차 : 루프, 반복문
4주차 : 문자열과 파일
5주차 : 리스트
6주차 : 딕셔너리와 튜플  </p>
</blockquote>
<p><a href="https://www.boostcourse.org/study-cs122-2023"><del>모집 페이지 보기</del></a></p>
<hr>
<p>본 스터디는 현재 모집 기간이 끝났으며 8월 24일 목요일에 종료될 예정입니다.</p>
<p>네이버 부스트코스에는 다양한 스터디 및 무료강의가 있으니 참고 부탁드려요 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PY4E 2023] week_4]]></title>
            <link>https://velog.io/@jjang_naa/PY4E-2023-week4</link>
            <guid>https://velog.io/@jjang_naa/PY4E-2023-week4</guid>
            <pubDate>Fri, 04 Aug 2023 02:28:37 GMT</pubDate>
            <description><![CDATA[<h1 id="4주차-학습-커리큘럼">4주차 학습 커리큘럼</h1>
<p>👉 <strong>문자열과 파일</strong> ✨</p>
<p>👀 <a href="https://colab.research.google.com/drive/1po7u4k3HKfDM_7FG9JomD7A3pP_ITMBH?usp=sharing">코드 보러가기 (colab)</a></p>
<hr>
<blockquote>
<p>➕ <strong>추가</strong> (230811)
<img src="https://velog.velcdn.com/images/jjang_naa/post/d081f78c-a306-4f2f-a5cd-8ee358cd5e9e/image.png" alt="4주차 우수미션 팀 선정"></p>
</blockquote>
<p>4주차 우수미션 팀에 선정 됐다! 🎉
4번 문제의 코드는 라이브 중 소개도 되었다. <span style="color: #d7d7d7"> (본인이 작성한 코드 ✌)</span>
뿌-듯 (❁´◡`❁)</p>
<hr>
<h3 id="q1-숫자-3자리-표기">Q1. 숫자 3자리 표기</h3>
</br>

<h3 id="q2-특정-단어-개수-세기">Q2. 특정 단어 개수 세기</h3>
<blockquote>
<p><strong>조건</strong></p>
</blockquote>
<p>: 변수에 담긴 글을 함수에 넣어주면 txt 파일로 저장</p>
<h3 id="q3-방명록">Q3. 방명록</h3>
<blockquote>
<p><strong>조건</strong></p>
</blockquote>
<p><strong>1.</strong> 010 으로 시작함
<strong>2.</strong> 번호가 - 로 구분이 되어 있음
<strong>3.</strong> - 를 포함하여 길이가 13임
<strong>4.</strong> txt 파일로 저장</p>
<h3 id="q4-주민등록번호">Q4. 주민등록번호</h3>
<blockquote>
<p><strong>조건</strong></p>
</blockquote>
<p><strong>1.</strong> 양식: 000000-0000000 (총 길이 14자리)
<strong>2.</strong> 뒷자리 시작번호 1,3: 남자 / 2, 4: 여자
<strong>3.</strong> 뒷자리 3, 4는 only 2000년생 이후 출생자
<strong>4.</strong> 조건 불충족시, &quot;잘못된 번호입니다&quot;라는 메세지 출력</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PY4E 2023] week_3]]></title>
            <link>https://velog.io/@jjang_naa/PY4E-2023-week3</link>
            <guid>https://velog.io/@jjang_naa/PY4E-2023-week3</guid>
            <pubDate>Fri, 04 Aug 2023 02:28:04 GMT</pubDate>
            <description><![CDATA[<h1 id="3주차-학습-커리큘럼">3주차 학습 커리큘럼</h1>
<p>👉 <strong>루프와 반복문</strong> ✨</p>
<p>👀 <a href="https://colab.research.google.com/drive/1d17r3jPmCqhpoWTqTX33ulnJI4H3c-w-?usp=sharing">코드 보러가기 (colab)</a></p>
<hr>
<h3 id="q1-구구단">Q1. 구구단</h3>
<blockquote>
<p><strong>조건</strong></p>
</blockquote>
<p><strong>1.</strong> 홀 수 번째만 출력
<strong>2.</strong> 값이 50이하인 것만 출력</p>
<h3 id="q2-업그레이드-가위-바위-보">Q2. 업그레이드 가위 바위 보</h3>
<blockquote>
<p><strong>조건</strong>
<strong>1.</strong> 게임 진행 횟수 입력 받기
<strong>2.</strong> 0, 1, 2, &quot;가위&quot;, &quot;바위&quot;, &quot;보&quot; 이외에 입력시 재입력 받기
<strong>3.</strong> 게임종료 후 나와 컴퓨터의 총 전적 출력하기</p>
</blockquote>
<h3 id="q3-숫자-사이-짝수만-출력-중앙값도">Q3. 숫자 사이 짝수만 출력 (중앙값도)</h3>
<p>단, 중앙값이 짝수가 아닐 경우에는 중앙값은 출력을 하지 않고 짝수인 수만 출력</p>
<h3 id="q4-특정-범위-내-소수-찾기">Q4. 특정 범위 내 소수 찾기</h3>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PY4E 2023] week_2]]></title>
            <link>https://velog.io/@jjang_naa/PY4E-2023-week2</link>
            <guid>https://velog.io/@jjang_naa/PY4E-2023-week2</guid>
            <pubDate>Fri, 04 Aug 2023 02:27:31 GMT</pubDate>
            <description><![CDATA[<h1 id="2주차-학습-커리큘럼">2주차 학습 커리큘럼</h1>
<p>👉 <strong>조건문 실행과 함수</strong> ✨</p>
<p>👀 <a href="https://colab.research.google.com/drive/1tdU3ULfn0HysXmbSfA6bwZM349oOU9Rk?usp=sharing">코드 보러가기 (colab)</a></p>
<hr>
<h3 id="q1-학점-변환기">Q1. 학점 변환기</h3>
<blockquote>
<p><strong>조건</strong></p>
</blockquote>
<table>
<thead>
<tr>
<th>A+</th>
<th>A</th>
<th>B+</th>
<th>B</th>
<th>C+</th>
<th>C</th>
<th>D+</th>
<th>D</th>
<th>F</th>
</tr>
</thead>
<tbody><tr>
<td>95~100점</td>
<td>90~94점</td>
<td>85~89점</td>
<td>80~84점</td>
<td>75~79점</td>
<td>70~74점</td>
<td>65~69점</td>
<td>60~64점</td>
<td>60점 미만</td>
</tr>
</tbody></table>
<h3 id="q2-연봉-계산">Q2. 연봉 계산</h3>
<blockquote>
<p><strong>조건</strong></p>
</blockquote>
<table>
<thead>
<tr>
<th>1200만원 이하</th>
<th>4600만원 이하</th>
<th>8800만원 이하</th>
<th>1억 5천만원 이하</th>
<th>3억원 이하</th>
<th>5억원 이하</th>
<th>5억원 초과</th>
</tr>
</thead>
<tbody><tr>
<td>6%</td>
<td>15%</td>
<td>24%</td>
<td>35%</td>
<td>38%</td>
<td>40%</td>
<td>42%</td>
</tr>
</tbody></table>
<h3 id="q3-버스요금-계산기">Q3. 버스요금 계산기</h3>
<table>
<thead>
<tr>
<th>구분(연령, 카드/현금)</th>
<th>카드</th>
<th>현금</th>
</tr>
</thead>
<tbody><tr>
<td>8세 미만</td>
<td>무료</td>
<td>무료</td>
</tr>
<tr>
<td>8세 이상 - 14세 미만</td>
<td>450원</td>
<td>450원</td>
</tr>
<tr>
<td>14세 이상 - 20세 미만</td>
<td>750원</td>
<td>1000원</td>
</tr>
<tr>
<td>20세 이상</td>
<td>1200원</td>
<td>1300원</td>
</tr>
<tr>
<td>75세 이상</td>
<td>무료</td>
<td>무료</td>
</tr>
</tbody></table>
<h3 id="q4-가위-바위-보">Q4. 가위 바위 보</h3>
<blockquote>
<p><strong>조건</strong></p>
</blockquote>
<p><strong>1.</strong> 0, 1 ,2 혹은 &quot;가위&quot;, &quot;바위&quot;, &quot;보&quot; (총 6가지 방법)
<strong>2.</strong> 누가 무엇을 냈고, 누가 승리 했는지 출력</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PY4E 2023] week_1]]></title>
            <link>https://velog.io/@jjang_naa/PY4E-2023-week1</link>
            <guid>https://velog.io/@jjang_naa/PY4E-2023-week1</guid>
            <pubDate>Fri, 04 Aug 2023 02:26:18 GMT</pubDate>
            <description><![CDATA[<h1 id="1주차-학습-커리큘럼">1주차 학습 커리큘럼</h1>
<p>👉 <strong>변수 표현식 및 코드</strong> ✨</p>
<p>👀 <a href="https://colab.research.google.com/drive/1AvjhhK4CyL1_cEJdSTLzMqRTcDFUpOl0?usp=drive_link">코드 보러가기 (colab)</a></p>
<hr>
<h3 id="q3-error-message-이해">Q3. Error Message 이해</h3>
<p>: Error를 발생 코드 및 Debugging 코드 만들기</p>
<h3 id="q4-법-개정-전-한국-나이를-미국-나이로-변환">Q4. 법 개정 전 한국 나이를 미국 나이로 변환</h3>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[결론] 결론 도출]]></title>
            <link>https://velog.io/@jjang_naa/RminiProject2foot</link>
            <guid>https://velog.io/@jjang_naa/RminiProject2foot</guid>
            <pubDate>Wed, 10 May 2023 01:16:47 GMT</pubDate>
            <description><![CDATA[<p>　분석 목적을 설정하고, 그에 맞는 분석 방법을 선택하여 모델을 생성한 후 모델을 다듬는 과정을 통해 많은 양의 데이터가 필요하다는 것을 느꼈습니다.</p>
<p>　또한, 데이터 분석시 종속변수와 유의미하다고 보이지 않던 변수들이 예측 및 평가시 영향을 미치는 경우도 있었고 그 반대의 경우도 있었습니다. 이는 독립변수들 간의 영향을 미치는 경우 등 다양한 요인으로 인한 것으로 분석가의 재량이 필요한 부분이 많았습니다. </p>
<p>　따라서 모델을 만들 때에는 각 변수들 간의 관계 및 해당 데이터에 대한 이해도가 필요하며 분석 목적을 잊어서는 안됩니다.</p>
<hr>
<div>
<span style="color: #d7d7d7"> ~~ TMI !!! ~~ </span></br>
<span style="color: #cfcfcf">
　지치는 과제였습니다.. 팀원들과 이 과제를 진행할 때, 저는 시계열 분석을 맡아서 했고 나머지 다중회귀분석이나 로지스틱 회귀분석은 건들지 않았던지라.. 복기하는데 고생 좀 했습니다. 물론 시계열 분석에서도 그 때 당시에는 데이터 전처리하는 데 지쳐서 분석을 제대로 못했지만, 이번에는 분석 부분을 좀 보안 했습니다.</br>　다중회귀 분석과 로지스틱 회귀분석은 정말..^^ 처음부터 다시 배우는 느낌으로 복기했습니다.. 고생스러웠지만 그만큼 얻은게 많아 뿌듯합니다!</br>　다음 시리즈로는 '머신러닝 기반 데이터 분석'을 진행할 예정입니다. 집에 컴퓨터가 없는 관계로 해당 시리즈는 이번주 금요일 또는 다음주 월요일에 업로드할 생각이니 참고바랍니다</br>
</span> 
</div>]]></description>
        </item>
        <item>
            <title><![CDATA[[본론_3] 로지스틱 회귀분석]]></title>
            <link>https://velog.io/@jjang_naa/RminiProject2body3</link>
            <guid>https://velog.io/@jjang_naa/RminiProject2body3</guid>
            <pubDate>Wed, 10 May 2023 01:15:57 GMT</pubDate>
            <description><![CDATA[<p>　로지스틱 회귀분석이란?</p>
<p>　종속 변수가 이항적인 경우(두 개의 범주를 가지는 경우)에 사용되는 통계적 분석 방법으로 종속 변수와 독립 변수간의 관계를 모델링하고 독립 변수의 값에 따라 종속 변수가 속하는 범주를 예측하는 데 사용됩니다.</p>
<p>　분류 문제에 널리 활용되며 예측 모델의 해석이 상대적으로 용이하고 계산적으로 효율적입니다.</p>
<hr>
<h1 id="1-데이터-호출">1. 데이터 호출</h1>
<p>　- 사용 데이터: 내장 데이터 <strong>mtcars</strong></br>　- 분석 목적: mpg(연비)와 am(변속기종류)가 vs(엔진)에 미치는 영향 확인 및 평가</p>
<pre><code># 데이터셋 로드
data(mtcars)
help(mtcars)</code></pre><p>　<span style="color: #5b5e60">　▼ <strong>Console of help(mtcars)</strong> ▼</span></p>
<blockquote>
</blockquote>
<p>Format
A data frame with 32 observations on 11 (numeric) variables.    # 32개의 관측치와 11개의 변수로 구성
[, 1]    <strong>mpg    Miles/(US) gallon</strong>        # 연비
[, 2]    cyl    Number of cylinders
[, 3]    disp    Displacement (cu.in.)
[, 4]    hp    Gross horsepower
[, 5]    drat    Rear axle ratio
[, 6]    wt    Weight (1000 lbs)
[, 7]    qsec    1/4 mile time
[, 8]    <strong>vs    Engine (0 = V-shaped, 1 = straight)</strong>    # 0: V-Shaped 엔진, 1: straight 엔진
[, 9]    <strong>am    Transmission (0 = automatic, 1 = manual)</strong>    # 0: 오토, 1: 스틱
[,10]    gear    Number of forward gears
[,11]    carb    Number of carburetors</p>
</br>

<h1 id="2-로지스틱-회귀분석">2. 로지스틱 회귀분석</h1>
<h2 id="1-데이터-분리">1) 데이터 분리</h2>
<p>　모델 생성 전 훈련 및 검증, 테스트용으로 데이터를 분리해 주어야 합니다. 일반적으로 훈련 및 테스트 데이터를 7:3 or 8:2로 분리한 후 훈련 데이터를 훈련 및 검증 데이터로 나눕니다(7:3 or 8:2). 하지만 앞서 살펴본 바와 같이 사용할 데이터의 관측치는 32개로 굉장히 적은 양이고 분석 목적을 생각했을 때 2개의 독립변수만 사용할 예정이므로 검증 데이터 없이 <strong>훈련 및 테스트 데이터를 8:2</strong>로 나누어 줍니다.</p>
<pre><code class="language-R"># 데이터 분할
trIdx &lt;- sample(1:nrow(mtcars), 0.8 * nrow(mtcars))
mtcTr &lt;- mtcars[trIdx, ]    # 25
mtcTe &lt;- mtcars[-trIdx, ]    # 7</code></pre>
<h2 id="2-모델-생성">2) 모델 생성</h2>
<p>　- <strong>glm()</strong>: R에서 일반화 선형 모델을 생성하기 위해 사용되는 함수로 선형 회귀 뿐만 아니라 옵션을 조정하여 로지스틱 회귀 등 다양한 종류의 선형 모델을 만듦</p>
<pre><code># 로지스틱 회귀분석을 하기 위해 family 옵션을 binomial로 설정
glmModel &lt;- glm(vs ~ mpg + am, data = mtcTr, family = binomial)

# 결과 요약
summary(glmModel)</code></pre><p>　<span style="color: #5b5e60">　▼ <strong>Console of summary(mtcTr)</strong> ▼</span></p>
<blockquote>
</blockquote>
<p>Call:
glm(formula = vs ~ mpg + am, family = binomial, data = mtcars)</p>
<blockquote>
</blockquote>
<p>Deviance Residuals:</p>
<blockquote>
</blockquote>
<p>　Min　　　1Q　　　Median　　　3Q　　　Max<br>-2.0585 　-0.5189　　-0.2513　　0.3307　　1.6887</p>
<blockquote>
</blockquote>
<p>Coefficients:</p>
<blockquote>
</blockquote>
<p>　　　　　　<strong>Estimate</strong>　　Std. Error　　z value　　Pr(&gt;|z|)<br>(Intercept)　 -12.5235　　　5.1727　　-2.421　　 0.0155 *
mpg　　　　 0.6830　　　 0.2927　　 2.333　　 0.0196 *
am　　　　　-3.2436　　　1.8636　　-1.740　　 0.0818 . 
---
Signif. codes:　0 ‘***’　0.001　‘**’　0.01　‘*’ 0.05　‘.’ 0.1　‘ ’ 1</p>
<blockquote>
</blockquote>
<p>(Dispersion parameter for binomial family taken to be 1)</p>
<blockquote>
</blockquote>
<p>　　Null deviance: 33.651  on 24  degrees of freedom
Residual deviance: 18.333  on 22  degrees of freedom
AIC: 24.333</p>
<blockquote>
</blockquote>
<p>Number of Fisher Scoring iterations: 6</p>
<blockquote>
</blockquote>
<hr>
<blockquote>
</blockquote>
<p><span style="color: #6a7076"><strong>※ 참고 ※</strong></span>
<span style="color: #6a7076">　로지스틱 회귀분석에서의 Estimate는 로즈 오그 라는 것을 나타냅니다. 이는 종속 변수의 변화를 설명하기 위한 것으로, 해석하기 위해서는 지수함수인 오즈비를 계산해주어야 합니다. 오즈비는 독립변수의 값이 1단위 증가할 때의 확률를 의미합니다.</span></p>
<blockquote>
</blockquote>
<p><span style="color: #6a7076">　위 기술 통계랑을 예로 들자면, am(변속기종류)의 로즈 오그는 -3.2436으로 am이 1단위가 증가할 때마다 로즈 오그는 3.2436만큼 감소한다는 뜻입니다. 이를 지수함수로 변환하여 해석하면, am이 1단위 증가할 때 vs(엔진)이 0이 될 확률이 1이 될 확률 보다 약 0.038배 낮다고 할 수 있습니다. 즉, am이 1일 때 vs가 1일 확률이 높다는 것입니다.</span></p>
<blockquote>
</blockquote>
<p><span style="color: #6a7076">* 로그 오즈(Log Odds): 어떤 사건이 발생할 확률과 발생하지 않을 확률의 비율을 로그로 취한 값</br>* 로그 오즈비(Log Odds Ratio): 로그 오즈의 차이를 나타내는 개념, 지수함수 변환 필요(exp 함수사용)</span></p>
<h2 id="2-기술통계량-해석">2) 기술통계량 해석</h2>
<p>　mpg(연비) 단위가 증가하게 되면 vs(엔진)이 0이 될 확률이 증가하고, am(변속기종류) 단위가 증가하게 되면 vs(엔진)이 0이 될 확률이 감소합니다. </p>
<p>　또한, Null deviance(귀무편차)의 값보다 Residual deviance(잔차편차)값이 상대적으로 낮고 알고리즘 반복회수가 6으로 모델이 빠른 속도로 최적화 되었으며 절편에서의 p-value가 유의수준보다 낮은 것 등을 살펴보았을 때 대체적으로 유의미한 모델이라고 판단 됩니다.</p>
<p>　비록 각 독립변수에 대한 p-value가 유의수준 보다 높지만, 분석 목적에 필요한 독립변수이므로 일단 제외하지 않고 진행 합니다.</p>
<blockquote>
</blockquote>
<p><span style="color: #6a7076"><strong>※ 참고 ※</strong></span></p>
<blockquote>
</blockquote>
<p><span style="color: #6a7076">- <strong>Null deviance(귀무편차)</strong>: 모든 독립변수를 사용하지 않고 종속변수의 평균값만 사용하여 예측하는 모델로 종속 변수의 변동성을 나타내며 낮을 수록 좋음</br>- <strong>Residual deviance(잔차편차)</strong>: 모델이 예측한 값과 실제 관측값 간의 차이의 편차를 나타내는 것으로 모델이 데이터에 적합한 정도를 뜻하며 낮을 수록 좋음</br><strong>=&gt;</strong> 잔차편차의 값이 귀무편차에 비해 상대적으로 <strong>작다면</strong> 모델의 성능이 <strong>높다</strong>는 의미로 로지스틱 회귀분석에서 모델의 적합도를 평가하기 위해 사용되는 통계량임</span></p>
<blockquote>
</blockquote>
<p><span style="color: #6a7076">- <strong>Number of Fisher Scoring iterations</strong>: Fisher Scoring 알고리즘이 반복적인 과정을 통해 모델의 매개변수를 조정하여 모델의 우도를 최대화 하는 값을 찾는 과정의 반복 횟수를 나타냄</br>　└ 일반적으로 반복 횟수가 많다면 모델은 더욱 정교하게 적합되지만 수렴하는 데 시간이 오래 걸릴 수 있는데 이는 모델 적합의 속도와 정확도 사이의 절충점을 나타내는 것</br>　└ <strong>Fisher Scoring</strong>: 로지스틱 회귀모델의 최적화 알고리즘 중 하나로 likelihood(최대우도) 추정을 수행 </br>　└ <strong>likelihood 추정</strong>: 모델의 매개변수(회귀계수)를 데이터에 가장 잘 적합한 값을 찾는 과정</span></p>
<blockquote>
</blockquote>
<p><span style="color: #6a7076">- <strong>Dispersion parameter</strong> for <strong>binomial</strong> family taken to be <strong>1</strong>: 로지스틱 회귀분석에서 사용된 확률 분포인 &#39;binomial&#39;에서의 분산 파라미터(dispersion parameter)를 1로 설정했다는 것을 의미하는 것으로 이는 로지스틱 회귀분석에서는 일반적임</span></p>
</br>

<h1 id="3-예측-및-평가">3. 예측 및 평가</h1>
<h2 id="1-예측하기">1) 예측하기</h2>
<p>　모델 생성 전 분리 해주었던 테스트 데이터를 사용하여 예측합니다. 종속변수가 0 아니면 1 이라는 이항적인 성격이므로, 0.5를 기준으로 작으면 0, 아니면 1 로 예측 값을 설정해줍니다.</p>
<pre><code class="language-R"># 모델을 적용하여 예측 수행
moPred &lt;- ifelse(predict(glmModel, newdata = mtcTe, type = &quot;response&quot;) &gt;= 0.5, 1, 0)

# 예측 결과 확인
moRes &lt;- data.frame(mpg = mtcTe$mpg, am = mtcTe$am, predVs = moPred, trueVs = mtcTe$vs)</code></pre>
<p>　<span style="color: #5b5e60">　▼ <strong>Console</strong> ▼</span></p>
<table>
<thead>
<tr>
<th></th>
<th>predVs</th>
<th>trueVs</th>
</tr>
</thead>
<tbody><tr>
<td></br>　Hornet 4 Drive</td>
<td></br>　　　1</td>
<td></br>　　　1</td>
</tr>
<tr>
<td><span style="color: #cfcfcf">──────────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
</tr>
<tr>
<td>Merc 230</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td><span style="color: #cfcfcf">──────────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
</tr>
<tr>
<td>Cadillac Fleetwood</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td><span style="color: #cfcfcf">──────────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
</tr>
<tr>
<td>Lincoln Continental</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td><span style="color: #cfcfcf">──────────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
</tr>
<tr>
<td>Fiat 128</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td><span style="color: #cfcfcf">──────────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
</tr>
<tr>
<td>Honda Civic</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td><span style="color: #cfcfcf">──────────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
<td><span style="color: #cfcfcf">───────</span></td>
</tr>
<tr>
<td>Pontiac Firebird　</br></br></td>
<td><strong>1</strong>　</br></br></td>
<td><strong>0</strong>　</br></br></td>
</tr>
</tbody></table>
<p>&gt; 7개의 테스트 데이터 중 1개의 예측이 틀렸습니다.</p>
<h2 id="2-변수-간-관계-확인">2) 변수 간 관계 확인</h2>
<p>　기술 통계 분석 시 Estimate의 값을 통해 예측 했던 변수 간의 관계를 시각화 하여 한번에 파악할 수 있게 시각화 하겠습니다.</p>
<pre><code class="language-R"># mpg와 vs의 관계 &amp; 예측값과 관측값
ggplot(moRes, aes(x = mpg)) +
  geom_point(aes(y = predVs, color = &quot;Predicted&quot;), size = 3) +
  geom_point(aes(y = trueVs, color = &quot;Observed&quot;), size = 3) +
  geom_line(aes(y = predVs, color = &quot;Predicted&quot;), size = 1) +
  geom_line(aes(y = trueVs, color = &quot;Observed&quot;), size = 1, linetype = &quot;dashed&quot;) +
  labs(x = &quot;mpg&quot;, y = &quot;vs&quot;, color = &quot;Value&quot;) +
  scale_color_manual(values = c(&quot;Predicted&quot; = &quot;blue&quot;, &quot;Observed&quot; = &quot;red&quot;)) +
  theme_minimal() + 
  coord_flip()

# am과 vs의 관계 &amp; 예측값과 관측값 는 mpg의 것과 동일하므로 생략합니다.</code></pre>
<h3 id="1-독립변수-mpg--종속변수-vs">(1) 독립변수 mpg &amp; 종속변수 vs</h3>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/6aa04e7f-4f35-4e4a-84b4-645ffb872007/image.png" alt="독립변수 mpg와 종속변수 vs의 관계 및 예측값과 관측값"></p>
<p>　예측값된 값들이 표현된 파란색과 관측값들이 표현된 빨간색이 유사한 경향을 보이고 있습니다. 이는 모델이 mpg 값을 잘 활용하여 vs 값을 예측하고 있다는 뜻입니다. 또한 mpg가 증가할 수록 vs가 0에서 1로 바뀌는 것을 알 수 있습니다.</p>
<p>　두 변수의 관계를 통해 알 수 있는 사실은 연비(mpg)가 높으면 straight Engine(vs 값 1)일 것이고, 연비가 낮으면 V-shaped Engine(vs 값 0)이라는 것 입니다.</p>
<h3 id="2-독립변수-am--종속변수-vs">(2) 독립변수 am &amp; 종속변수 vs</h3>
<h4 id="①-테스트-데이터">① 테스트 데이터</h4>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/186940ee-b8dd-4e2e-a050-47c3329793de/image.png" alt="독립변수 am과 종속변수 vs의 관계 및 예측값과 관측값"></p>
<p>　예측값된 값들이 표현된 파란색과 관측값들이 표현된 빨간색이 유사한 경향을 보이고 있습니다. 이는 모델이 am 값을 잘 활용하여 vs 값을 예측하고 있다는 뜻입니다. 하지만 am의 값이 0일 때 vs 값이 0일 때도 있는 것을 보았을 때, am이 vs한테 미치는 영향이 미미한 것으로 보입니다.</p>
<p>　추가로 전체 데이터를 대상으로 하여 동일한 과정을 통해 그래프를 만들겠습니다.</p>
<h4 id="②-전체-데이터">② 전체 데이터</h4>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/0a02ff6c-e6ca-4f51-809e-f0fb2058147e/image.png" alt="전체 데이터에서의 am과 vs 관계 확인"></p>
<p>　얼핏보면 ①의 결과와 반대인 것처럼 보이지만 비슷한 경향을 띄고 있습니다. 자세히 살펴보면 관측 값(빨간색)들의 경우 am이 0일 때 vs가 0과 1 모두 존재하고(am 1일 때도 마찬가지) 예측 값(파란색)들의 경우 음의 선형 관계를 보여주는 데 이는 모델이 am과 vs의 관계를 보는 방식을 알려줍니다.</p>
<p>　예측 값과 관측 값은 서로 일치하는 경향을 보이지만, vs에게 am이 미치는 영향은 작거나 없다는 것을 알 수 있습니다.</p>
<h2 id="3-모델-평가">3) 모델 평가</h2>
<p>　이진 분류 모델의 성능을 평가하고 비교하는 데 주로 사용하는 <strong>ROC 그래프</strong>를 사용하여 시각화 합니다. ROC 그래프는 모델의 성능을 종합적으로 평가하는 데 사용되며 AUC(Area Under the Curve)를 계산하여 수치로 평가할 수 있습니다.</p>
<p>　<strong>AUC</strong>는 ROC 곡선 아래의 면적을 계산한 값으로 0부터 1까지의 범위를 가지며, 0.5보다 크고 1에 가까워질수록 모델의 성능이 좋다고 판단할 수 있습니다.</br>　└ <strong>AUC &lt; 0.5</strong>: 무작위 예측보다 성능이 나쁨</br>　└ <strong>AUC 0.5에 가까움</strong>: 모델의 성능이 무작위 수준에 가까움</br>　└ <strong>AUC 1에 가까움</strong>: 모델의 성능이 좋음</p>
<blockquote>
</blockquote>
<p>　<span style="color: #6a7076"><strong>※ 참고 ※</strong></span></p>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th></th>
<th>양성(예측)</th>
<th>음성(예측)</th>
</tr>
</thead>
<tbody><tr>
<td></br>　<strong>양성(실제)</strong></td>
<td></br>　<strong>TP</strong>(True Positive)</td>
<td></br>　<strong>FN</strong>(False Negative)</td>
</tr>
<tr>
<td><span style="color: #cfcfcf">──────</span></td>
<td><span style="color: #cfcfcf">─────────</span></td>
<td><span style="color: #cfcfcf">──────────</span></td>
</tr>
<tr>
<td><strong>음성(실제)</strong></br></br></td>
<td><strong>FP</strong>(False Positive)</br></br></td>
<td><strong>TN</strong>(True Negative)</br></br></td>
</tr>
<tr>
<td>&gt; <span style="color: #6a7076">FP은 1종 오류(TypeⅠError), FN은 2종 오류(TypeⅡError) 라고도 불림</span></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<blockquote>
</blockquote>
<hr>
<blockquote>
</blockquote>
<p><span style="color: #6a7076">- ROC 곡선은 모델의 예측 결과를 다양한 값으로 조정하면서 진짜 양성 비율(TPR)과 가짜 양성 비율(FPR) 사이의 관계를 표현</br>　⇒ TPR(True Positive Rate): 실제 양성 중 정확하게 예측한 비율, 예측 양성 → 실제 양성 (called 민감도 or 재현율)</br>　⇒ 민감도(Sensitivity): 예측 양성 → 실제 양성 비율</br>　⇒ FPR(False Positive Rate): 실제 음성 중 잘못 예측한 비율 (가짜 양성 비율), 예측 양성 → 실제 음성</br>　⇒ 특이도(Specificity): 예측 음성 → 실제 음성 비율, 1-특이도=FPR</span></p>
<pre><code class="language-R">library(pROC)

# ROC 그래프를 위해 mtcRes 타입 변환
mtcRoc &lt;- roc(mtcRes$observed, mtcRes$predictions)

# ROC 그래프
plot(mtcRoc, main = &quot;ROC Curve&quot;, xlab = &quot;FPR&quot;, ylab = &quot;TPR&quot;, xlim = c(1, 0), ylim = c(0, 1))

# 대각선 기준선 추가
abline(a = 0, b = 1, lty = 2)

# AUC 계산
legend(&quot;bottomright&quot;, paste(&quot;AUC =&quot;, round(auc(mtcRoc), 2)))</code></pre>
<p><img src="https://velog.velcdn.com/images/jjang_naa/post/73ff7217-40cd-45d3-846e-a39a2a8a9a8b/image.png" alt="mtcars 데이터의 로지스틱 회귀분석, mpg ~ am + vs">
　좌측상단으로 갈수록 성능이 우수한 모델임을 나타내는데, 해당 그래프를 보았을 때 ROC 곡선이 좌측 상단에 위치해 있으며, AUC 또한 0.83으로 적은 데이터 대비 높은 성능을 보여주고 있습니다.</p>
<h1 id="4-해석">4. 해석</h1>
<p>　모델의 기술 통계량 분석했을 때 각 독립변수의 p-value 값이 유의수준보다 높아 높은 성능을 기대하기 어려웠지만 해당 독립변수들은 분석 목적에 꼭 필요한 것이었고, 모델 자체(전체)에 대한 p-value 값은 낮은 것 등 다른 요인을 고려하여 그대로 진행하였습니다.</p>
<p>　변수 간 관계 확인 및 모델 평가를 통해 얻은 사실은 모델 자체의 성능은 좋은 편이나, 독립변수 am(변속기 종류)는 종속변수 vs(엔진)에 유의미한 영향이 미친다고 할 수 없다는 것입니다. 이는 예측값이 mpg(연비)의 영향으로 나왔다고 할 수도 있습니다.</p>
<p>　하지만 본 과정에서 사용한 데이터의 크기 자체가 굉장히 작았기 때문에 이 결과를 일반화하기에는 무리가 있습니다. 따라서, 데이터의 양이 작을 때에는 결과 보단 과정에 집중하는 것이 추후 빅데이터를 다룰 때 신중하고 옳은 판단을 할 수 있습니다.</p>
<p>　</p>
]]></description>
        </item>
    </channel>
</rss>